57 lines
1.7 KiB
JavaScript
57 lines
1.7 KiB
JavaScript
// These are defined by the test:
|
|
// errors (boolean)
|
|
// encoder (function)
|
|
// ranges (array)
|
|
// expect (function)
|
|
|
|
function encode(input, expected, desc) {
|
|
// tests whether a Unicode character is converted to an equivalent byte sequence by href
|
|
// input: a Unicode character
|
|
// expected: expected byte sequence
|
|
// desc: what's being tested
|
|
subsetTest(test, function() {
|
|
var a = document.createElement("a"); // <a> uses document encoding for URL's query
|
|
a.href = "https://example.com/?" + input;
|
|
result = a.search.substr(1); // remove leading "?"
|
|
assert_equals(normalizeStr(result), normalizeStr(expected));
|
|
}, desc);
|
|
}
|
|
|
|
// set up a simple array of unicode codepoints that are not encoded
|
|
var codepoints = [];
|
|
|
|
for (var range of ranges) {
|
|
for (var i = range[0]; i < range[1]; i++) {
|
|
result = encoder(String.fromCodePoint(i));
|
|
var success = !!result;
|
|
if (errors) {
|
|
success = !success;
|
|
}
|
|
if (success) {
|
|
var item = {};
|
|
codepoints.push(item);
|
|
item.cp = i;
|
|
item.expected = expect(result, i);
|
|
item.desc = range[2] ? range[2] + " " : "";
|
|
}
|
|
}
|
|
}
|
|
|
|
// run the tests
|
|
for (var x = 0; x < codepoints.length; x++) {
|
|
encode(
|
|
String.fromCodePoint(codepoints[x].cp),
|
|
codepoints[x].expected,
|
|
codepoints[x].desc +
|
|
" U+" +
|
|
codepoints[x].cp.toString(16).toUpperCase() +
|
|
" " +
|
|
String.fromCodePoint(codepoints[x].cp) +
|
|
" " +
|
|
codepoints[x].expected
|
|
);
|
|
}
|
|
|
|
// NOTES
|
|
// this test relies on support for String.fromCodePoint, which appears to be supported by major desktop browsers
|
|
// the tests exclude ASCII characters
|