blob: f9dae4948eff377756950e056722257072cf5cae [file] [log] [blame]
function unicode(value) {
return value.split('').map((val) => "\\u" + ("0000" + val.charCodeAt(0).toString(16)).slice(-4)).join('');
}
function shouldBe(actual, expected) {
if (actual !== expected)
throw new Error(`bad value: ${unicode(String(actual))}`);
}
function shouldThrow(func, errorMessage) {
var errorThrown = false;
var error = null;
try {
func();
} catch (e) {
errorThrown = true;
error = e;
}
if (!errorThrown)
throw new Error('not thrown');
if (String(error) !== errorMessage)
throw new Error(`bad error: ${String(error)}`);
}
shouldBe(String.prototype.hasOwnProperty('normalize'), true);
shouldBe(String.prototype.hasOwnProperty.length, 1);
shouldBe(Object.getOwnPropertyDescriptor(String.prototype, 'normalize').writable, true);
shouldBe(Object.getOwnPropertyDescriptor(String.prototype, 'normalize').enumerable, false);
shouldBe(Object.getOwnPropertyDescriptor(String.prototype, 'normalize').configurable, true);
shouldThrow(() => {
"Test".normalize("Invalid");
}, `RangeError: argument does not match any normalization form`);
function normalizeTest(original, defaultValue, nfc, nfd, nfkc, nfkd) {
shouldBe(original.normalize(), defaultValue);
shouldBe(original.normalize("NFC"), nfc);
shouldBe(original.normalize("NFD"), nfd);
shouldBe(original.normalize("NFKC"), nfkc);
shouldBe(original.normalize("NFKD"), nfkd);
}
{
let text = "Cocoa";
normalizeTest(text, text, text, text, text, text);
}
{
// うさぎ
// \u3046\u3055\u304e
let text = "\u3046\u3055\u304e";
normalizeTest(text, text, text, "\u3046\u3055\u304d\u3099", text, "\u3046\u3055\u304d\u3099");
}
{
// é
let text = "\u00e9";
normalizeTest(text, text, text, "\u0065\u0301", text, "\u0065\u0301");
}
{
// http://unicode.org/faq/normalization.html#6
let text = "\u03d3";
normalizeTest(text, text, text, "\u03d2\u0301", "\u038e", "\u03a5\u0301");
}
{
// http://unicode.org/faq/normalization.html#6
let text = "\u03d4";
normalizeTest(text, text, text, "\u03d2\u0308", "\u03ab", "\u03a5\u0308");
}
{
// http://unicode.org/faq/normalization.html#6
let text = "\u1e9b";
normalizeTest(text, text, text, "\u017f\u0307", "\u1e61", "\u0073\u0307");
}
{
// http://unicode.org/faq/normalization.html#6
let text = "\u1e9b";
normalizeTest(text, text, text, "\u017f\u0307", "\u1e61", "\u0073\u0307");
}
{
// http://unicode.org/faq/normalization.html#12
normalizeTest("\ud834\udd60",
"\ud834\udd58\ud834\udd65\ud834\udd6e",
"\ud834\udd58\ud834\udd65\ud834\udd6e",
"\ud834\udd58\ud834\udd65\ud834\udd6e",
"\ud834\udd58\ud834\udd65\ud834\udd6e",
"\ud834\udd58\ud834\udd65\ud834\udd6e");
normalizeTest("\uFB2C",
"\u05e9\u05bc\u05c1",
"\u05e9\u05bc\u05c1",
"\u05e9\u05bc\u05c1",
"\u05e9\u05bc\u05c1",
"\u05e9\u05bc\u05c1",
"\u05e9\u05bc\u05c1"
);
normalizeTest("\u0390",
"\u0390",
"\u0390",
"\u03b9\u0308\u0301",
"\u0390",
"\u03b9\u0308\u0301"
);
normalizeTest("\u1F82",
"\u1f82",
"\u1f82",
"\u03b1\u0313\u0300\u0345",
"\u1f82",
"\u03b1\u0313\u0300\u0345"
);
normalizeTest("\uFDFA",
"\ufdfa",
"\ufdfa",
"\ufdfa",
"\u0635\u0644\u0649\u0020\u0627\u0644\u0644\u0647\u0020\u0639\u0644\u064a\u0647\u0020\u0648\u0633\u0644\u0645",
"\u0635\u0644\u0649\u0020\u0627\u0644\u0644\u0647\u0020\u0639\u0644\u064a\u0647\u0020\u0648\u0633\u0644\u0645"
);
}