blob: fd5a9ba52b59356cb9094aef09aabb24dd41db40 [file] [log] [blame]
/**
* @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');
});
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);
});
});