// Copyright 2012 Norbert Lindenberg. All rights reserved. // Copyright 2012 Mozilla Corporation. All rights reserved. // Copyright 2013 Microsoft Corporation. All rights reserved. // This code is governed by the license found in the LICENSE file. /*--- es5id: 15.5.4.9_CE description: > Tests that String.prototype.localeCompare returns 0 when comparing Strings that are considered canonically equivalent by the Unicode standard. author: Norbert Lindenberg ---*/ // pairs with characters not in Unicode 3.0 are commented out var pairs = [ // example from Unicode 5.0, section 3.7, definition D70 ["o\u0308", "ö"], // examples from Unicode 5.0, chapter 3.11 ["ä\u0323", "a\u0323\u0308"], ["a\u0308\u0323", "a\u0323\u0308"], ["ạ\u0308", "a\u0323\u0308"], ["ä\u0306", "a\u0308\u0306"], ["ă\u0308", "a\u0306\u0308"], // example from Unicode 5.0, chapter 3.12 ["\u1111\u1171\u11B6", "퓛"], // examples from UTS 10, Unicode Collation Algorithm ["Å", "Å"], ["Å", "A\u030A"], ["x\u031B\u0323", "x\u0323\u031B"], ["ự", "ụ\u031B"], ["ự", "u\u031B\u0323"], ["ự", "ư\u0323"], ["ự", "u\u0323\u031B"], // examples from UAX 15, Unicode Normalization Forms ["Ç", "C\u0327"], ["q\u0307\u0323", "q\u0323\u0307"], ["가", "\u1100\u1161"], ["Å", "A\u030A"], ["Ω", "Ω"], ["Å", "A\u030A"], ["ô", "o\u0302"], ["ṩ", "s\u0323\u0307"], ["ḋ\u0323", "d\u0323\u0307"], ["ḋ\u0323", "ḍ\u0307"], ["q\u0307\u0323", "q\u0323\u0307"], // examples involving supplementary characters from UCD NormalizationTest.txt // ["\uD834\uDD5E", "\uD834\uDD57\uD834\uDD65"], // ["\uD87E\uDC2B", "北"] ]; // Detect whether we are using locale-sensitive comparisons or a bitwise comparison if ("a".localeCompare("Z") < 0) { // We are using locale-sensitive comparison, so all pairs should be canonically equivalent var i; for (i = 0; i < pairs.length; i++) { var pair = pairs[i]; if (pair[0].localeCompare(pair[1]) !== 0) { $ERROR("String.prototype.localeCompare considers " + pair[0] + " (" + toU(pair[0]) + ") ≠ " + pair[1] + " (" + toU(pair[1]) + ")."); } } } else { // We are using bitwise comparison, so all pairs should not be equivalent var i; for (i = 0; i < pairs.length; i++) { var pair = pairs[i]; if (pair[0].localeCompare(pair[1]) === 0) { $ERROR("String.prototype.localeCompare considers " + pair[0] + " (" + toU(pair[0]) + ") = " + pair[1] + " (" + toU(pair[1]) + ")."); } } } function toU(s) { var result = ""; var escape = "\\u0000"; var i; for (i = 0; i < s.length; i++) { var hex = s.charCodeAt(i).toString(16); result += escape.substring(0, escape.length - hex.length) + hex; } return result; }