/* eslint-env mocha */ import 'babel-polyfill'; import assert from 'assert'; import './client.mocks.js'; import { original } from '../lib/parser/original/original'; import { filtered } from '../lib/parser/filtered/filtered'; import { Markdown } from '../lib/markdown'; import { escapeHTML } from '../../../lib/escapeHTML'; const wrapper = (text, tag) => `${ tag }${ text }${ tag }`; const boldWrapper = (text) => wrapper(`${ text }`, '*'); const italicWrapper = (text) => wrapper(`${ text }`, '_'); const strikeWrapper = (text) => wrapper(`${ text }`, '~'); const headerWrapper = (text, level) => `${ text }`; const quoteWrapper = (text) => `
>${ text }
`; const linkWrapped = (link, title) => `${ title }`; const inlinecodeWrapper = (text) => wrapper(`${ text }`, '`'); const codeWrapper = (text, lang) => `
\`\`\`
${ text }
\`\`\`
`; const bold = { '*Hello*': boldWrapper('Hello'), '**Hello**': boldWrapper('Hello'), '**Hello*': boldWrapper('Hello'), '*Hello**': boldWrapper('Hello'), Hello: 'Hello', '*Hello': '*Hello', 'Hello*': 'Hello*', 'He*llo': 'He*llo', '***Hello***': `*${ boldWrapper('Hello') }*`, '***Hello**': `*${ boldWrapper('Hello') }`, '*Hello* this is dog': `${ boldWrapper('Hello') } this is dog`, 'Rocket cat says *Hello*': `Rocket cat says ${ boldWrapper('Hello') }`, 'He said *Hello* to her': `He said ${ boldWrapper('Hello') } to her`, '**Hello** this is dog': `${ boldWrapper('Hello') } this is dog`, 'Rocket cat says **Hello**': `Rocket cat says ${ boldWrapper('Hello') }`, 'He said **Hello** to her': `He said ${ boldWrapper('Hello') } to her`, 'He was a**nn**oyed': `He was a${ boldWrapper('nn') }oyed`, 'There are two o in f*oo*tball': `There are two o in f${ boldWrapper('oo') }tball`, }; const italic = { _Hello_: italicWrapper('Hello'), __Hello__: italicWrapper('Hello'), __Hello_: italicWrapper('Hello'), _Hello__: italicWrapper('Hello'), Hello: 'Hello', _Hello: '_Hello', Hello_: 'Hello_', He_llo: 'He_llo', ___Hello___: '___Hello___', ___Hello__: '___Hello__', '_Hello_ this is dog': `${ italicWrapper('Hello') } this is dog`, 'Rocket cat says _Hello_': `Rocket cat says ${ italicWrapper('Hello') }`, 'He said _Hello_ to her': `He said ${ italicWrapper('Hello') } to her`, '__Hello__ this is dog': `${ italicWrapper('Hello') } this is dog`, 'Rocket cat says __Hello__': `Rocket cat says ${ italicWrapper('Hello') }`, 'He said __Hello__ to her': `He said ${ italicWrapper('Hello') } to her`, }; const strike = { '~Hello~': strikeWrapper('Hello'), '~~Hello~~': strikeWrapper('Hello'), '~~Hello~': strikeWrapper('Hello'), '~Hello~~': strikeWrapper('Hello'), Hello: 'Hello', '~Hello': '~Hello', 'Hello~': 'Hello~', 'He~llo': 'He~llo', '~~~Hello~~~': '~~~Hello~~~', '~~~Hello~~': '~~~Hello~~', '~Hello~ this is dog': `${ strikeWrapper('Hello') } this is dog`, 'Rocket cat says ~Hello~': `Rocket cat says ${ strikeWrapper('Hello') }`, 'He said ~Hello~ to her': `He said ${ strikeWrapper('Hello') } to her`, '~~Hello~~ this is dog': `${ strikeWrapper('Hello') } this is dog`, 'Rocket cat says ~~Hello~~': `Rocket cat says ${ strikeWrapper('Hello') }`, 'He said ~~Hello~~ to her': `He said ${ strikeWrapper('Hello') } to her`, }; const headersLevel1 = { '# Hello': headerWrapper('Hello', 1), '# Rocket.Cat': headerWrapper('Rocket.Cat', 1), '# Hi': headerWrapper('Hi', 1), '# Hello this is dog': headerWrapper('Hello this is dog', 1), '# Rocket cat says Hello': headerWrapper('Rocket cat says Hello', 1), '# He said Hello to her': headerWrapper('He said Hello to her', 1), '#Hello': '#Hello', '#Hello#': '#Hello#', 'He#llo': 'He#llo', }; const headersLevel2 = { '## Hello': headerWrapper('Hello', 2), '## Rocket.Cat': headerWrapper('Rocket.Cat', 2), '## Hi': headerWrapper('Hi', 2), '## Hello this is dog': headerWrapper('Hello this is dog', 2), '## Rocket cat says Hello': headerWrapper('Rocket cat says Hello', 2), '## He said Hello to her': headerWrapper('He said Hello to her', 2), '##Hello': '##Hello', '##Hello##': '##Hello##', 'He##llo': 'He##llo', }; const headersLevel3 = { '### Hello': headerWrapper('Hello', 3), '### Rocket.Cat': headerWrapper('Rocket.Cat', 3), '### Hi': headerWrapper('Hi', 3), '### Hello this is dog': headerWrapper('Hello this is dog', 3), '### Rocket cat says Hello': headerWrapper('Rocket cat says Hello', 3), '### He said Hello to her': headerWrapper('He said Hello to her', 3), '###Hello': '###Hello', '###Hello###': '###Hello###', 'He###llo': 'He###llo', }; const headersLevel4 = { '#### Hello': headerWrapper('Hello', 4), '#### Rocket.Cat': headerWrapper('Rocket.Cat', 4), '#### Hi': headerWrapper('Hi', 4), '#### Hello this is dog': headerWrapper('Hello this is dog', 4), '#### Rocket cat says Hello': headerWrapper('Rocket cat says Hello', 4), '#### He said Hello to her': headerWrapper('He said Hello to her', 4), '####Hello': '####Hello', '####Hello####': '####Hello####', 'He####llo': 'He####llo', }; const quote = { '>Hello': escapeHTML('>Hello'), '>Rocket.Cat': escapeHTML('>Rocket.Cat'), '>Hi': escapeHTML('>Hi'), '> Hello this is dog': escapeHTML('> Hello this is dog'), '> Rocket cat says Hello': escapeHTML('> Rocket cat says Hello'), '> He said Hello to her': escapeHTML('> He said Hello to her'), '> He said Hello to her ': escapeHTML('> He said Hello to her '), '<Hello': escapeHTML('<Hello'), '<Rocket.Cat>': escapeHTML('<Rocket.Cat>'), ' >Hi': escapeHTML(' >Hi'), 'Hello > this is dog': escapeHTML('Hello > this is dog'), 'Roc>ket cat says Hello': escapeHTML('Roc>ket cat says Hello'), 'He said Hello to her>': escapeHTML('He said Hello to her>'), '>Hello': quoteWrapper('Hello'), '>Rocket.Cat': quoteWrapper('Rocket.Cat'), '>Hi': quoteWrapper('Hi'), '> Hello this is dog': quoteWrapper(' Hello this is dog'), '> Rocket cat says Hello': quoteWrapper(' Rocket cat says Hello'), '> He said Hello to her': quoteWrapper(' He said Hello to her'), '': escapeHTML(''), ' >Hi': escapeHTML(' >Hi'), 'Hello > this is dog': escapeHTML('Hello > this is dog'), 'Roc>ket cat says Hello': escapeHTML('Roc>ket cat says Hello'), 'He said Hello to her>': escapeHTML('He said Hello to her>'), }; const link = { '<http://link|Text>': escapeHTML('<http://link|Text>'), '<https://open.rocket.chat/|Open Site For Rocket.Chat>': escapeHTML('<https://open.rocket.chat/|Open Site For Rocket.Chat>'), '<https://open.rocket.chat/ | Open Site For Rocket.Chat>': escapeHTML('<https://open.rocket.chat/ | Open Site For Rocket.Chat>'), '<https://rocket.chat/|Rocket.Chat Site>': escapeHTML('<https://rocket.chat/|Rocket.Chat Site>'), '<https://rocket.chat/docs/developer-guides/testing/#testing|Testing Entry on Rocket.Chat Docs Site>': escapeHTML('<https://rocket.chat/docs/developer-guides/testing/#testing|Testing Entry on Rocket.Chat Docs Site>'), '<http://linkText>': escapeHTML('<http://linkText>'), '<https:open.rocket.chat/ | Open Site For Rocket.Chat>': escapeHTML('<https:open.rocket.chat/ | Open Site For Rocket.Chat>'), 'https://open.rocket.chat/|Open Site For Rocket.Chat': escapeHTML('https://open.rocket.chat/|Open Site For Rocket.Chat'), '<www.open.rocket.chat/|Open Site For Rocket.Chat>': escapeHTML('<www.open.rocket.chat/|Open Site For Rocket.Chat>'), '<htps://rocket.chat/|Rocket.Chat Site>': escapeHTML('<htps://rocket.chat/|Rocket.Chat Site>'), '<ttps://rocket.chat/|Rocket.Chat Site>': escapeHTML('<ttps://rocket.chat/|Rocket.Chat Site>'), '<tps://rocket.chat/|Rocket.Chat Site>': escapeHTML('<tps://rocket.chat/|Rocket.Chat Site>'), '<open.rocket.chat/|Open Site For Rocket.Chat>': escapeHTML('<open.rocket.chat/|Open Site For Rocket.Chat>'), '<htts://rocket.chat/docs/developer-guides/testing/#testing|Testing Entry on Rocket.Chat Docs Site>': escapeHTML('<htts://rocket.chat/docs/developer-guides/testing/#testing|Testing Entry on Rocket.Chat Docs Site>'), '': escapeHTML(''), '': linkWrapped('http://link', 'Text'), '': linkWrapped('https://open.rocket.chat/', 'Open Site For Rocket.Chat'), '': linkWrapped('https://open.rocket.chat/ ', ' Open Site For Rocket.Chat'), '': linkWrapped('https://rocket.chat/', 'Rocket.Chat Site'), '': linkWrapped('https://rocket.chat/docs/developer-guides/testing/#testing', 'Testing Entry on Rocket.Chat Docs Site'), '': escapeHTML(''), '': escapeHTML(''), '': escapeHTML(''), '': escapeHTML(''), '': escapeHTML(''), '': escapeHTML(''), '': escapeHTML(''), '': escapeHTML(''), '[Text](http://invalid link)': '[Text](http://invalid link)', '[Text](http://link)': linkWrapped('http://link', 'Text'), '[Open Site For Rocket.Chat](https://open.rocket.chat/)': linkWrapped('https://open.rocket.chat/', 'Open Site For Rocket.Chat'), '[ Open Site For Rocket.Chat ](https://open.rocket.chat/)': linkWrapped('https://open.rocket.chat/', ' Open Site For Rocket.Chat '), '[Rocket.Chat Site](https://rocket.chat/)': linkWrapped('https://rocket.chat/', 'Rocket.Chat Site'), '[Testing Entry on Rocket.Chat Docs Site](https://rocket.chat/docs/developer-guides/testing/#testing)': linkWrapped('https://rocket.chat/docs/developer-guides/testing/#testing', 'Testing Entry on Rocket.Chat Docs Site'), '[](http://linkText)': '[](http://linkText)', '[text]': '[text]', '[Open Site For Rocket.Chat](https:open.rocket.chat/)': '[Open Site For Rocket.Chat](https:open.rocket.chat/)', '[Open Site For Rocket.Chat](www.open.rocket.chat/)': '[Open Site For Rocket.Chat](www.open.rocket.chat/)', '[Rocket.Chat Site](htps://rocket.chat/)': '[Rocket.Chat Site](htps://rocket.chat/)', '[Rocket.Chat Site](ttps://rocket.chat/)': '[Rocket.Chat Site](ttps://rocket.chat/)', '[Rocket.Chat Site](tps://rocket.chat/)': '[Rocket.Chat Site](tps://rocket.chat/)', '[Open Site For Rocket.Chat](open.rocket.chat/)': '[Open Site For Rocket.Chat](open.rocket.chat/)', '[Testing Entry on Rocket.Chat Docs Site](htts://rocket.chat/docs/developer-guides/testing/#testing)': '[Testing Entry on Rocket.Chat Docs Site](htts://rocket.chat/docs/developer-guides/testing/#testing)', '[Text](http://link?param1=1¶m2=2)': linkWrapped('http://link?param1=1¶m2=2', 'Text'), '[Testing Double parentheses](https://en.wikipedia.org/wiki/Disambiguation_(disambiguation))': linkWrapped('https://en.wikipedia.org/wiki/Disambiguation_(disambiguation)', 'Testing Double parentheses'), '[Testing data after Double parentheses](https://en.wikipedia.org/wiki/Disambiguation_(disambiguation)/blabla/bla)': linkWrapped('https://en.wikipedia.org/wiki/Disambiguation_(disambiguation)/blabla/bla', 'Testing data after Double parentheses'), }; Object.entries(link).forEach(([key, value]) => { link[`before (test) ${ key } after (test)`] = `before (test) ${ value } after (test)`; }); const inlinecode = { '`code`': inlinecodeWrapper('code'), '`code` begin': `${ inlinecodeWrapper('code') } begin`, 'End `code`': `End ${ inlinecodeWrapper('code') }`, 'Middle `code` middle': `Middle ${ inlinecodeWrapper('code') } middle`, '`code`begin': `${ inlinecodeWrapper('code') }begin`, 'End`code`': `End${ inlinecodeWrapper('code') }`, 'Middle`code`middle': `Middle${ inlinecodeWrapper('code') }middle`, }; const code = { '```code```': codeWrapper('code', 'clean'), '```code': codeWrapper('code\n', 'clean'), '```code\n': codeWrapper('code\n', 'clean'), '```\ncode\n```': codeWrapper('code\n', 'clean'), '```code\n```': codeWrapper('code\n', 'clean'), '```\ncode```': codeWrapper('code', 'clean'), '```javascript\nvar a = \'log\';\nconsole.log(a);```': codeWrapper('var a = \'log\';\nconsole.log(a);', 'javascript'), '```*code*```': codeWrapper('*code*', 'markdown'), '```**code**```': codeWrapper('**code**', 'markdown'), '```__code__```': codeWrapper('__code__', 'markdown'), }; const nested = { '> some quote\n`window.location.reload();`': `${ quoteWrapper(' some quote') }${ inlinecodeWrapper('window.location.reload();') }`, }; /* * Markdown Filters */ const boldFiltered = { '*Hello*': 'Hello', '**Hello**': 'Hello', '*Hello**': 'Hello', 'He*llo': 'He*llo', '*Hello': '*Hello', 'Hello*': 'Hello*', '***Hello***': '***Hello***', '***Hello**': '***Hello**', '*Hello* there': 'Hello there', '**Hello** there': 'Hello there', 'Hi, *Hello*': 'Hi, Hello', 'Hi, **Hello**': 'Hi, Hello', 'Hi, *Hello* how are you?': 'Hi, Hello how are you?', 'Hi, **Hello** how are you?': 'Hi, Hello how are you?', }; const italicFiltered = { _Hello_: 'Hello', __Hello__: 'Hello', _Hello__: 'Hello', He_llo: 'He_llo', _Hello: '_Hello', __Hello: '__Hello', Hello_: 'Hello_', ___Hello___: '___Hello___', ___Hello__: '___Hello__', '_Hello_ there': 'Hello there', '__Hello__ there': 'Hello there', 'Hi, _Hello_': 'Hi, Hello', 'Hi, __Hello__': 'Hi, Hello', 'Hi, _Hello_ how are you?': 'Hi, Hello how are you?', 'Hi, __Hello__ how are you?': 'Hi, Hello how are you?', }; const strikeFiltered = { '~Hello~': 'Hello', '~~Hello~~': 'Hello', '~~Hello': '~~Hello', '~Hello~~': 'Hello', 'He~llo': 'He~llo', '~Hello': '~Hello', 'Hello~': 'Hello~', '~~~Hello~~~': '~~~Hello~~~', '~~~Hello~~': '~~~Hello~~', '~Hello~ there': 'Hello there', '~~Hello~~ there': 'Hello there', 'Hi, ~Hello~': 'Hi, Hello', 'Hi, ~~Hello~~': 'Hi, Hello', 'Hi, ~Hello~ how are you?': 'Hi, Hello how are you?', 'Hi, ~~Hello~~ how are you?': 'Hi, Hello how are you?', }; const headingFiltered = { '# Hello': 'Hello', '## Hello': 'Hello', '### Hello': 'Hello', '#### Hello': 'Hello', '#Hello': '#Hello', '##Hello': '##Hello', '###Hello': '###Hello', '####Hello': '####Hello', 'He#llo': 'He#llo', '# Hello there': 'Hello there', 'Hi, # Hello': 'Hi, # Hello', 'Hi, # Hello there': 'Hi, # Hello there', }; const quoteFiltered = { '>Hello': 'Hello', '> Hello': ' Hello', '>>>\nHello\n<<<': 'Hello', '>>>\nHello there!\n<<<': 'Hello there!', '>>>\n Hello there! \n<<<': ' Hello there! ', }; const linkFiltered = { '[Text](http://link)': 'Text', '[Open Site For Rocket.Chat](https://open.rocket.chat/)': 'Open Site For Rocket.Chat', '[ Open Site For Rocket.Chat](https://open.rocket.chat/ )': ' Open Site For Rocket.Chat', '[Rocket.Chat Site](https://rocket.chat/)': 'Rocket.Chat Site', '': 'Text', '': 'Text for test', }; const inlinecodeFiltered = { '`code`': 'code', '`code` begin': 'code begin', 'End `code`': 'End code', 'Middle `code` middle': 'Middle code middle', '`code`begin': 'codebegin', 'End`code`': 'Endcode', 'Middle`code`middle': 'Middlecodemiddle', }; const blockcodeFiltered = { '```code```': 'code', '```code': 'code', 'code```': 'code', 'Here ```code``` lies': 'Here code lies', 'Here```code```lies': 'Herecodelies', }; const defaultObjectTest = (result, object, objectKey) => assert.equal(result.html, object[objectKey]); const testObject = (object, parser = original, test = defaultObjectTest) => { Object.keys(object).forEach((objectKey) => { describe(objectKey, () => { const message = parser === original ? { html: escapeHTML(objectKey) } : objectKey; const result = parser === original ? Markdown.mountTokensBack(parser(message)) : { html: parser(message) }; it(`should be equal to ${ object[objectKey] }`, () => { test(result, object, objectKey); }); }); }); }; describe('Original', function() { describe('Bold', () => testObject(bold)); describe('Italic', () => testObject(italic)); describe('Strike', () => testObject(strike)); describe('Headers', () => { describe('Level 1', () => testObject(headersLevel1)); describe('Level 2', () => testObject(headersLevel2)); describe('Level 3', () => testObject(headersLevel3)); describe('Level 4', () => testObject(headersLevel4)); }); describe('Quote', () => testObject(quote)); describe('Link', () => testObject(link)); describe('Inline Code', () => testObject(inlinecode)); describe('Code', () => testObject(code)); describe('Nested', () => testObject(nested)); }); describe('Filtered', function() { describe('BoldFilter', () => testObject(boldFiltered, filtered)); describe('Italic', () => testObject(italicFiltered, filtered)); describe('StrikeFilter', () => testObject(strikeFiltered, filtered)); describe('HeadingFilter', () => testObject(headingFiltered, filtered)); describe('QuoteFilter', () => testObject(quoteFiltered, filtered)); describe('LinkFilter', () => testObject(linkFiltered, filtered)); describe('inlinecodeFilter', () => testObject(inlinecodeFiltered, filtered)); describe('blockcodeFilter', () => testObject(blockcodeFiltered, filtered)); }); // describe.only('Marked', function() { // describe('Bold', () => testObject(bold, marked)); // describe('Italic', () => testObject(italic, marked)); // describe('Strike', () => testObject(strike, marked)); // describe('Headers', () => { // describe('Level 1', () => testObject(headersLevel1, marked)); // describe('Level 2', () => testObject(headersLevel2, marked)); // describe('Level 3', () => testObject(headersLevel3, marked)); // describe('Level 4', () => testObject(headersLevel4, marked)); // }); // describe('Quote', () => testObject(quote, marked)); // });