import { html, TAGS } from './html'; import { Output } from '../../combinator/parser'; import { some } from '../../combinator'; import { input } from '../context'; import { inspect } from '../../debug.test'; describe('Unit: parser/inline/html', () => { describe('html', () => { const parser = some(html); it('hash', () => { assert(TAGS.every(tag => parser(input(`<${tag}>`), new Output()))); }); it('xss', () => { assert.deepStrictEqual(inspect(parser, input('')), [['<script>alert()</script>'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi onclick="alert()">'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi onclick="alert()"></bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi onclick="alert()">a</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi onclick="alert()">a</bdi>'], '']); }); it('invalid', () => { assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('<0>')), undefined); assert.deepStrictEqual(inspect(parser, input('')), [['<aT>'], '']); assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('')), [['<T>'], '']); assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('')), [['<wbr />'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('z')), [['<bdi>z'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi></bdi>'], '']); assert.deepStrictEqual(inspect(parser, input(' ')), [['<bdi> </bdi>'], '']); assert.deepStrictEqual(inspect(parser, input(' \n')), [['<bdi> \n</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input(' \na')), [['<bdi> \na</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('\\ ')), [['<bdi>\\ </bdi>'], '']); assert.deepStrictEqual(inspect(parser, input(' ')), [['<bdi>&Tab;</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi><wbr></bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('\n')), [['<bdi>\n</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('\na')), [['<bdi>\na</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('\\\na')), [['<bdi>\\\na</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi>a'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi>a</BDI>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<BDI>'], 'a']); assert.deepStrictEqual(inspect(parser, input('a')), [['<BDI>'], 'a']); assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi />'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<b><b><b>a</b></b></b>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('<x a="*b*"'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<x a="*b*">'], '']); assert.deepStrictEqual(inspect(parser, input('c')), [['<x a="*b*">'], 'c']); assert.deepStrictEqual(inspect(parser, input('<bdi a="*b*"'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi a="*b*">'], '']); assert.deepStrictEqual(inspect(parser, input('c')), [['<bdi a="*b*">c'], '']); assert.deepStrictEqual(inspect(parser, input('<bdi a b="*" *c*'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<bdi a b="*" *c*>'], '']); assert.deepStrictEqual(inspect(parser, input('d')), [['<bdi a b="*" *c*>d</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('*c*')), [['<bdi a b="*" *>*c*'], '']); assert.deepStrictEqual(inspect(parser, input('*c*')), [['<bdi a b="*" *>*c*</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input(' a')), undefined); }); it('basic', () => { assert.deepStrictEqual(inspect(parser, input('')), [[''], '']); assert.deepStrictEqual(inspect(parser, input('')), [[''], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<wbr '], ' >']); assert.deepStrictEqual(inspect(parser, input('a')), [[''], 'a']); assert.deepStrictEqual(inspect(parser, input('a')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi >a</bdi>'], '']); 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('aa')), [['a'], 'a']); assert.deepStrictEqual(inspect(parser, input('a ')), [['a '], '']); assert.deepStrictEqual(inspect(parser, input('a \n ')), [['a '], '']); assert.deepStrictEqual(inspect(parser, input('a\n')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('a\n ')), [['a '], '']); assert.deepStrictEqual(inspect(parser, input('a\n')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('a\nb')), [['a
b
'], '']); }); it('nest', () => { assert.deepStrictEqual(inspect(parser, input('[% ')), [['<bdi>[% </bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('abc')), [['abc'], '']); assert.deepStrictEqual(inspect(parser, input('`a`')), [['a'], '']); }); it('escape', () => { assert.deepStrictEqual(inspect(parser, input('')), [['<a>'], '']); assert.deepStrictEqual(inspect(parser, input('a
')), [['<a>a</a>'], '']); assert.deepStrictEqual(inspect(parser, input('abc')), [['a<a>b</a>c'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<img>'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<img>'], '']); }); it('attribute', () => { assert.deepStrictEqual(inspect(parser, input('a
')), undefined); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi \n>a</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi __proto__>a</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi constructor>a</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi toString>a</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi X>a</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdi x>a</bdi>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo >a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo __proto__>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo constructor>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo toString>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo X>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo x>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo dir>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo dir=>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo dir=rtl>a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('<bdo dir=">a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo dir="">a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo dir="rtl" dir="rtl">a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo diR="rtl">a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['a'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo dir="rtl" >a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('a')), [['<bdo dir="rtl">a</bdo>'], '']); assert.deepStrictEqual(inspect(parser, input('')), undefined); assert.deepStrictEqual(inspect(parser, input('')), [['<wbr '], '\n>']); assert.deepStrictEqual(inspect(parser, input('')), [['<wbr constructor>'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<wbr X>'], '']); assert.deepStrictEqual(inspect(parser, input('')), [['<wbr x>'], '']); }); }); });