/** * @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 \n S\n\nB'; const result = element._computeBlocks(comment); assert.lengthOf(result, 3); assertBlock(result, 0, 'paragraph', 'A'); assertBlock(result, 1, 'pre', ' Q\n \n S'); assertBlock(result, 2, 'paragraph', 'B'); }); test('pre format 4', () => { const comment = ' Q\n \n S\n\nB'; const result = element._computeBlocks(comment); assert.lengthOf(result, 2); assertBlock(result, 0, 'pre', ' Q\n \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'); }); test('_computeNodes called without config', () => { const computeNodesSpy = sinon.spy(element, '_computeNodes'); element.content = 'some text'; assert.isTrue(computeNodesSpy.called); }); test('_contentOrConfigChanged called with config', () => { const contentStub = sinon.stub(element, '_contentChanged'); const contentConfigStub = sinon.stub(element, '_contentOrConfigChanged'); element.content = 'some text'; element.config = {}; assert.isTrue(contentStub.called); assert.isTrue(contentConfigStub.called); }); });