mirror of https://github.com/svaarala/duktape.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
2.9 KiB
145 lines
2.9 KiB
/*
|
|
* Misc tests for String.fromCharCode(), String.prototype.charAt(), and
|
|
* String.prototype.charCodeAt().
|
|
*/
|
|
|
|
var text;
|
|
|
|
/*===
|
|
65
|
|
65
|
|
0
|
|
0
|
|
1
|
|
0
|
|
0
|
|
0
|
|
0
|
|
===*/
|
|
|
|
/* ToUint16 coercion means wrapping. The following coerce to zero:
|
|
* undefined, null, false, NaN, +Inf, -Inf. A true value coerces to
|
|
* 1.
|
|
*/
|
|
|
|
print(String.fromCharCode(65).charCodeAt(0));
|
|
print(String.fromCharCode(65536 + 65).charCodeAt(0));
|
|
print(String.fromCharCode(undefined).charCodeAt(0));
|
|
print(String.fromCharCode(null).charCodeAt(0));
|
|
print(String.fromCharCode(true).charCodeAt(0));
|
|
print(String.fromCharCode(false).charCodeAt(0));
|
|
print(String.fromCharCode(NaN).charCodeAt(0));
|
|
print(String.fromCharCode(Number.POSITIVE_INFINITY).charCodeAt(0));
|
|
print(String.fromCharCode(Number.NEGATIVE_INFINITY).charCodeAt(0));
|
|
|
|
/*===
|
|
You can fool all the people some of the time, and some of the people all the time, but you cannot fool all the people all the time.
|
|
===*/
|
|
|
|
/* Building a larger string at once */
|
|
|
|
var test = "You can fool all the people some of the time, and some of the people all the time, but you cannot fool all the people all the time.";
|
|
|
|
var codepoints = [];
|
|
|
|
for (var i in test) {
|
|
codepoints[codepoints.length] = test.charCodeAt(i);
|
|
}
|
|
|
|
print(String.fromCharCode.apply(null, codepoints));
|
|
|
|
/*===
|
|
f
|
|
o
|
|
o
|
|
|
|
|
|
f
|
|
f
|
|
f
|
|
o
|
|
f
|
|
|
|
|
|
string
|
|
string
|
|
===*/
|
|
|
|
/* Reading from out of bounds yields an empty string from charAt().
|
|
* Index coercion is ToInteger(), which coerces NaN to zero but
|
|
* leaves infinities as is. Undefined/null/false coerce to zero,
|
|
* true coerces to 1.
|
|
*
|
|
* Note that this coercion differs from fromCharCode() which uses
|
|
* ToUint16().
|
|
*/
|
|
text = 'foo';
|
|
|
|
print(text.charAt(0));
|
|
print(text.charAt(1));
|
|
print(text.charAt(2));
|
|
print(text.charAt(3));
|
|
print(text.charAt(-1));
|
|
print(text.charAt(undefined));
|
|
print(text.charAt(null));
|
|
print(text.charAt(false));
|
|
print(text.charAt(true));
|
|
print(text.charAt(NaN));
|
|
print(text.charAt(Number.POSITIVE_INFINITY)); // out of bounds
|
|
print(text.charAt(Number.NEGATIVE_INFINITY)); // out of bounds
|
|
|
|
print(typeof text.charAt(-1));
|
|
print(typeof text.charAt(3));
|
|
|
|
/* FIXME: object coercion */
|
|
|
|
/*===
|
|
98
|
|
97
|
|
114
|
|
NaN
|
|
NaN
|
|
98
|
|
98
|
|
98
|
|
97
|
|
98
|
|
NaN
|
|
NaN
|
|
===*/
|
|
|
|
/* Similar tests as above, but for charCodeAt(). Coercion is
|
|
* the same.
|
|
*/
|
|
|
|
text = 'bar';
|
|
|
|
print(text.charCodeAt(0));
|
|
print(text.charCodeAt(1));
|
|
print(text.charCodeAt(2));
|
|
print(text.charCodeAt(3));
|
|
print(text.charCodeAt(-1));
|
|
print(text.charCodeAt(undefined));
|
|
print(text.charCodeAt(null));
|
|
print(text.charCodeAt(false));
|
|
print(text.charCodeAt(true));
|
|
print(text.charCodeAt(NaN));
|
|
print(text.charCodeAt(Number.POSITIVE_INFINITY)); // out of bounds
|
|
print(text.charCodeAt(Number.NEGATIVE_INFINITY)); // out of bounds
|
|
|
|
/* FIXME: object coercion */
|
|
|
|
/*===
|
|
0
|
|
===*/
|
|
|
|
/* Test back-and-forth conversion for all 16-bit codepoints. */
|
|
|
|
var fail = 0;
|
|
|
|
for (var i = 0; i < 65536; i++) {
|
|
if (String.fromCharCode(i).charCodeAt(0) != i) {
|
|
fail++;
|
|
}
|
|
}
|
|
print(fail);
|
|
|