/**
 * @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('pre format 5', () => {
    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', ' \nB');
  });

  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');
  });
});

