// 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"); // 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