From fbaeed930e52bd2ae8f3d94f057a5f46bd51f92f Mon Sep 17 00:00:00 2001 From: syuilo Date: Sat, 3 Apr 2021 21:04:53 +0900 Subject: [PATCH] =?UTF-8?q?refactor(test):=20=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E5=88=86=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/api.ts | 58 +++++ test/main.ts | 564 ------------------------------------------------- test/parser.ts | 515 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 573 insertions(+), 564 deletions(-) create mode 100644 test/api.ts delete mode 100644 test/main.ts create mode 100644 test/parser.ts diff --git a/test/api.ts b/test/api.ts new file mode 100644 index 0000000..910cd3c --- /dev/null +++ b/test/api.ts @@ -0,0 +1,58 @@ +import assert from 'assert'; +import { extract, inspect, parse, toString } from '../built/index'; +import { + TEXT, CENTER, FN, UNI_EMOJI, MENTION, EMOJI_CODE, HASHTAG, N_URL, BOLD, SMALL, ITALIC, STRIKE, QUOTE, MATH_BLOCK, SEARCH, CODE_BLOCK, LINK +} from './node'; + +describe('API', () => { + describe('toString', () => { + it('basic', () => { + const input = +`before +
+Hello [tada everynyan! 🎉] + +I'm @ai, A bot of misskey! + +https://github.com/syuilo/ai +
+after`; + assert.strictEqual(toString(parse(input)), input); + }); + }); + + describe('inspect', () => { + it('replace text', () => { + const input = 'good morning [tada everynyan!]'; + const result = parse(input); + inspect(result, node => { + if (node.type == 'text') { + node.props.text = node.props.text.replace(/good morning/g, 'hello'); + } + }); + assert.strictEqual(toString(result), 'hello [tada everynyan!]'); + }); + }); + + describe('extract', () => { + it('basic', () => { + const nodes = parse('@hoge @piyo @bebeyo'); + const expect = [ + MENTION('hoge', null, '@hoge'), + MENTION('piyo', null, '@piyo'), + MENTION('bebeyo', null, '@bebeyo') + ]; + assert.deepStrictEqual(extract(nodes, 'mention'), expect); + }); + + it('nested', () => { + const nodes = parse('abc:hoge:[tada 123 @hoge :foo:]:piyo:'); + const expect = [ + EMOJI_CODE('hoge'), + EMOJI_CODE('foo'), + EMOJI_CODE('piyo') + ]; + assert.deepStrictEqual(extract(nodes, 'emojiCode'), expect); + }); + }); +}); diff --git a/test/main.ts b/test/main.ts deleted file mode 100644 index 7ec6303..0000000 --- a/test/main.ts +++ /dev/null @@ -1,564 +0,0 @@ -import assert from 'assert'; -import { extract, inspect, parse, parsePlain, toString } from '../built/index'; -import { createNode } from '../built/util'; -import { - TEXT, CENTER, FN, UNI_EMOJI, MENTION, EMOJI_CODE, HASHTAG, N_URL, BOLD, SMALL, ITALIC, STRIKE, QUOTE, MATH_BLOCK, SEARCH, CODE_BLOCK, LINK -} from './node'; - -describe('text', () => { - it('basic', () => { - const input = 'abc'; - const output = [TEXT('abc')]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('quote', () => { - it('single', () => { - const input = '> abc'; - const output = [ - QUOTE([ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('multiple', () => { - const input = ` -> abc -> 123 -`; - const output = [ - QUOTE([ - TEXT('abc\n123') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - - it('with block (center)', () => { - const input = ` ->
-> a ->
-`; - const output = [ - QUOTE([ - CENTER([ - TEXT('a') - ]) - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - - it('with block (center, mention)', () => { - const input = ` ->
-> I'm @ai, An bot of misskey! ->
-`; - const output = [ - QUOTE([ - CENTER([ - TEXT('I\'m '), - MENTION('ai', null, '@ai'), - TEXT(', An bot of misskey!'), - ]) - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('search', () => { - describe('basic', () => { - it('Search', () => { - const input = 'MFM 書き方 123 Search'; - const output = [ - createNode('search', { - query: 'MFM 書き方 123', - content: input - }) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('[Search]', () => { - const input = 'MFM 書き方 123 [Search]'; - const output = [ - createNode('search', { - query: 'MFM 書き方 123', - content: input - }) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('search', () => { - const input = 'MFM 書き方 123 search'; - const output = [ - createNode('search', { - query: 'MFM 書き方 123', - content: input - }) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('[search]', () => { - const input = 'MFM 書き方 123 [search]'; - const output = [ - createNode('search', { - query: 'MFM 書き方 123', - content: input - }) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('検索', () => { - const input = 'MFM 書き方 123 検索'; - const output = [ - createNode('search', { - query: 'MFM 書き方 123', - content: input - }) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('[検索]', () => { - const input = 'MFM 書き方 123 [検索]'; - const output = [ - createNode('search', { - query: 'MFM 書き方 123', - content: input - }) - ]; - assert.deepStrictEqual(parse(input), output); - }); - }); - it('with text', () => { - const input = 'abc\nhoge piyo bebeyo 検索\n123'; - const output = [ - TEXT('abc'), - SEARCH('hoge piyo bebeyo', 'hoge piyo bebeyo 検索'), - TEXT('123') - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('code block', () => { - it('basic', () => { - const input = '```\nabc\n```'; - const output = [CODE_BLOCK('abc', null)]; - assert.deepStrictEqual(parse(input), output); - }); - it('multi line', () => { - const input = '```\na\nb\nc\n```'; - const output = [CODE_BLOCK('a\nb\nc', null)]; - assert.deepStrictEqual(parse(input), output); - }); - it('basic (lang)', () => { - const input = '```js\nconst a = 1;\n```'; - const output = [CODE_BLOCK('const a = 1;', 'js')]; - assert.deepStrictEqual(parse(input), output); - }); - it('with text', () => { - const input = 'abc\n```\nconst abc = 1;\n```\n123'; - const output = [ - TEXT('abc'), - CODE_BLOCK('const abc = 1;', null), - TEXT('123') - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('mathBlock', () => { - it('basic', () => { - const input = '123\n\\[math1\\]\nabc\n\\[math2\\]'; - const output = [ - TEXT('123'), - MATH_BLOCK('math1'), - TEXT('abc'), - MATH_BLOCK('math2') - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('case of no matched', () => { - const input = '\\[aaa\\]\\[bbb\\]'; - const output = [ - TEXT('\\[aaa\\]\\[bbb\\]') - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('center', () => { - it('single text', () => { - const input = '
abc
'; - const output = [ - CENTER([ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('multiple text', () => { - const input = 'before\n
\nabc\n123\n\npiyo\n
\nafter'; - const output = [ - TEXT('before'), - CENTER([ - TEXT('abc\n123\n\npiyo') - ]), - TEXT('after') - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('emoji code', () => { - it('basic', () => { - const input = ':abc:'; - const output = [EMOJI_CODE('abc')]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('unicode emoji', () => { - it('basic', () => { - const input = '今起きた😇'; - const output = [TEXT('今起きた'), UNI_EMOJI('😇')]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('big', () => { - it('basic', () => { - const input = '***abc***'; - const output = [ - FN('tada', { }, [ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容にはインライン構文を利用できる', () => { - const input = '***123**abc**123***'; - const output = [ - FN('tada', { }, [ - TEXT('123'), - BOLD([ - TEXT('abc') - ]), - TEXT('123') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容は改行できる', () => { - const input = '***123\n**abc**\n123***'; - const output = [ - FN('tada', { }, [ - TEXT('123\n'), - BOLD([ - TEXT('abc') - ]), - TEXT('\n123') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('bold', () => { - it('basic', () => { - const input = '**abc**'; - const output = [ - BOLD([ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容にはインライン構文を利用できる', () => { - const input = '**123~~abc~~123**'; - const output = [ - BOLD([ - TEXT('123'), - STRIKE([ - TEXT('abc') - ]), - TEXT('123') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容は改行できる', () => { - const input = '**123\n~~abc~~\n123**'; - const output = [ - BOLD([ - TEXT('123\n'), - STRIKE([ - TEXT('abc') - ]), - TEXT('\n123') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('small', () => { - it('basic', () => { - const input = 'abc'; - const output = [ - SMALL([ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容にはインライン構文を利用できる', () => { - const input = 'abc**123**abc'; - const output = [ - SMALL([ - TEXT('abc'), - BOLD([ - TEXT('123') - ]), - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容は改行できる', () => { - const input = 'abc\n**123**\nabc'; - const output = [ - SMALL([ - TEXT('abc\n'), - BOLD([ - TEXT('123') - ]), - TEXT('\nabc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('italic 1', () => { - it('basic', () => { - const input = 'abc'; - const output = [ - ITALIC([ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容にはインライン構文を利用できる', () => { - const input = 'abc**123**abc'; - const output = [ - ITALIC([ - TEXT('abc'), - BOLD([ - TEXT('123') - ]), - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); - it('内容は改行できる', () => { - const input = 'abc\n**123**\nabc'; - const output = [ - ITALIC([ - TEXT('abc\n'), - BOLD([ - TEXT('123') - ]), - TEXT('\nabc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('italic 2', () => { - it('basic', () => { - const input = '*abc*'; - const output = [ - ITALIC([ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -// strike - -// inlineCode - -// mathInline - -// mention - -describe('hashtag', () => { - it('and unicode emoji', () => { - const input = '#️⃣abc123#abc'; - const output = [UNI_EMOJI('#️⃣'), TEXT('abc123'), HASHTAG('abc')]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('url', () => { - it('basic', () => { - const input = 'official instance: https://misskey.io/@ai.'; - const output = [ - TEXT('official instance: '), - N_URL('https://misskey.io/@ai'), - TEXT('.') - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('link', () => { - it('basic', () => { - const input = '[official instance](https://misskey.io/@ai).'; - const output = [ - LINK(false, 'https://misskey.io/@ai', [ - TEXT('official instance') - ]), - TEXT('.') - ]; - assert.deepStrictEqual(parse(input), output); - }); - - it('silent flag', () => { - const input = '?[official instance](https://misskey.io/@ai).'; - const output = [ - LINK(true, 'https://misskey.io/@ai', [ - TEXT('official instance') - ]), - TEXT('.') - ]; - assert.deepStrictEqual(parse(input), output); - }); - - it('do not yield url node even if label is recognisable as a url', () => { - const input = 'official instance: [https://misskey.io/@ai](https://misskey.io/@ai).'; - const output = [ - TEXT('official instance: '), - LINK(false, 'https://misskey.io/@ai', [ - TEXT('https://misskey.io/@ai') - ]), - TEXT('.') - ]; - assert.deepStrictEqual(parse(input), output); - }); - - it('do not yield link node even if label is recognisable as a link', () => { - const input = 'official instance: [[https://misskey.io/@ai](https://misskey.io/@ai)](https://misskey.io/@ai).'; - const output = [ - TEXT('official instance: '), - LINK(false, 'https://misskey.io/@ai', [ - TEXT('[https://misskey.io/@ai](https://misskey.io/@ai)') - ]), - TEXT('.') - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -describe('fn', () => { - it('basic', () => { - const input = '[tada abc]'; - const output = [ - FN('tada', { }, [ - TEXT('abc') - ]) - ]; - assert.deepStrictEqual(parse(input), output); - }); -}); - -it('composite', () => { - const input = -`before -
-Hello [tada everynyan! 🎉] - -I'm @ai, A bot of misskey! - -https://github.com/syuilo/ai -
-after`; - const output = [ - TEXT('before'), - CENTER([ - TEXT('Hello '), - FN('tada', { }, [ - TEXT('everynyan! '), - UNI_EMOJI('🎉') - ]), - TEXT('\n\nI\'m '), - MENTION('ai', null, '@ai'), - TEXT(', A bot of misskey!\n\n'), - N_URL('https://github.com/syuilo/ai') - ]), - TEXT('after') - ]; - assert.deepStrictEqual(parse(input), output); -}); - -describe('toString API', () => { - it('basic', () => { - const input = -`before -
-Hello [tada everynyan! 🎉] - -I'm @ai, A bot of misskey! - -https://github.com/syuilo/ai -
-after`; - assert.strictEqual(toString(parse(input)), input); - }); -}); - -describe('inspect API', () => { - it('replace text', () => { - const input = 'good morning [tada everynyan!]'; - const result = parse(input); - inspect(result, node => { - if (node.type == 'text') { - node.props.text = node.props.text.replace(/good morning/g, 'hello'); - } - }); - assert.strictEqual(toString(result), 'hello [tada everynyan!]'); - }); -}); - -describe('extract API', () => { - it('basic', () => { - const nodes = parse('@hoge @piyo @bebeyo'); - const expect = [ - MENTION('hoge', null, '@hoge'), - MENTION('piyo', null, '@piyo'), - MENTION('bebeyo', null, '@bebeyo') - ]; - assert.deepStrictEqual(extract(nodes, 'mention'), expect); - }); - - it('nested', () => { - const nodes = parse('abc:hoge:[tada 123 @hoge :foo:]:piyo:'); - const expect = [ - EMOJI_CODE('hoge'), - EMOJI_CODE('foo'), - EMOJI_CODE('piyo') - ]; - assert.deepStrictEqual(extract(nodes, 'emojiCode'), expect); - }); -}); diff --git a/test/parser.ts b/test/parser.ts new file mode 100644 index 0000000..ff6481a --- /dev/null +++ b/test/parser.ts @@ -0,0 +1,515 @@ +import assert from 'assert'; +import { parse } from '../built/index'; +import { createNode } from '../built/util'; +import { + TEXT, CENTER, FN, UNI_EMOJI, MENTION, EMOJI_CODE, HASHTAG, N_URL, BOLD, SMALL, ITALIC, STRIKE, QUOTE, MATH_BLOCK, SEARCH, CODE_BLOCK, LINK +} from './node'; + +describe('parser', () => { + describe('text', () => { + it('basic', () => { + const input = 'abc'; + const output = [TEXT('abc')]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('quote', () => { + it('single', () => { + const input = '> abc'; + const output = [ + QUOTE([ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('multiple', () => { + const input = ` +> abc +> 123 +`; + const output = [ + QUOTE([ + TEXT('abc\n123') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + + it('with block (center)', () => { + const input = ` +>
+> a +>
+`; + const output = [ + QUOTE([ + CENTER([ + TEXT('a') + ]) + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + + it('with block (center, mention)', () => { + const input = ` +>
+> I'm @ai, An bot of misskey! +>
+`; + const output = [ + QUOTE([ + CENTER([ + TEXT('I\'m '), + MENTION('ai', null, '@ai'), + TEXT(', An bot of misskey!'), + ]) + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('search', () => { + describe('basic', () => { + it('Search', () => { + const input = 'MFM 書き方 123 Search'; + const output = [ + createNode('search', { + query: 'MFM 書き方 123', + content: input + }) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('[Search]', () => { + const input = 'MFM 書き方 123 [Search]'; + const output = [ + createNode('search', { + query: 'MFM 書き方 123', + content: input + }) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('search', () => { + const input = 'MFM 書き方 123 search'; + const output = [ + createNode('search', { + query: 'MFM 書き方 123', + content: input + }) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('[search]', () => { + const input = 'MFM 書き方 123 [search]'; + const output = [ + createNode('search', { + query: 'MFM 書き方 123', + content: input + }) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('検索', () => { + const input = 'MFM 書き方 123 検索'; + const output = [ + createNode('search', { + query: 'MFM 書き方 123', + content: input + }) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('[検索]', () => { + const input = 'MFM 書き方 123 [検索]'; + const output = [ + createNode('search', { + query: 'MFM 書き方 123', + content: input + }) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + it('with text', () => { + const input = 'abc\nhoge piyo bebeyo 検索\n123'; + const output = [ + TEXT('abc'), + SEARCH('hoge piyo bebeyo', 'hoge piyo bebeyo 検索'), + TEXT('123') + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('code block', () => { + it('basic', () => { + const input = '```\nabc\n```'; + const output = [CODE_BLOCK('abc', null)]; + assert.deepStrictEqual(parse(input), output); + }); + it('multi line', () => { + const input = '```\na\nb\nc\n```'; + const output = [CODE_BLOCK('a\nb\nc', null)]; + assert.deepStrictEqual(parse(input), output); + }); + it('basic (lang)', () => { + const input = '```js\nconst a = 1;\n```'; + const output = [CODE_BLOCK('const a = 1;', 'js')]; + assert.deepStrictEqual(parse(input), output); + }); + it('with text', () => { + const input = 'abc\n```\nconst abc = 1;\n```\n123'; + const output = [ + TEXT('abc'), + CODE_BLOCK('const abc = 1;', null), + TEXT('123') + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('mathBlock', () => { + it('basic', () => { + const input = '123\n\\[math1\\]\nabc\n\\[math2\\]'; + const output = [ + TEXT('123'), + MATH_BLOCK('math1'), + TEXT('abc'), + MATH_BLOCK('math2') + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('case of no matched', () => { + const input = '\\[aaa\\]\\[bbb\\]'; + const output = [ + TEXT('\\[aaa\\]\\[bbb\\]') + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('center', () => { + it('single text', () => { + const input = '
abc
'; + const output = [ + CENTER([ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('multiple text', () => { + const input = 'before\n
\nabc\n123\n\npiyo\n
\nafter'; + const output = [ + TEXT('before'), + CENTER([ + TEXT('abc\n123\n\npiyo') + ]), + TEXT('after') + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('emoji code', () => { + it('basic', () => { + const input = ':abc:'; + const output = [EMOJI_CODE('abc')]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('unicode emoji', () => { + it('basic', () => { + const input = '今起きた😇'; + const output = [TEXT('今起きた'), UNI_EMOJI('😇')]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('big', () => { + it('basic', () => { + const input = '***abc***'; + const output = [ + FN('tada', { }, [ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容にはインライン構文を利用できる', () => { + const input = '***123**abc**123***'; + const output = [ + FN('tada', { }, [ + TEXT('123'), + BOLD([ + TEXT('abc') + ]), + TEXT('123') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容は改行できる', () => { + const input = '***123\n**abc**\n123***'; + const output = [ + FN('tada', { }, [ + TEXT('123\n'), + BOLD([ + TEXT('abc') + ]), + TEXT('\n123') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('bold', () => { + it('basic', () => { + const input = '**abc**'; + const output = [ + BOLD([ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容にはインライン構文を利用できる', () => { + const input = '**123~~abc~~123**'; + const output = [ + BOLD([ + TEXT('123'), + STRIKE([ + TEXT('abc') + ]), + TEXT('123') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容は改行できる', () => { + const input = '**123\n~~abc~~\n123**'; + const output = [ + BOLD([ + TEXT('123\n'), + STRIKE([ + TEXT('abc') + ]), + TEXT('\n123') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('small', () => { + it('basic', () => { + const input = 'abc'; + const output = [ + SMALL([ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容にはインライン構文を利用できる', () => { + const input = 'abc**123**abc'; + const output = [ + SMALL([ + TEXT('abc'), + BOLD([ + TEXT('123') + ]), + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容は改行できる', () => { + const input = 'abc\n**123**\nabc'; + const output = [ + SMALL([ + TEXT('abc\n'), + BOLD([ + TEXT('123') + ]), + TEXT('\nabc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('italic 1', () => { + it('basic', () => { + const input = 'abc'; + const output = [ + ITALIC([ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容にはインライン構文を利用できる', () => { + const input = 'abc**123**abc'; + const output = [ + ITALIC([ + TEXT('abc'), + BOLD([ + TEXT('123') + ]), + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + it('内容は改行できる', () => { + const input = 'abc\n**123**\nabc'; + const output = [ + ITALIC([ + TEXT('abc\n'), + BOLD([ + TEXT('123') + ]), + TEXT('\nabc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('italic 2', () => { + it('basic', () => { + const input = '*abc*'; + const output = [ + ITALIC([ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + // strike + + // inlineCode + + // mathInline + + // mention + + describe('hashtag', () => { + it('and unicode emoji', () => { + const input = '#️⃣abc123#abc'; + const output = [UNI_EMOJI('#️⃣'), TEXT('abc123'), HASHTAG('abc')]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('url', () => { + it('basic', () => { + const input = 'official instance: https://misskey.io/@ai.'; + const output = [ + TEXT('official instance: '), + N_URL('https://misskey.io/@ai'), + TEXT('.') + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('link', () => { + it('basic', () => { + const input = '[official instance](https://misskey.io/@ai).'; + const output = [ + LINK(false, 'https://misskey.io/@ai', [ + TEXT('official instance') + ]), + TEXT('.') + ]; + assert.deepStrictEqual(parse(input), output); + }); + + it('silent flag', () => { + const input = '?[official instance](https://misskey.io/@ai).'; + const output = [ + LINK(true, 'https://misskey.io/@ai', [ + TEXT('official instance') + ]), + TEXT('.') + ]; + assert.deepStrictEqual(parse(input), output); + }); + + it('do not yield url node even if label is recognisable as a url', () => { + const input = 'official instance: [https://misskey.io/@ai](https://misskey.io/@ai).'; + const output = [ + TEXT('official instance: '), + LINK(false, 'https://misskey.io/@ai', [ + TEXT('https://misskey.io/@ai') + ]), + TEXT('.') + ]; + assert.deepStrictEqual(parse(input), output); + }); + + it('do not yield link node even if label is recognisable as a link', () => { + const input = 'official instance: [[https://misskey.io/@ai](https://misskey.io/@ai)](https://misskey.io/@ai).'; + const output = [ + TEXT('official instance: '), + LINK(false, 'https://misskey.io/@ai', [ + TEXT('[https://misskey.io/@ai](https://misskey.io/@ai)') + ]), + TEXT('.') + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + describe('fn', () => { + it('basic', () => { + const input = '[tada abc]'; + const output = [ + FN('tada', { }, [ + TEXT('abc') + ]) + ]; + assert.deepStrictEqual(parse(input), output); + }); + }); + + it('composite', () => { + const input = +`before +
+Hello [tada everynyan! 🎉] + +I'm @ai, A bot of misskey! + +https://github.com/syuilo/ai +
+after`; + const output = [ + TEXT('before'), + CENTER([ + TEXT('Hello '), + FN('tada', { }, [ + TEXT('everynyan! '), + UNI_EMOJI('🎉') + ]), + TEXT('\n\nI\'m '), + MENTION('ai', null, '@ai'), + TEXT(', A bot of misskey!\n\n'), + N_URL('https://github.com/syuilo/ai') + ]), + TEXT('after') + ]; + assert.deepStrictEqual(parse(input), output); + }); +});