<!DOCTYPE html>
<!--
@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.
-->

<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
<title>gr-editable-label</title>

<script src="/bower_components/webcomponentsjs/custom-elements-es5-adapter.js"></script>

<script src="/bower_components/webcomponentsjs/webcomponents-lite.js"></script>
<script src="/bower_components/web-component-tester/browser.js"></script>
<link rel="import" href="../../../test/common-test-setup.html"/>
<link rel="import" href="gr-formatted-text.html">

<script>void(0);</script>

<test-fixture id="basic">
  <template>
    <gr-formatted-text></gr-formatted-text>
  </template>
</test-fixture>

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

    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 = fixture('basic');
      sandbox = sinon.sandbox.create();
    });

    teardown(() => {
      sandbox.restore();
    });

    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', () => {
      const comment = 'Para 1\n\nPara 2\n\nPara 3';
      const result = element._computeBlocks(comment);
      assert.lengthOf(result, 3);
      assertBlock(result, 0, 'paragraph', 'Para 1');
      assertBlock(result, 1, 'paragraph', 'Para 2');
      assertBlock(result, 2, 'paragraph', 'Para 3');
    });

    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 excludes empty', () => {
      const comment = 'Para 1\n\n\n\nPara 2';
      const result = element._computeBlocks(comment);
      assert.lengthOf(result, 2);
      assertBlock(result, 0, 'paragraph', 'Para 1');
      assertBlock(result, 1, 'paragraph', 'Para 2');
    });

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

    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 intermediate leading whitespace pre', () => {
      const comment = 'No indent.\n\tNonzero indent.\nNo indent again.';
      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.');

      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');
      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');
      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');
      assertListBlock(result, 1, 0, 'line 1');
      assertListBlock(result, 1, 1, '2nd line');
    });

    test('bullet list 2', () => {
      const comment = 'A\n\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, you 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\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\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('pre format 1', () => {
      const comment = 'A\n\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\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\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\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\n');
    });

    test('getTextContent', () => {
      const comment = 'Paragraph\n\n  pre\n\n* List\n* Of\n* Items\n\n> Quote';
      element.content = comment;
      const result = element.getTextContent();
      const expected = 'Paragraph\n\n  pre\n\nList\nOf\nItems\n\nQuote';
      assert.equal(result, expected);
    });

    test('_computeNodes called without config', () => {
      const computeNodesSpy = sandbox.spy(element, '_computeNodes');
      element.content = 'some text';
      assert.isTrue(computeNodesSpy.called);
    });

    test('_contentOrConfigChanged called with config', () => {
      const contentStub = sandbox.stub(element, '_contentChanged');
      const contentConfigStub = sandbox.stub(element, '_contentOrConfigChanged');
      element.content = 'some text';
      element.config = {};
      assert.isTrue(contentStub.called);
      assert.isTrue(contentConfigStub.called);
    });
  });
</script>
