1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
function testBuiltinInstanceIsInstanceOf(instance, builtin, class_) {
assertEq(instance instanceof class_, true);
assertEq(instance instanceof builtin, true);
if (builtin === Array)
assertEq(Array.isArray(instance), true);
}
function testBuiltinInstance(builtin, ...args) {
class sub extends builtin {
constructor(...args) {
super(...args);
this.called = true;
}
}
let instance = new sub(...args);
assertEq(instance.called, true);
testBuiltinInstanceIsInstanceOf(instance, builtin, sub);
}
function testBuiltinMultipleSubclasses(builtin, ...args) {
function f(obj, prop) {
assertEq(obj.prop, prop);
}
class sub1 extends builtin { };
class sub2 extends builtin { };
const prop1 = "A";
const prop2 = "B";
sub1.prototype.prop = prop1;
sub2.prototype.prop = prop2;
let instance1 = new sub1(...args);
let instance2 = new sub2(...args);
// Also make sure we get the properties we want with a default constructor
testBuiltinInstanceIsInstanceOf(instance1, builtin, sub1);
for (let i = 0; i < 10; i++) {
f(instance1, prop1);
f(instance2, prop2);
}
}
function testBuiltin(builtin, ...args) {
testBuiltinInstance(builtin, ...args);
testBuiltinMultipleSubclasses(builtin, ...args);
}
function testBuiltinTypedArrays() {
let typedArrays = [Int8Array,
Uint8Array,
Uint8ClampedArray,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array];
for (let array of typedArrays) {
testBuiltin(array);
testBuiltin(array, 5);
testBuiltin(array, new array());
testBuiltin(array, new ArrayBuffer());
}
}
testBuiltin(Function);
testBuiltin(Object);
testBuiltin(Boolean);
testBuiltin(Error);
testBuiltin(EvalError);
testBuiltin(RangeError);
testBuiltin(ReferenceError);
testBuiltin(SyntaxError);
testBuiltin(TypeError);
testBuiltin(URIError);
testBuiltin(Number);
testBuiltin(Date);
testBuiltin(Date, 5);
testBuiltin(Date, 5, 10);
testBuiltin(RegExp);
testBuiltin(RegExp, /Regexp Argument/);
testBuiltin(RegExp, "String Argument");
testBuiltin(Map);
testBuiltin(Set);
testBuiltin(WeakMap);
testBuiltin(WeakSet);
testBuiltin(ArrayBuffer);
testBuiltinTypedArrays();
testBuiltin(DataView, new ArrayBuffer());
testBuiltin(DataView, new (newGlobal().ArrayBuffer)());
testBuiltin(String);
testBuiltin(Array);
testBuiltin(Array, 15);
testBuiltin(Array, 3.0);
testBuiltin(Array, "non-length one-arg");
testBuiltin(Array, 5, 10, 15, "these are elements");
// More Promise subclassing tests can be found in ecma_6/Promise/promise-subclassing.js
if (typeof Promise !== "undefined")
testBuiltin(Promise, _=>{});
if (this.SharedArrayBuffer)
testBuiltin(SharedArrayBuffer);
if (typeof reportCompare === 'function')
reportCompare(0,0,"OK");
|