/**
 * @license
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import '../../../test/common-test-setup-karma.js';
import './gr-formatted-text.js';

const basicFixture = fixtureFromElement('gr-formatted-text');

suite('gr-formatted-text tests', () => {
  let element;

  function assertBlock(result, index, type, text) {
    assert.equal(result[index].type, type);
    assert.equal(result[index].text, text);
  }

  function assertListBlock(result, resultIndex, itemIndex, text) {
    assert.equal(result[resultIndex].type, 'list');
    assert.equal(result[resultIndex].items[itemIndex], text);
  }

  setup(() => {
    element = basicFixture.instantiate();
  });

  test('parse null undefined and empty', () => {
    assert.lengthOf(element._computeBlocks(null), 0);
    assert.lengthOf(element._computeBlocks(undefined), 0);
    assert.lengthOf(element._computeBlocks(''), 0);
  });

  test('parse simple', () => {
    const comment = 'Para1';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertBlock(result, 0, 'paragraph', comment);
  });

  test('parse multiline para', () => {
    const comment = 'Para 1\nStill para 1';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertBlock(result, 0, 'paragraph', comment);
  });

  test('parse para break without special blocks', () => {
    const comment = 'Para 1\n\nPara 2\n\nPara 3';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertBlock(result, 0, 'paragraph', comment);
  });

  test('parse quote', () => {
    const comment = '> Quote text';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assert.equal(result[0].type, 'quote');
    assert.lengthOf(result[0].blocks, 1);
    assertBlock(result[0].blocks, 0, 'paragraph', 'Quote text');
  });

  test('parse quote lead space', () => {
    const comment = ' > Quote text';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assert.equal(result[0].type, 'quote');
    assert.lengthOf(result[0].blocks, 1);
    assertBlock(result[0].blocks, 0, 'paragraph', 'Quote text');
  });

  test('parse multiline quote', () => {
    const comment = '> Quote line 1\n> Quote line 2\n > Quote line 3\n';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assert.equal(result[0].type, 'quote');
    assert.lengthOf(result[0].blocks, 1);
    assertBlock(result[0].blocks, 0, 'paragraph',
        'Quote line 1\nQuote line 2\nQuote line 3');
  });

  test('parse pre', () => {
    const comment = '    Four space indent.';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertBlock(result, 0, 'pre', comment);
  });

  test('parse one space pre', () => {
    const comment = ' One space indent.\n Another line.';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertBlock(result, 0, 'pre', comment);
  });

  test('parse tab pre', () => {
    const comment = '\tOne tab indent.\n\tAnother line.\n  Yet another!';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertBlock(result, 0, 'pre', comment);
  });

  test('parse star list', () => {
    const comment = '* Item 1\n* Item 2\n* Item 3';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertListBlock(result, 0, 0, 'Item 1');
    assertListBlock(result, 0, 1, 'Item 2');
    assertListBlock(result, 0, 2, 'Item 3');
  });

  test('parse dash list', () => {
    const comment = '- Item 1\n- Item 2\n- Item 3';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertListBlock(result, 0, 0, 'Item 1');
    assertListBlock(result, 0, 1, 'Item 2');
    assertListBlock(result, 0, 2, 'Item 3');
  });

  test('parse mixed list', () => {
    const comment = '- Item 1\n* Item 2\n- Item 3\n* Item 4';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assertListBlock(result, 0, 0, 'Item 1');
    assertListBlock(result, 0, 1, 'Item 2');
    assertListBlock(result, 0, 2, 'Item 3');
    assertListBlock(result, 0, 3, 'Item 4');
  });

  test('parse mixed block types', () => {
    const comment = 'Paragraph\nacross\na\nfew\nlines.' +
        '\n\n' +
        '> Quote\n> across\n> not many lines.' +
        '\n\n' +
        'Another paragraph' +
        '\n\n' +
        '* Series\n* of\n* list\n* items' +
        '\n\n' +
        'Yet another paragraph' +
        '\n\n' +
        '\tPreformatted text.' +
        '\n\n' +
        'Parting words.';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 7);
    assertBlock(result, 0, 'paragraph', 'Paragraph\nacross\na\nfew\nlines.\n');

    assert.equal(result[1].type, 'quote');
    assert.lengthOf(result[1].blocks, 1);
    assertBlock(result[1].blocks, 0, 'paragraph',
        'Quote\nacross\nnot many lines.');

    assertBlock(result, 2, 'paragraph', 'Another paragraph\n');
    assertListBlock(result, 3, 0, 'Series');
    assertListBlock(result, 3, 1, 'of');
    assertListBlock(result, 3, 2, 'list');
    assertListBlock(result, 3, 3, 'items');
    assertBlock(result, 4, 'paragraph', 'Yet another paragraph\n');
    assertBlock(result, 5, 'pre', '\tPreformatted text.');
    assertBlock(result, 6, 'paragraph', 'Parting words.');
  });

  test('bullet list 1', () => {
    const comment = 'A\n\n* line 1\n* 2nd line';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertBlock(result, 0, 'paragraph', 'A\n');
    assertListBlock(result, 1, 0, 'line 1');
    assertListBlock(result, 1, 1, '2nd line');
  });

  test('bullet list 2', () => {
    const comment = 'A\n* line 1\n* 2nd line\n\nB';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 3);
    assertBlock(result, 0, 'paragraph', 'A');
    assertListBlock(result, 1, 0, 'line 1');
    assertListBlock(result, 1, 1, '2nd line');
    assertBlock(result, 2, 'paragraph', 'B');
  });

  test('bullet list 3', () => {
    const comment = '* line 1\n* 2nd line\n\nB';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertListBlock(result, 0, 0, 'line 1');
    assertListBlock(result, 0, 1, '2nd line');
    assertBlock(result, 1, 'paragraph', 'B');
  });

  test('bullet list 4', () => {
    const comment = 'To see this bug, you have to:\n' +
        '* Be on IMAP or EAS (not on POP)\n' +
        '* Be very unlucky\n';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertBlock(result, 0, 'paragraph', 'To see this bug, you have to:');
    assertListBlock(result, 1, 0, 'Be on IMAP or EAS (not on POP)');
    assertListBlock(result, 1, 1, 'Be very unlucky');
  });

  test('bullet list 5', () => {
    const comment = 'To see this bug,\n' +
        'you have to:\n' +
        '* Be on IMAP or EAS (not on POP)\n' +
        '* Be very unlucky\n';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertBlock(result, 0, 'paragraph', 'To see this bug,\nyou have to:');
    assertListBlock(result, 1, 0, 'Be on IMAP or EAS (not on POP)');
    assertListBlock(result, 1, 1, 'Be very unlucky');
  });

  test('dash list 1', () => {
    const comment = 'A\n- line 1\n- 2nd line';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertBlock(result, 0, 'paragraph', 'A');
    assertListBlock(result, 1, 0, 'line 1');
    assertListBlock(result, 1, 1, '2nd line');
  });

  test('dash list 2', () => {
    const comment = 'A\n- line 1\n- 2nd line\n\nB';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 3);
    assertBlock(result, 0, 'paragraph', 'A');
    assertListBlock(result, 1, 0, 'line 1');
    assertListBlock(result, 1, 1, '2nd line');
    assertBlock(result, 2, 'paragraph', 'B');
  });

  test('dash list 3', () => {
    const comment = '- line 1\n- 2nd line\n\nB';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertListBlock(result, 0, 0, 'line 1');
    assertListBlock(result, 0, 1, '2nd line');
    assertBlock(result, 1, 'paragraph', 'B');
  });

  test('nested list will NOT be recognized', () => {
    // will be rendered as two separate lists
    const comment = '- line 1\n  - line with indentation\n- line 2';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 3);
    assertListBlock(result, 0, 0, 'line 1');
    assert.equal(result[1].type, 'pre');
    assertListBlock(result, 2, 0, 'line 2');
  });

  test('pre format 1', () => {
    const comment = 'A\n  This is pre\n  formatted';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertBlock(result, 0, 'paragraph', 'A');
    assertBlock(result, 1, 'pre', '  This is pre\n  formatted');
  });

  test('pre format 2', () => {
    const comment = 'A\n  This is pre\n  formatted\n\nbut this is not';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 3);
    assertBlock(result, 0, 'paragraph', 'A');
    assertBlock(result, 1, 'pre', '  This is pre\n  formatted');
    assertBlock(result, 2, 'paragraph', 'but this is not');
  });

  test('pre format 3', () => {
    const comment = 'A\n  Q\n    <R>\n  S\n\nB';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 3);
    assertBlock(result, 0, 'paragraph', 'A');
    assertBlock(result, 1, 'pre', '  Q\n    <R>\n  S');
    assertBlock(result, 2, 'paragraph', 'B');
  });

  test('pre format 4', () => {
    const comment = '  Q\n    <R>\n  S\n\nB';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assertBlock(result, 0, 'pre', '  Q\n    <R>\n  S');
    assertBlock(result, 1, 'paragraph', 'B');
  });

  test('quote 1', () => {
    const comment = '> I\'m happy\n > with quotes!\n\nSee above.';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assert.equal(result[0].type, 'quote');
    assert.lengthOf(result[0].blocks, 1);
    assertBlock(result[0].blocks, 0, 'paragraph', 'I\'m happy\nwith quotes!');
    assertBlock(result, 1, 'paragraph', 'See above.');
  });

  test('quote 2', () => {
    const comment = 'See this said:\n > a quoted\n > string block\n\nOK?';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 3);
    assertBlock(result, 0, 'paragraph', 'See this said:');
    assert.equal(result[1].type, 'quote');
    assert.lengthOf(result[1].blocks, 1);
    assertBlock(result[1].blocks, 0, 'paragraph', 'a quoted\nstring block');
    assertBlock(result, 2, 'paragraph', 'OK?');
  });

  test('nested quotes', () => {
    const comment = ' > > prior\n > \n > next\n';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assert.equal(result[0].type, 'quote');
    assert.lengthOf(result[0].blocks, 2);
    assert.equal(result[0].blocks[0].type, 'quote');
    assert.lengthOf(result[0].blocks[0].blocks, 1);
    assertBlock(result[0].blocks[0].blocks, 0, 'paragraph', 'prior');
    assertBlock(result[0].blocks, 1, 'paragraph', 'next');
  });

  test('code 1', () => {
    const comment = '```\n// test code\n```';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assert.equal(result[0].type, 'code');
    assert.equal(result[0].text, '// test code');
  });

  test('code 2', () => {
    const comment = 'test code\n```// test code```';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assert.equal(result[0].type, 'paragraph');
    assert.equal(result[0].text, 'test code');
    assert.equal(result[1].type, 'code');
    assert.equal(result[1].text, '// test code');
  });

  test('code 3', () => {
    const comment = 'test code\n```// test code```';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assert.equal(result[0].type, 'paragraph');
    assert.equal(result[0].text, 'test code');
    assert.equal(result[1].type, 'code');
    assert.equal(result[1].text, '// test code');
  });

  test('not a code', () => {
    const comment = 'test code\n```// test code';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 1);
    assert.equal(result[0].type, 'paragraph');
    assert.equal(result[0].text, 'test code\n```// test code');
  });

  test('not a code 2', () => {
    const comment = 'test code\n```\n// test code';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 2);
    assert.equal(result[0].type, 'paragraph');
    assert.equal(result[0].text, 'test code');
    assert.equal(result[1].type, 'paragraph');
    assert.equal(result[1].text, '```\n// test code');
  });

  test('mix all 1', () => {
    const comment = ' bullets:\n- bullet 1\n- bullet 2\n\ncode example:\n' +
      '```// test code```\n\n> reference is here';
    const result = element._computeBlocks(comment);
    assert.lengthOf(result, 5);
    assert.equal(result[0].type, 'pre');
    assert.equal(result[1].type, 'list');
    assert.equal(result[2].type, 'paragraph');
    assert.equal(result[3].type, 'code');
    assert.equal(result[4].type, 'quote');
  });
});

