| // 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 |