OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. |
| 3 // |
| 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions |
| 6 // are met: |
| 7 // 1. Redistributions of source code must retain the above copyright |
| 8 // notice, this list of conditions and the following disclaimer. |
| 9 // 2. Redistributions in binary form must reproduce the above copyright |
| 10 // notice, this list of conditions and the following disclaimer in the |
| 11 // documentation and/or other materials provided with the distribution. |
| 12 // |
| 13 // THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND AN
Y |
| 14 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| 15 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| 16 // DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR AN
Y |
| 17 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| 18 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| 19 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND O
N |
| 20 // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 21 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| 22 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 23 |
| 24 description("KDE JS Test"); |
| 25 // 15.4 Array Objects |
| 26 // (c) 2001 Harri Porten <porten@kde.org> |
| 27 |
| 28 shouldBe("Array().length", "0"); |
| 29 shouldBe("(new Array()).length", "0"); |
| 30 shouldBe("(new Array(3)).length", "3"); |
| 31 shouldBe("(new Array(11, 22)).length", "2"); |
| 32 shouldBe("(new Array(11, 22))[0]", "11"); |
| 33 shouldBe("Array(11, 22)[1]", "22"); |
| 34 shouldBeUndefined("(new Array(11, 22))[3]"); |
| 35 shouldBe("String(new Array(11, 22))", "'11,22'"); |
| 36 shouldBe("var a = []; a[0] = 33; a[0]", "33"); |
| 37 shouldBe("var a = []; a[0] = 33; a.length", "1"); |
| 38 shouldBe("var a = [11, 22]; a.length = 1; String(a);", "'11'"); |
| 39 shouldBe("var a = [11, 22]; a.length = 1; a.length;", "1"); |
| 40 |
| 41 // range checks |
| 42 var caught = false; |
| 43 var ename = ""; |
| 44 try { |
| 45 [].length = -1; |
| 46 } catch (e) { |
| 47 // expect Range Error |
| 48 caught = true; |
| 49 ename = e.name; |
| 50 } |
| 51 |
| 52 shouldBeTrue("caught;"); |
| 53 shouldBe("ename", "'RangeError'"); |
| 54 |
| 55 caught = false; |
| 56 ename = ""; |
| 57 try { |
| 58 new Array(Infinity); |
| 59 } catch (e) { |
| 60 // expect Range Error |
| 61 caught = true; |
| 62 ename = e.name; |
| 63 } |
| 64 shouldBeTrue("caught;"); |
| 65 shouldBe("ename", "'RangeError'"); |
| 66 |
| 67 shouldBeUndefined("var a = [11, 22]; a.length = 1; a[1];"); |
| 68 shouldBe("Array().toString()", "''"); |
| 69 shouldBe("Array(3).toString()", "',,'"); |
| 70 shouldBe("Array(11, 22).toString()", "'11,22'"); |
| 71 shouldBe("String(Array(11, 22).concat(33))", "'11,22,33'"); |
| 72 shouldBe("String(Array(2).concat(33, 44))", "',,33,44'"); |
| 73 shouldBe("String(Array(2).concat(Array(2)))", "',,,'"); |
| 74 shouldBe("String(Array(11,22).concat(Array(33,44)))", "'11,22,33,44'"); |
| 75 shouldBe("String(Array(1,2).concat(3,Array(4,5)))", "'1,2,3,4,5'"); |
| 76 shouldBe("var a = new Array(1,2,3); delete a[1]; String(a.concat(4))", "'1,,3,4'
"); |
| 77 |
| 78 shouldBe("[1,2,3,4].slice(1, 3).toString()", "'2,3'"); |
| 79 shouldBe("[1,2,3,4].slice(-3, -1).toString()", "'2,3'"); |
| 80 shouldBe("[1,2].slice(-9, 0).length", "0"); |
| 81 shouldBe("[1,2].slice(1).toString()", "'2'"); |
| 82 shouldBe("[1,2].slice().toString()", "'1,2'"); |
| 83 |
| 84 // 2nd set. |
| 85 shouldBe("(new Array('a')).length", "1"); |
| 86 shouldBe("(new Array('a'))[0]", "'a'"); |
| 87 shouldBeUndefined("(new Array('a'))[1]"); |
| 88 |
| 89 shouldBe("Array('a').length", "1"); |
| 90 shouldBe("Array('a')[0]", "'a'"); |
| 91 |
| 92 shouldBe("String(Array())", "''"); |
| 93 shouldBe("String(Array('a','b'))", "'a,b'"); |
| 94 |
| 95 shouldBe("[].length", "0"); |
| 96 shouldBe("['a'].length", "1"); |
| 97 shouldBe("['a'][0]", "'a'"); |
| 98 shouldBe("['a',,'c'][2]", "'c'"); |
| 99 shouldBe("['a',undefined,'c'][1]", "undefined"); |
| 100 shouldBe("['a',,'c'][1]", "undefined"); |
| 101 shouldBe("1 in ['a',,'c']", "false"); |
| 102 shouldBe("1 in ['a',undefined,'c']", "true"); |
| 103 |
| 104 var arrayWithDeletion = ['a','b','c']; |
| 105 delete arrayWithDeletion[1]; |
| 106 shouldBe("1 in arrayWithDeletion", "false"); |
| 107 |
| 108 function forInSum(_a) { |
| 109 var s = ''; |
| 110 for (i in _a) |
| 111 s += _a[i]; |
| 112 return s; |
| 113 } |
| 114 |
| 115 shouldBe("forInSum([])", "''"); |
| 116 shouldBe("forInSum(Array())", "''"); |
| 117 shouldBe("forInSum(Array('a'))", "'a'"); |
| 118 shouldBe("forInSum([,undefined,'x','aa'])", "'undefinedxaa'"); |
| 119 |
| 120 var a0 = []; |
| 121 shouldBe("forInSum(a0)", "''"); |
| 122 |
| 123 var a1 = [ 'a' ]; |
| 124 shouldBe("forInSum(a1)", "'a'"); |
| 125 |
| 126 shouldBe("String([].sort())", "''") |
| 127 shouldBe("String([3,1,'2'].sort())", "'1,2,3'"); |
| 128 shouldBe("String([,'x','aa'].sort())", "'aa,x,'"); |
| 129 shouldBe("String([,undefined,'x','aa'].sort())", "'aa,x,,'"); |
| 130 shouldBe("2 in [,undefined,'x','aa'].sort()", "true"); |
| 131 shouldBe("3 in [,undefined,'x','aa'].sort()", "false"); |
| 132 |
| 133 // sort by length |
| 134 function comp(a, b) { |
| 135 var la = String(a).length; |
| 136 var lb = String(b).length; |
| 137 if (la < lb) |
| 138 return -1; |
| 139 else if (la > lb) |
| 140 return 1; |
| 141 else |
| 142 return 0; |
| 143 } |
| 144 shouldBe("var a = ['aa', 'b', 'cccc', 'ddd']; String(a.sort(comp))", "'b,aa,ddd,
cccc'"); |
| 145 |
| 146 // +/-Infinity as function return value |
| 147 shouldBe("[0, Infinity].sort(function(a, b) { return a - b }).toString()", "'0,I
nfinity'"); |
| 148 |
| 149 // Array.unshift() |
| 150 shouldBe("[].unshift('a')", "1"); |
| 151 shouldBe("['c'].unshift('a', 'b')", "3"); |
| 152 shouldBe("var a = []; a.unshift('a'); String(a)", "'a'"); |
| 153 shouldBe("var a = ['c']; a.unshift('a', 'b'); String(a)", "'a,b,c'"); |
| 154 |
| 155 // Array.splice() |
| 156 shouldBe("String(['a', 'b', 'c'].splice(1, 2, 'x', 'y'))", "'b,c'"); |
| 157 |
| 158 var maxint = Math.pow(2,32)-1; |
| 159 var arr = new Array(); |
| 160 |
| 161 // 2^32 should not be treated as a valid array index, i.e. |
| 162 // setting the property on the array should not result in |
| 163 // the length being modified |
| 164 |
| 165 arr.length = 40; |
| 166 arr[maxint] = "test"; |
| 167 shouldBe("arr.length","40"); |
| 168 shouldBe("arr[maxint]","\"test\""); |
| 169 delete arr[maxint]; |
| 170 shouldBe("arr.length","40"); |
| 171 shouldBe("arr[maxint]","undefined"); |
| 172 arr[maxint-1] = "test2"; |
| 173 shouldBe("arr.length","maxint"); |
| 174 shouldBe("arr[maxint-1]","\"test2\""); |
| 175 |
| 176 // Floating point numbers also should not be treated as valid array indices. |
| 177 arr.length = 40; |
| 178 arr[55.5] = "test"; // does fit in a JSImmediate number |
| 179 arr[65.11111111111111111111111111111] = "test"; // does not fit in a JSImmediate
number |
| 180 shouldBe("arr.length","40"); |
| 181 shouldBe("arr[55.5]","\"test\""); |
| 182 shouldBe("arr[65.11111111111111111111111111111]","\"test\""); |
| 183 delete arr[55.5]; |
| 184 delete arr[65.11111111111111111111111111111]; |
| 185 shouldBe("arr.length","40"); |
| 186 shouldBe("arr[55.5]","undefined"); |
| 187 shouldBe("arr[65.11111111111111111111111111111]","undefined"); |
| 188 |
| 189 arr = new Array('a','b','c'); |
| 190 arr.__proto__ = { 1: 'x' }; |
| 191 var propnames = new Array(); |
| 192 for (i in arr) |
| 193 propnames.push(i); |
| 194 propnames.sort(); |
| 195 shouldBe("propnames.length","3"); |
| 196 shouldBe("propnames[0]","'0'"); |
| 197 shouldBe("propnames[1]","'1'"); |
| 198 shouldBe("propnames[2]","'2'"); |
| 199 |
| 200 function testToString() { |
| 201 // backup |
| 202 var backupNumberToString = Number.prototype.toString; |
| 203 var backupNumberToLocaleString = Number.prototype.toLocaleString; |
| 204 var backupRegExpToString = RegExp.prototype.toString; |
| 205 var backupRegExpToLocaleString = RegExp.prototype.toLocaleString; |
| 206 |
| 207 // change functions |
| 208 Number.prototype.toString = function() { return "toString"; } |
| 209 Number.prototype.toLocaleString = function() { return "toLocaleString"; } |
| 210 RegExp.prototype.toString = function() { return "toString2"; } |
| 211 RegExp.prototype.toLocaleString = function() { return "toLocaleString2"; } |
| 212 |
| 213 // the tests |
| 214 shouldBe("[1].toString()", "'1'"); |
| 215 shouldBe("[1].toLocaleString()", "'toLocaleString'"); |
| 216 Number.prototype.toLocaleString = "invalid"; |
| 217 shouldBe("[1].toLocaleString()", "'1'"); |
| 218 shouldBe("[/r/].toString()", "'toString2'"); |
| 219 shouldBe("[/r/].toLocaleString()", "'toLocaleString2'"); |
| 220 RegExp.prototype.toLocaleString = "invalid"; |
| 221 shouldBe("[/r/].toLocaleString()", "'toString2'"); |
| 222 |
| 223 var caught = false; |
| 224 try { |
| 225 [{ toString : 0 }].toString(); |
| 226 } catch (e) { |
| 227 caught = true; |
| 228 } |
| 229 shouldBeTrue("caught"); |
| 230 |
| 231 // restore |
| 232 Number.prototype.toString = backupNumberToString; |
| 233 Number.prototype.toLocaleString = backupNumberToLocaleString; |
| 234 RegExp.prototype.toString = backupRegExpToString; |
| 235 RegExp.prototype.toLocaleString = backupRegExpToLocaleString; |
| 236 } |
OLD | NEW |