import { inline } from './inline'; import { some } from '../combinator'; import { input } from './context'; import { inspect } from '../debug.test'; describe('Unit: parser/inline', () => { describe('inline', () => { const parser = some(inline); it('empty', () => { assert.deepStrictEqual(inspect(parser, input('')), undefined); }); it('escape', () => { assert.deepStrictEqual(inspect(parser, input('\\0')), [['0'], '']); assert.deepStrictEqual(inspect(parser, input('\\1')), [['1'], '']); assert.deepStrictEqual(inspect(parser, input('\\a')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('\\A')), [['A'], '']); }); it('nest', () => { assert.deepStrictEqual(inspect(parser, input('あ(A)')), [['あ', '(A)'], '']); assert.deepStrictEqual(inspect(parser, input('あ(い)')), [['あ', '(い)'], '']); //assert.deepStrictEqual(inspect(parser, input('='.repeat(1e6))), [['='.repeat(1e6)], '']); //assert.deepStrictEqual(inspect(parser, input('*'.repeat(1e6))), [['*'.repeat(1e6)], '']); assert.deepStrictEqual(inspect(parser, input('* a*')), [['* a', '*'], '']); assert.deepStrictEqual(inspect(parser, input('** a**')), [['**', ' a', '**'], '']); assert.deepStrictEqual(inspect(parser, input('*** a***')), [['***', ' a', '***'], '']); assert.deepStrictEqual(inspect(parser, input('**** a****')), [['****', ' a', '****'], '']); assert.deepStrictEqual(inspect(parser, input('*a**')), [['a', '*'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b')), [['*', 'a', '**', 'b'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b*')), [['a**b'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b*c')), [['*', 'a', '**', 'b', '*', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b*c*')), [['*', 'a', '**', 'b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b**')), [['*', 'a', 'b'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b**c')), [['*', 'a', 'b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b***')), [['ab'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b***c')), [['ab', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b****')), [['ab', '*'], '']); assert.deepStrictEqual(inspect(parser, input('*a**b****c')), [['*', 'a', 'b', '**', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a***b****')), [['a', 'b', '**'], '']); assert.deepStrictEqual(inspect(parser, input('*a***b****c')), [['a', 'b', '**', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a *b**')), [['a b'], '']); assert.deepStrictEqual(inspect(parser, input('*a *b**c')), [['*', 'a ', '*', 'b', '**', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a **b***')), [['a b'], '']); assert.deepStrictEqual(inspect(parser, input('*a **b***c')), [['a b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('*a ***b****')), [['a b'], '']); assert.deepStrictEqual(inspect(parser, input('*a ***b****c')), [['a b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('**a*')), [['**', 'a', '*'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b')), [['**', 'a', '*', 'b'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b*')), [['**', 'a', 'b'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b*c')), [['**', 'a', 'b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b*c*')), [['**', 'a', 'b', 'c', '*'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b*c**')), [['abc'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b**')), [['**', 'a', 'b', '*'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b**c')), [['**', 'a', '*', 'b', '**', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b***')), [['ab'], '']); assert.deepStrictEqual(inspect(parser, input('**a*b***c')), [['ab', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('**a**b****')), [['a', 'b', '****'], '']); assert.deepStrictEqual(inspect(parser, input('**a**b****c')), [['a', 'b', '****c'], '']); assert.deepStrictEqual(inspect(parser, input('**a***b*****')), [['a', 'b', '****'], '']); assert.deepStrictEqual(inspect(parser, input('**a***b*****c')), [['a', 'b', '****c'], '']); assert.deepStrictEqual(inspect(parser, input('**a *b***')), [['a b'], '']); assert.deepStrictEqual(inspect(parser, input('**a *b***c')), [['a b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('**a **b****')), [['a b'], '']); assert.deepStrictEqual(inspect(parser, input('**a **b****c')), [['a b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('**a ***b*****')), [['a b'], '']); assert.deepStrictEqual(inspect(parser, input('**a ***b*****c')), [['a b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('***a*')), [['**', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('***a*b')), [['**', 'a', 'b'], '']); assert.deepStrictEqual(inspect(parser, input('***a*b*')), [['**', 'a', 'b', '*'], '']); assert.deepStrictEqual(inspect(parser, input('***a*b*c')), [['**', 'a', 'b', '*', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('***a*b*c*')), [['**', 'a', 'b', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('***a*b*c**')), [['**', 'a', 'b', 'c', '*'], '']); assert.deepStrictEqual(inspect(parser, input('***a*b*c***')), [['abc'], '']); assert.deepStrictEqual(inspect(parser, input('***a**b**c***')), [['abc'], '']); assert.deepStrictEqual(inspect(parser, input('*(*a*)*')), [['(a)'], '']); assert.deepStrictEqual(inspect(parser, input('**(**a**)**')), [['(a)'], '']); assert.deepStrictEqual(inspect(parser, input('*[*]')), [['*', '[', '*', ']'], '']); assert.deepStrictEqual(inspect(parser, input('*<*>')), [['<', '>'], '']); assert.deepStrictEqual(inspect(parser, input('*a((b))*')), [['ab'], '']); assert.deepStrictEqual(inspect(parser, input('*++ ++*')), [[' '], '']); assert.deepStrictEqual(inspect(parser, input('*++ a ++*')), [[' a '], '']); assert.deepStrictEqual(inspect(parser, input('*++ a ++*')), [[' a '], '']); assert.deepStrictEqual(inspect(parser, input('*`a`*')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('*a"\nb*')), [['a"
b
'], '']); assert.deepStrictEqual(inspect(parser, input('*a"\n"("b*')), [['a"
"("b
'], '']); assert.deepStrictEqual(inspect(parser, input('"*a\nb*')), [['"', '*', 'a', '
', 'b', '*'], '']); assert.deepStrictEqual(inspect(parser, input('"*a\n""b*')), [['"', '*', 'a', '
', '"', '"', 'b', '*'], '']); assert.deepStrictEqual(inspect(parser, input('"a\n"*b"c*')), [['"', 'a', '
', '"', '*', 'b', '"', 'c', '*'], '']); assert.deepStrictEqual(inspect(parser, input('"*a**b\nc**"("*')), [['"', '*', 'a', '**', 'b', '
', 'c', '**', '"', '(', '"', '*'], '']); assert.deepStrictEqual(inspect(parser, input('[% a"\nb %]')), [['[% a"
b %]
'], '']); assert.deepStrictEqual(inspect(parser, input('""a\n""b"')), [['"', '<bdi>', '"', 'a', '
', '"', '"', 'b', '', '"'], '']); assert.deepStrictEqual(inspect(parser, input('*a*')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('[[[[a]]]]')), [['[[a]]'], '']); assert.deepStrictEqual(inspect(parser, input('[#]')), [['<bdi>[#</bdi>]'], '']); assert.deepStrictEqual(inspect(parser, input('"("")')), [['"', '<bdi>(', '"', '"', ')', ''], '']); assert.deepStrictEqual(inspect(parser, input('++\na\n++\n~~\nb\n~~\nc')), [['
a
', '
', '
b
', '
', 'c'], '']); assert.deepStrictEqual(inspect(parser, input('[@a]')), [['[', '@a', ']'], '']); assert.deepStrictEqual(inspect(parser, input('[#1][#2]')), [['1', '2'], '']); assert.deepStrictEqual(inspect(parser, input('[$1]')), [['[', '$1', ']'], '']); assert.deepStrictEqual(inspect(parser, input('[$1-2]')), [['[', '$1-2', ']'], '']); assert.deepStrictEqual(inspect(parser, input('[$-1][$-2]')), [['$-1', '$-2'], '']); assert.deepStrictEqual(inspect(parser, input('$-1, $-2')), [['$-1', ', ', '$-2'], '']); assert.deepStrictEqual(inspect(parser, input('$-1 and $-2')), [['$-1', ' and ', '$-2'], '']); assert.deepStrictEqual(inspect(parser, input('$$-1')), [['$', '$-1'], '']); assert.deepStrictEqual(inspect(parser, input('[[#a]]')), [['#a'], '']); assert.deepStrictEqual(inspect(parser, input('[[$-1]]')), [['$-1'], '']); assert.deepStrictEqual(inspect(parser, input('[[#-1]]{b}')), [['#-1', 'b'], '']); assert.deepStrictEqual(inspect(parser, input('[[#-1]](b)')), [['#-1', '(b)'], '']); assert.deepStrictEqual(inspect(parser, input('[[#-1]a]{b}')), [['[#-1]a'], '']); assert.deepStrictEqual(inspect(parser, input('[[#-1]a](b)')), [['[', '-1', 'a', ']', '(b)'], '']); assert.deepStrictEqual(inspect(parser, input('[#a]{b}')), [['a', 'b'], '']); assert.deepStrictEqual(inspect(parser, input('[@a]{b}')), [['@a'], '']); assert.deepStrictEqual(inspect(parser, input('[http://host]{http://evil}')), [['http://host'], '']); assert.deepStrictEqual(inspect(parser, input('[http://host]{http://host}')), [['http://host'], '']); assert.deepStrictEqual(inspect(parser, input('[]{{a}}')), [['[', ']', '{{a}}'], '']); assert.deepStrictEqual(inspect(parser, input('![]{{a}}')), [['!', '[', ']', '{{a}}'], '']); assert.deepStrictEqual(inspect(parser, input('[\n]{a}')), [['[', '
', ']', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('[\\\n]{a}')), [['[', '
', ']', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('{}')), [['{', '}'], '']); assert.deepStrictEqual(inspect(parser, input('{a}')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('{{a}}')), [['{{a}}'], '']); assert.deepStrictEqual(inspect(parser, input('!{}')), [['!', '{', '}'], '']); assert.deepStrictEqual(inspect(parser, input('!{a}')), [['!', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('!{{a}}')), [['!', '{{a}}'], '']); assert.deepStrictEqual(inspect(parser, input('!{{{a}}}')), [['!', '{{{a}}}'], '']); assert.deepStrictEqual(inspect(parser, input('!!{a}')), [['!', '!', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('${a}')), [['$', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('${{a}}')), [['$', '{{a}}'], '']); assert.deepStrictEqual(inspect(parser, input('${{{a}}}')), [['$', '{{{a}}}'], '']); assert.deepStrictEqual(inspect(parser, input('Di$ney Micro$oft')), [['Di', '$ney Micro', '$oft'], '']); assert.deepStrictEqual(inspect(parser, input('Di$ney, Micro$oft')), [['Di', '$ney, Micro', '$oft'], '']); assert.deepStrictEqual(inspect(parser, input('(((a))')), [['(a'], '']); assert.deepStrictEqual(inspect(parser, input('((((a))')), [['((a'], '']); assert.deepStrictEqual(inspect(parser, input('((${))}$')), [['((${))}$'], '']); assert.deepStrictEqual(inspect(parser, input('((a\nb))')), [['((a
b)
)
'], '']); assert.deepStrictEqual(inspect(parser, input('(((a\nb)))')), [['(((a
b)
)
)
'], '']); assert.deepStrictEqual(inspect(parser, input('(([[a] ]))')), [['[[a] ]'], '']); assert.deepStrictEqual(inspect(parser, input('(([[a] ]{b}))')), [['[a]'], '']); assert.deepStrictEqual(inspect(parser, input('(([["*(*"] ]))')), [['[["*(*"] ]'], '']); assert.deepStrictEqual(inspect(parser, input('(([:a\n]')), [['(([:a\n]'], '']); assert.deepStrictEqual(inspect(parser, input('(({{\n}}')), [['(({{
}}
'], '']); assert.deepStrictEqual(inspect(parser, input('"((""))')), [['"', '((', '"', '"', ')', ')'], '']); assert.deepStrictEqual(inspect(parser, input('0\n((a))')), [['0', '
', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('[[[a]]')), [['[', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('[[[[a]]')), [['[', '[', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('[[[[a]]]]')), [['[[a]]'], '']); assert.deepStrictEqual(inspect(parser, input('[[[$-1]]]')), [['$-1'], '']); assert.deepStrictEqual(inspect(parser, input('[[[]{a}]]')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('[[[a]{b}]]')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('[(([a]{#}))]{#}')), [['(([a]{#}))'], '']); assert.deepStrictEqual(inspect(parser, input('[[${]]}$')), [['[', '[', '${]]}$'], '']); assert.deepStrictEqual(inspect(parser, input('[[a\nb]]')), [['[', '[', 'a', '
', 'b', ']', ']'], '']); assert.deepStrictEqual(inspect(parser, input('[[[a\nb]]]')), [['[', '[', '[', 'a', '
', 'b', ']', ']', ']'], '']); assert.deepStrictEqual(inspect(parser, input('"[[""]]')), [['"', '[', '[', '"', '"', ']', ']'], '']); assert.deepStrictEqual(inspect(parser, input('[==a==]{b}')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('[[a](b)]{c}')), [['a(b)'], '']); assert.deepStrictEqual(inspect(parser, input('[[[[[[[{a}')), [['[', '[', '[', '[', '[', '[', '[', 'a'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<', 'http://host', '>'], '']); assert.deepStrictEqual(inspect(parser, input('[~http://host')), [['[', '~', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('[~a@b')), [['[', '~', 'a@b'], '']); assert.deepStrictEqual(inspect(parser, input('[~~a~~]')), [['[', 'a', ']'], '']); assert.deepStrictEqual(inspect(parser, input('[^http://host')), [['[^', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('[^a@b')), [['[^', 'a@b'], '']); assert.deepStrictEqual(inspect(parser, input('"[% *"*"*')), [['"', '[%', ' ', '*', '"', '*', '"', '*'], '']); assert.deepStrictEqual(inspect(parser, input('"[% "*"* %]')), [['"', '[% "*"* %]'], '']); assert.deepStrictEqual(inspect(parser, input('"{{""}}')), [['"', '{', '""', '}'], '']); assert.deepStrictEqual(inspect(parser, input('[#http://host/()]')), [['http://host/(<bdi>)', ''], '']); assert.deepStrictEqual(inspect(parser, input('[#@a/http://host/()]')), [['@a/http://host/(<bdi>)', ''], '']); assert.deepStrictEqual(inspect(parser, input('[#a|]')), [['a|<bdi>', ''], '']); assert.deepStrictEqual(inspect(parser, input('[[#a|]')), [['[', 'a|<bdi>', ''], '']); assert.deepStrictEqual(inspect(parser, input('[*==*]{a}')), [['*==*'], '']); assert.deepStrictEqual(inspect(parser, input('[]{"}[[""]]}]')), [['"', '""', '}', ']'], '']); assert.deepStrictEqual(inspect(parser, input('[ []{"}[[""]]}]')), [['[', ' ', '"', '""', '}', ']'], '']); }); it('uri', () => { assert.deepStrictEqual(inspect(parser, input('\nhttp://host')), [['
', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('0http://host')), [['0http', '://host'], '']); assert.deepStrictEqual(inspect(parser, input('0aAhttp://host')), [['0aAhttp', '://host'], '']); assert.deepStrictEqual(inspect(parser, input('?http://host')), [['?', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('0!http://host')), [['0', '!', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('0?http://host')), [['0?', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('_http://host')), [['_', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('_http://host_')), [['_', 'http://host', '_'], '']); assert.deepStrictEqual(inspect(parser, input('*http://host*')), [['http://host'], '']); assert.deepStrictEqual(inspect(parser, input('(http://host)')), [['(http://host)'], '']); assert.deepStrictEqual(inspect(parser, input('"http://host"')), [['"', 'http://host', '"'], '']); assert.deepStrictEqual(inspect(parser, input('"http://host""')), [['"', 'http://host', '"', '"'], '']); assert.deepStrictEqual(inspect(parser, input(' http://host')), [[' ', 'http://host'], '']); assert.deepStrictEqual(inspect(parser, input('あhttp://hostい')), [['あ', 'http://host', 'い'], '']); }); it('email', () => { assert.deepStrictEqual(inspect(parser, input('a@b')), [['a@b'], '']); assert.deepStrictEqual(inspect(parser, input('_a@b')), [['_', 'a@b'], '']); assert.deepStrictEqual(inspect(parser, input('_a@b_')), [['_', 'a@b', '_'], '']); assert.deepStrictEqual(inspect(parser, input('_a_b@c_')), [['_', 'a_b@c', '_'], '']); assert.deepStrictEqual(inspect(parser, input('*a@b*')), [[''], '']); assert.deepStrictEqual(inspect(parser, input('(a@b)')), [['()'], '']); assert.deepStrictEqual(inspect(parser, input(' a@b')), [[' ', 'a@b'], '']); assert.deepStrictEqual(inspect(parser, input('++a@b++')), [[''], '']); assert.deepStrictEqual(inspect(parser, input('++a++b@c++')), [['a', 'b@c', '++'], '']); }); it('channel', () => { assert.deepStrictEqual(inspect(parser, input('@a#b')), [['@a#b'], '']); assert.deepStrictEqual(inspect(parser, input('@domain/a#b')), [['@domain/a#b'], '']); assert.deepStrictEqual(inspect(parser, input('_@a#b')), [['_', '@a#b'], '']); assert.deepStrictEqual(inspect(parser, input('_@a#b_')), [['_', '@a#b', '_'], '']); assert.deepStrictEqual(inspect(parser, input(' @a#b')), [[' ', '@a#b'], '']); }); it('account', () => { assert.deepStrictEqual(inspect(parser, input('@a')), [['@a'], '']); assert.deepStrictEqual(inspect(parser, input('@http://host')), [['@', 'http', '://host'], '']); assert.deepStrictEqual(inspect(parser, input('_@a')), [['_', '@a'], '']); assert.deepStrictEqual(inspect(parser, input('_@a_')), [['_', '@a', '_'], '']); assert.deepStrictEqual(inspect(parser, input('*@a*')), [[''], '']); assert.deepStrictEqual(inspect(parser, input('(@a)')), [['()'], '']); assert.deepStrictEqual(inspect(parser, input(' @a')), [[' ', '@a'], '']); }); it('hashtag', () => { assert.deepStrictEqual(inspect(parser, input('#a#')), [['#a', '#'], '']); assert.deepStrictEqual(inspect(parser, input('#a#b')), [['#a', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('#a')), [['#a'], '']); assert.deepStrictEqual(inspect(parser, input('#http://host')), [['#', 'http', '://host'], '']); assert.deepStrictEqual(inspect(parser, input('#a\nb\n#c\n[#d]')), [['#a', '
', 'b', '
', '#c', '
', 'd'], '']); assert.deepStrictEqual(inspect(parser, input('_#a')), [['_', '#a'], '']); assert.deepStrictEqual(inspect(parser, input('_#a_')), [['_', '#a', '_'], '']); assert.deepStrictEqual(inspect(parser, input('_#a_b')), [['_', '#a_b'], '']); assert.deepStrictEqual(inspect(parser, input('_#a_b_')), [['_', '#a_b', '_'], '']); assert.deepStrictEqual(inspect(parser, input('a#b')), [['a', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('0a#b')), [['0a', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('あ#b')), [['あ', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('あい#b')), [['あい', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('0aあ#b')), [['0aあ', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('0aあい#b')), [['0aあい', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('「#あ」')), [['「', '#あ', '」'], '']); assert.deepStrictEqual(inspect(parser, input('a\n#b')), [['a', '
', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('a\\\n#b')), [['a', '
', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('((a))#b')), [['a', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('[[a]]#b')), [['a', '#b'], '']); assert.deepStrictEqual(inspect(parser, input('[#a')), [['[', '#a'], '']); assert.deepStrictEqual(inspect(parser, input('|#a')), [['|', '#a'], '']); assert.deepStrictEqual(inspect(parser, input(' #a')), [[' ', '#a'], '']); }); it('hashnum', () => { assert.deepStrictEqual(inspect(parser, input('#1')), [['#1'], '']); assert.deepStrictEqual(inspect(parser, input(`#1'`)), [[`#1`, `'`], '']); assert.deepStrictEqual(inspect(parser, input('#1234567890@a')), [['#', '1234567890', '@a'], '']); assert.deepStrictEqual(inspect(parser, input('_#1')), [['_', '#1'], '']); assert.deepStrictEqual(inspect(parser, input('_#1_')), [['_', '#1', '_'], '']); assert.deepStrictEqual(inspect(parser, input('_#1_0')), [['_', '#1_0'], '']); assert.deepStrictEqual(inspect(parser, input('_#1_0_')), [['_', '#1_0', '_'], '']); assert.deepStrictEqual(inspect(parser, input('「#1」')), [['「', '#1', '」'], '']); }); }); });