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.
239 lines
3.7 KiB
239 lines
3.7 KiB
/*===
|
|
basic test
|
|
string 1 a
|
|
string 1 b
|
|
string 1 c
|
|
string 1 A
|
|
string 1 B
|
|
string 1 C
|
|
string 1 U+0000
|
|
string 1 f
|
|
string 1 o
|
|
string 1 o
|
|
string 1 U+0081
|
|
string 1 b
|
|
string 1 a
|
|
string 1 r
|
|
string 1 U+07FF
|
|
string 1 q
|
|
string 1 u
|
|
string 1 u
|
|
string 1 x
|
|
string 1 U+1234
|
|
string 1 b
|
|
string 1 a
|
|
string 1 z
|
|
string 1 U+FEDC
|
|
string 1 x
|
|
string 1 y
|
|
string 1 z
|
|
string 1 U+FFFF
|
|
===*/
|
|
|
|
print('basic test');
|
|
|
|
function charAtTest() {
|
|
var str = new String('abcABC\u0000foo\u0081bar\u07ffquux\u1234baz\ufedcxyz\uffff');
|
|
var i;
|
|
|
|
// we want to print out ascii but don't want to rely on charCodeAt().
|
|
// use a hashmap to "stringify" the non-ascii chars
|
|
var map = {
|
|
'\u0000': 'U+0000',
|
|
'\u0081': 'U+0081',
|
|
'\u07ff': 'U+07FF',
|
|
'\u1234': 'U+1234',
|
|
'\ufedc': 'U+FEDC',
|
|
'\uffff': 'U+FFFF',
|
|
}
|
|
|
|
function pc(c) {
|
|
print(typeof c, c.length, (c >= ' ' && c <= '~' ? c : map[c]));
|
|
}
|
|
|
|
// print in order
|
|
for (i = 0; i < str.length; i++) {
|
|
pc(str.charAt(i));
|
|
}
|
|
}
|
|
|
|
try {
|
|
charAtTest();
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
/*===
|
|
oob test
|
|
-3 0
|
|
-2 0
|
|
-1 0
|
|
0 1 b
|
|
1 1 a
|
|
2 1 r
|
|
3 0
|
|
4 0
|
|
5 0
|
|
-Infinity 0
|
|
Infinity 0
|
|
NaN 1 b
|
|
===*/
|
|
|
|
print('oob test');
|
|
|
|
function outOfBoundsTest() {
|
|
var str = new String('bar');
|
|
var i;
|
|
|
|
function pc(idx) {
|
|
var c = str.charAt(idx);
|
|
print(idx, c.length, c);
|
|
}
|
|
|
|
for (i = -3; i < 6; i++) {
|
|
pc(i);
|
|
}
|
|
|
|
pc(Number.NEGATIVE_INFINITY),
|
|
pc(Number.POSITIVE_INFINITY),
|
|
|
|
// ToInteger(NaN) coerces to 0 -> 'b'
|
|
pc(Number.NaN);
|
|
}
|
|
|
|
try {
|
|
outOfBoundsTest();
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
/*===
|
|
random access test
|
|
random access test done
|
|
===*/
|
|
|
|
/* Random access test for a large string. The purpose of this test is to
|
|
* stress the stringcache. Note that the test is not deterministic.
|
|
*/
|
|
|
|
print('random access test');
|
|
|
|
function randomAccessTest() {
|
|
var tmp = [];
|
|
var str;
|
|
var i;
|
|
var idx, c1, c2;
|
|
|
|
for (i = 0; i < 65536; i++) {
|
|
tmp.push(String.fromCharCode(i));
|
|
}
|
|
str = new String(tmp.join(''));
|
|
|
|
for (i = 0; i < 100000; i++) {
|
|
idx = Math.floor(Math.random() * 65536);
|
|
c1 = str.charAt(idx);
|
|
c2 = String.fromCharCode(idx); // XXX: unfortunately we depend on this too
|
|
if (c1 !== c2) {
|
|
print('random access test failed for index', idx);
|
|
}
|
|
}
|
|
|
|
print('random access test done');
|
|
}
|
|
|
|
try {
|
|
randomAccessTest();
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
/*===
|
|
coercion
|
|
testing undefined
|
|
TypeError
|
|
testing null
|
|
TypeError
|
|
testing true
|
|
0 string t
|
|
1 string r
|
|
2 string u
|
|
3 string e
|
|
testing false
|
|
0 string f
|
|
1 string a
|
|
2 string l
|
|
3 string s
|
|
4 string e
|
|
testing 123
|
|
0 string 1
|
|
1 string 2
|
|
2 string 3
|
|
testing foo
|
|
0 string f
|
|
1 string o
|
|
2 string o
|
|
testing 1,2
|
|
0 string 1
|
|
1 string ,
|
|
2 string 2
|
|
testing [object Object]
|
|
0 string [
|
|
1 string o
|
|
2 string b
|
|
3 string j
|
|
4 string e
|
|
5 string c
|
|
6 string t
|
|
7 string
|
|
8 string O
|
|
9 string b
|
|
10 string j
|
|
11 string e
|
|
12 string c
|
|
13 string t
|
|
14 string ]
|
|
===*/
|
|
|
|
/* charAt() is generic, check 'this' coercion */
|
|
|
|
print('coercion');
|
|
|
|
function thisCoercionTest() {
|
|
function test(x) {
|
|
var c;
|
|
var i;
|
|
|
|
print('testing', x);
|
|
try {
|
|
for (i = 0; ; i++) {
|
|
c = String.prototype.charAt.call(x, i);
|
|
if (c === '') {
|
|
break;
|
|
}
|
|
print(i, typeof c, c);
|
|
}
|
|
} catch (e) {
|
|
print(e.name);
|
|
}
|
|
}
|
|
|
|
// undefined and null cause TypeError from CheckObjectCoercible
|
|
|
|
test(undefined);
|
|
test(null);
|
|
|
|
test(true);
|
|
test(false);
|
|
test(123);
|
|
test('foo');
|
|
test([1,2]);
|
|
test({ foo: 1, bar: 2 });
|
|
}
|
|
|
|
try {
|
|
thisCoercionTest();
|
|
} catch (e) {
|
|
print(e);
|
|
}
|
|
|
|
|
|
|