mirror of
https://github.com/meteor/meteor.git
synced 2026-05-02 03:01:46 -04:00
115 lines
4.0 KiB
JavaScript
115 lines
4.0 KiB
JavaScript
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]);
|
|
|
|
});
|