|
|
|
/*
|
|
|
|
* Basic toLowerCase() tests. Brute-force tests cover these conversions
|
|
|
|
* in much more detail.
|
|
|
|
*/
|
|
|
|
|
|
|
|
function dumpString(x) {
|
|
|
|
var tmp = [];
|
|
|
|
for (var i = 0; i < x.length; i++) {
|
|
|
|
tmp.push(x.charCodeAt(i));
|
|
|
|
}
|
|
|
|
print(typeof x, x.length, tmp.join(' '));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*===
|
|
|
|
abcd
|
|
|
|
228
|
|
|
|
===*/
|
|
|
|
|
|
|
|
function basicTest() {
|
|
|
|
print('AbCd'.toLowerCase());
|
|
|
|
print('\u00c4'.toLowerCase().charCodeAt(0)); // U+00C4 (A with dots) -> U+00E4 (a with dots) = 228
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
basicTest();
|
|
|
|
} catch (e) {
|
|
|
|
print(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*===
|
|
|
|
string 3 57 963 33
|
|
|
|
string 2 963 33
|
|
|
|
string 3 97 962 33
|
|
|
|
string 2 97 962
|
|
|
|
string 3 97 963 97
|
|
|
|
===*/
|
|
|
|
|
|
|
|
/* Context/language specific rules. Currently locale/language specific
|
|
|
|
* rules don't apply (specific locales are not implemented), but general
|
|
|
|
* context sensitive rules do apply.
|
|
|
|
*/
|
|
|
|
|
|
|
|
function greekSigmaTest() {
|
|
|
|
var str, t;
|
|
|
|
|
|
|
|
/* Context specific Greek sigma rule. This is a rather difficult rule to
|
|
|
|
* implement (for example, it requires neighboring codepoints to be tested
|
|
|
|
* against 'Unicode letter' which is not needed elsewhere).
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Prev is not a letter, curr is U+03A3 (Greek capital letter sigma), next is not letter.
|
|
|
|
// Here the sigma occurs at the end but is the single letter in the "word", so the special
|
|
|
|
// rule does not apply.
|
|
|
|
dumpString(('9\u03a3!').toLowerCase());
|
|
|
|
|
|
|
|
// Prev does not exist, next is not a letter -> same case.
|
|
|
|
dumpString(('\u03a3!').toLowerCase());
|
|
|
|
|
|
|
|
// Prev is a letter, next is not a letter -> rule applies (end of word)
|
|
|
|
dumpString(('A\u03a3!').toLowerCase());
|
|
|
|
|
|
|
|
// Prev is a letter, next does not exist -> same case.
|
|
|
|
dumpString(('A\u03a3').toLowerCase());
|
|
|
|
|
|
|
|
// Prev is a letter, next is a letter -> in the middle of the word rule should no longer apply
|
|
|
|
dumpString(('A\u03a3A').toLowerCase());
|
|
|
|
}
|
|
|
|
|
|
|
|
function localeTest() {
|
|
|
|
var str, t;
|
|
|
|
|
|
|
|
// XXX: add locale specific test and ensure locale specific rules do not apply
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
greekSigmaTest();
|
|
|
|
} catch (e) {
|
|
|
|
print(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
localeTest();
|
|
|
|
} catch (e) {
|
|
|
|
print(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*===
|
|
|
|
TypeError
|
|
|
|
TypeError
|
|
|
|
string 4 true
|
|
|
|
string 5 false
|
|
|
|
string 3 123
|
|
|
|
string 6 foobar
|
|
|
|
string 9 1,foo,bar
|
|
|
|
string 15 [object object]
|
|
|
|
===*/
|
|
|
|
|
|
|
|
function coercionTest() {
|
|
|
|
function test(str) {
|
|
|
|
var t;
|
|
|
|
|
|
|
|
try {
|
|
|
|
t = String.prototype.toLowerCase.call(str);
|
|
|
|
print(typeof t, t.length, t);
|
|
|
|
} catch (e) {
|
|
|
|
print(e.name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
test(undefined);
|
|
|
|
test(null);
|
|
|
|
test(true);
|
|
|
|
test(false);
|
|
|
|
test(123.0);
|
|
|
|
test('FoObAr');
|
|
|
|
test([1,'fOO','Bar']);
|
|
|
|
test({ foo: 1, bar: 2 });
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
coercionTest();
|
|
|
|
} catch (e) {
|
|
|
|
print(e);
|
|
|
|
}
|