2007-10-21 Mark Rowe <mrowe@apple.com>
[WebKit-https.git] / LayoutTests / fast / js / kde / resources / Array.js
1 // 15.4 Array Objects
2 // (c) 2001 Harri Porten <porten@kde.org>
3
4 shouldBe("Array().length", "0");
5 shouldBe("(new Array()).length", "0");
6 shouldBe("(new Array(3)).length", "3");
7 shouldBe("(new Array(11, 22)).length", "2");
8 shouldBe("(new Array(11, 22))[0]", "11");
9 shouldBe("Array(11, 22)[1]", "22");
10 shouldBeUndefined("(new Array(11, 22))[3]");
11 shouldBe("String(new Array(11, 22))", "'11,22'");
12 shouldBe("var a = []; a[0] = 33; a[0]", "33");
13 shouldBe("var a = []; a[0] = 33; a.length", "1");
14 shouldBe("var a = [11, 22]; a.length = 1; String(a);", "'11'");
15 shouldBe("var a = [11, 22]; a.length = 1; a.length;", "1");
16
17 // range checks
18 var caught = false;
19 var ename = "";
20 try {
21   [].length = -1;
22 } catch (e) {
23   // expect Range Error
24   caught = true;
25   ename = e.name;
26 }
27
28 shouldBeTrue("caught;");
29 shouldBe("ename", "'RangeError'");
30
31 caught = false;
32 ename = "";
33 try {
34   new Array(Infinity);
35 } catch (e) {
36   // expect Range Error
37   caught = true;
38   ename = e.name;
39 }
40 shouldBeTrue("caught;");
41 shouldBe("ename", "'RangeError'");
42
43 shouldBeUndefined("var a = [11, 22]; a.length = 1; a[1];");
44 shouldBe("Array().toString()", "''");
45 shouldBe("Array(3).toString()", "',,'");
46 shouldBe("Array(11, 22).toString()", "'11,22'");
47 shouldBe("String(Array(11, 22).concat(33))", "'11,22,33'");
48 shouldBe("String(Array(2).concat(33, 44))", "',,33,44'");
49 shouldBe("String(Array(2).concat(Array(2)))", "',,,'");
50 shouldBe("String(Array(11,22).concat(Array(33,44)))", "'11,22,33,44'");
51 shouldBe("String(Array(1,2).concat(3,Array(4,5)))", "'1,2,3,4,5'");
52 shouldBe("var a = new Array(1,2,3); delete a[1]; String(a.concat(4))", "'1,,3,4'");
53
54 shouldBe("[1,2,3,4].slice(1, 3).toString()", "'2,3'");
55 shouldBe("[1,2,3,4].slice(-3, -1).toString()", "'2,3'");
56 shouldBe("[1,2].slice(-9, 0).length", "0");
57 shouldBe("[1,2].slice(1).toString()", "'2'");
58 shouldBe("[1,2].slice().toString()", "'1,2'");
59
60 // 2nd set.
61 shouldBe("(new Array('a')).length", "1");
62 shouldBe("(new Array('a'))[0]", "'a'");
63 shouldBeUndefined("(new Array('a'))[1]");
64
65 shouldBe("Array('a').length", "1");
66 shouldBe("Array('a')[0]", "'a'");
67
68 shouldBe("String(Array())", "''");
69 shouldBe("String(Array('a','b'))", "'a,b'");
70
71 shouldBe("[].length", "0");
72 shouldBe("['a'].length", "1");
73 shouldBe("['a'][0]", "'a'");
74 shouldBe("['a',,'c'][2]", "'c'");
75
76 function forInSum(_a) {
77   var s = '';
78   for (i in _a)
79     s += _a[i];
80   return s;
81 }
82
83 shouldBe("forInSum([])", "''");
84 shouldBe("forInSum(Array())", "''");
85 shouldBe("forInSum(Array('a'))", "'a'");
86
87 var a0 = [];
88 shouldBe("forInSum(a0)", "''");
89
90 var a1 = [ 'a' ];
91 shouldBe("forInSum(a1)", "'a'");
92
93 shouldBe("String([].sort())", "''")
94 shouldBe("String([3,1,'2'].sort())", "'1,2,3'");
95 shouldBe("String([,'x','aa'].sort())", "'aa,x,'"); // don't assume 'x'>undefined !
96
97 // sort by length
98 function comp(a, b) {
99   var la = String(a).length;
100   var lb = String(b).length;
101   if (la < lb)
102     return -1;
103   else if (la > lb)
104     return 1;
105   else
106     return 0;
107 }
108 shouldBe("var a = ['aa', 'b', 'cccc', 'ddd']; String(a.sort(comp))", "'b,aa,ddd,cccc'");
109
110 // +/-Infinity as function return value
111 shouldBe("[0, Infinity].sort(function(a, b) { return a - b }).toString()", "'0,Infinity'");
112
113 // Array.unshift()
114 shouldBe("[].unshift('a')", "1");
115 shouldBe("['c'].unshift('a', 'b')", "3");
116 shouldBe("var a = []; a.unshift('a'); String(a)", "'a'");
117 shouldBe("var a = ['c']; a.unshift('a', 'b'); String(a)", "'a,b,c'");
118
119 // Array.splice()
120 shouldBe("String(['a', 'b', 'c'].splice(1, 2, 'x', 'y'))", "'b,c'");
121
122 var maxint = Math.pow(2,32)-1;
123 var arr = new Array();
124
125 // 2^32 should not be treated as a valid array index, i.e.
126 // setting the property on the array should not result in
127 // the length being modified
128
129 arr.length = 40;
130 arr[maxint] = "test";
131 shouldBe("arr.length","40");
132 shouldBe("arr[maxint]","\"test\"");
133 delete arr[maxint];
134 shouldBe("arr.length","40");
135 shouldBe("arr[maxint]","undefined");
136 arr[maxint-1] = "test2";
137 shouldBe("arr.length","maxint");
138 shouldBe("arr[maxint-1]","\"test2\"");
139
140 arr = new Array('a','b','c');
141 arr.__proto__ = { 1: 'x' };
142 var propnames = new Array();
143 for (i in arr)
144   propnames.push(i);
145 propnames.sort();
146 shouldBe("propnames.length","3");
147 shouldBe("propnames[0]","'0'");
148 shouldBe("propnames[1]","'1'");
149 shouldBe("propnames[2]","'2'");
150
151 function testToString() {
152   // backup
153   var backupNumberToString = Number.prototype.toString;
154   var backupNumberToLocaleString = Number.prototype.toLocaleString;
155   var backupRegExpToString = RegExp.prototype.toString;
156   var backupRegExpToLocaleString = RegExp.prototype.toLocaleString;
157
158   // change functions
159   Number.prototype.toString = function() { return "toString"; }
160   Number.prototype.toLocaleString = function() { return "toLocaleString"; }
161   RegExp.prototype.toString = function() { return "toString2"; }
162   RegExp.prototype.toLocaleString = function() { return "toLocaleString2"; }
163
164   // the tests
165   shouldBe("[1].toString()", "'1'");
166   shouldBe("[1].toLocaleString()", "'toLocaleString'");
167   Number.prototype.toLocaleString = "invalid";
168   shouldBe("[1].toLocaleString()", "'1'");
169   shouldBe("[/r/].toString()", "'toString2'");
170   shouldBe("[/r/].toLocaleString()", "'toLocaleString2'");
171   RegExp.prototype.toLocaleString = "invalid";
172   shouldBe("[/r/].toLocaleString()", "'toString2'");
173
174   var caught = false;
175   try {
176     [{ toString : 0 }].toString();
177   } catch (e) {
178     caught = true;
179   }
180   shouldBeTrue("caught");
181
182   // restore
183   Number.prototype.toString = backupNumberToString;
184   Number.prototype.toLocaleString = backupNumberToLocaleString;
185   RegExp.prototype.toString = backupRegExpToString;
186   RegExp.prototype.toLocaleString = backupRegExpToLocaleString;
187 }
188
189 successfullyParsed = true