|  | <!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/webcomponents-lite.min.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> |