var Scanner = HTMLTools.Scanner; var getCharacterReference = HTMLTools.Parse.getCharacterReference; Tinytest.add("html-tools - entities", function (test) { var succeed = function (input, match, codepoints) { if (typeof input === 'string') input = {input: input}; // match arg is optional; codepoints is never a string if (typeof match !== 'string') { codepoints = match; match = input.input; } var scanner = new Scanner(input.input); var result = getCharacterReference(scanner, input.inAttribute, input.allowedChar); test.isTrue(result); test.equal(scanner.pos, match.length); test.equal(result, { t: 'CharRef', v: match, cp: _.map(codepoints, function (x) { return (typeof x === 'string' ? x.charCodeAt(0) : x); }) }); }; var ignore = function (input) { if (typeof input === 'string') input = {input: input}; var scanner = new Scanner(input.input); var result = getCharacterReference(scanner, input.inAttribute, input.allowedChar); test.isFalse(result); test.equal(scanner.pos, 0); }; var fatal = function (input, messageContains) { if (typeof input === 'string') input = {input: input}; var scanner = new Scanner(input.input); var error; try { getCharacterReference(scanner, input.inAttribute, input.allowedChar); } catch (e) { error = e; } test.isTrue(error); if (error) test.isTrue(messageContains && error.message.indexOf(messageContains) >= 0, error.message); }; ignore('a'); ignore('&'); ignore('&&'); ignore('&\t'); ignore('& '); fatal('&#', 'Invalid numerical character reference starting with &#'); ignore('&a'); fatal('&a;', 'Invalid character reference: &a;'); ignore({input: '&"', allowedChar: '"'}); ignore('&"'); succeed('>', ['>']); fatal('>', 'Character reference requires semicolon'); ignore('&aaa'); fatal('>a', 'Character reference requires semicolon'); ignore({input: '>a', inAttribute: true}); fatal({input: '>=', inAttribute: true}, 'Character reference requires semicolon: >'); succeed('>;', '>', ['>']); fatal('&asdflkj;', 'Invalid character reference: &asdflkj;'); fatal('&A0asdflkj;', 'Invalid character reference: &A0asdflkj;'); ignore('&A0asdflkj'); succeed('𝕫', [120171]); succeed('∾̳', [8766, 819]); succeed(' ', [10]); fatal(' ', 'Invalid numerical character reference starting with &#'); fatal('&#xg;', 'Invalid numerical character reference starting with &#'); fatal('&#;', 'Invalid numerical character reference starting with &#'); fatal('&#a;', 'Invalid numerical character reference starting with &#'); fatal('&#a', 'Invalid numerical character reference starting with &#'); fatal('&#z', 'Invalid numerical character reference starting with &#'); succeed(' ', [10]); fatal('�', 'Numerical character reference too large: 1000000000010'); succeed(' ', [10]); fatal('�', 'Numerical character reference too large: 0x100000000000a'); succeed(' ', [10]); succeed(' ', [10]); succeed(' ', [10]); succeed(' ', [10]); succeed(' ', [10]); fatal('�', 'Illegal codepoint in numerical character reference: �'); fatal('�', 'Illegal codepoint in numerical character reference: �'); fatal(' ', 'Illegal codepoint in numerical character reference: '); succeed(' ', [12]); fatal(' ', 'Illegal codepoint in numerical character reference: '); succeed(' ', [12]); fatal('􏿿', 'Illegal codepoint in numerical character reference'); fatal('􏿾', 'Illegal codepoint in numerical character reference'); succeed('􏿽', [0x10fffd]); fatal('􏿿', 'Illegal codepoint in numerical character reference'); fatal('􏿾', 'Illegal codepoint in numerical character reference'); succeed('􏿽', [0x10fffd]); });