1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/jit-test/tests/basic/string-startswith.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,243 @@ 1.4 +/* 1.5 +* Copyright (c) 2013 Mathias Bynens. All rights reserved. 1.6 +* 1.7 +* Permission is hereby granted, free of charge, to any person obtaining a 1.8 +* copy of this software and associated documentation files (the "Software"), 1.9 +* to deal in the Software without restriction, including without limitation 1.10 +* the rights to use, copy, modify, merge, publish, distribute, sublicense, 1.11 +* and/or sell copies of the Software, and to permit persons to whom the 1.12 +* Software is furnished to do so, subject to the following conditions: 1.13 +* 1.14 +* The above copyright notice and this permission notice shall be included in 1.15 +* all copies or substantial portions of the Software. 1.16 +* 1.17 +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1.18 +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1.19 +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1.20 +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1.21 +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 1.22 +* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 1.23 +* DEALINGS IN THE SOFTWARE. 1.24 +*/ 1.25 + 1.26 +function assertThrows(fun, errorType) { 1.27 + try { 1.28 + fun(); 1.29 + assertEq(true, false, "Expected error, but none was thrown"); 1.30 + } catch (e) { 1.31 + assertEq(e instanceof errorType, true, "Wrong error type thrown"); 1.32 + } 1.33 +} 1.34 + 1.35 +Object.prototype[1] = 2; // try to break `arguments[1]` 1.36 + 1.37 +assertEq(String.prototype.startsWith.length, 1); 1.38 +assertEq(String.prototype.propertyIsEnumerable('startsWith'), false); 1.39 + 1.40 +assertEq('undefined'.startsWith(), true); 1.41 +assertEq('undefined'.startsWith(undefined), true); 1.42 +assertEq('undefined'.startsWith(null), false); 1.43 +assertEq('null'.startsWith(), false); 1.44 +assertEq('null'.startsWith(undefined), false); 1.45 +assertEq('null'.startsWith(null), true); 1.46 + 1.47 +assertEq('abc'.startsWith(), false); 1.48 +assertEq('abc'.startsWith(''), true); 1.49 +assertEq('abc'.startsWith('\0'), false); 1.50 +assertEq('abc'.startsWith('a'), true); 1.51 +assertEq('abc'.startsWith('b'), false); 1.52 +assertEq('abc'.startsWith('ab'), true); 1.53 +assertEq('abc'.startsWith('bc'), false); 1.54 +assertEq('abc'.startsWith('abc'), true); 1.55 +assertEq('abc'.startsWith('bcd'), false); 1.56 +assertEq('abc'.startsWith('abcd'), false); 1.57 +assertEq('abc'.startsWith('bcde'), false); 1.58 + 1.59 +assertEq('abc'.startsWith('', NaN), true); 1.60 +assertEq('abc'.startsWith('\0', NaN), false); 1.61 +assertEq('abc'.startsWith('a', NaN), true); 1.62 +assertEq('abc'.startsWith('b', NaN), false); 1.63 +assertEq('abc'.startsWith('ab', NaN), true); 1.64 +assertEq('abc'.startsWith('bc', NaN), false); 1.65 +assertEq('abc'.startsWith('abc', NaN), true); 1.66 +assertEq('abc'.startsWith('bcd', NaN), false); 1.67 +assertEq('abc'.startsWith('abcd', NaN), false); 1.68 +assertEq('abc'.startsWith('bcde', NaN), false); 1.69 + 1.70 +assertEq('abc'.startsWith('', false), true); 1.71 +assertEq('abc'.startsWith('\0', false), false); 1.72 +assertEq('abc'.startsWith('a', false), true); 1.73 +assertEq('abc'.startsWith('b', false), false); 1.74 +assertEq('abc'.startsWith('ab', false), true); 1.75 +assertEq('abc'.startsWith('bc', false), false); 1.76 +assertEq('abc'.startsWith('abc', false), true); 1.77 +assertEq('abc'.startsWith('bcd', false), false); 1.78 +assertEq('abc'.startsWith('abcd', false), false); 1.79 +assertEq('abc'.startsWith('bcde', false), false); 1.80 + 1.81 +assertEq('abc'.startsWith('', undefined), true); 1.82 +assertEq('abc'.startsWith('\0', undefined), false); 1.83 +assertEq('abc'.startsWith('a', undefined), true); 1.84 +assertEq('abc'.startsWith('b', undefined), false); 1.85 +assertEq('abc'.startsWith('ab', undefined), true); 1.86 +assertEq('abc'.startsWith('bc', undefined), false); 1.87 +assertEq('abc'.startsWith('abc', undefined), true); 1.88 +assertEq('abc'.startsWith('bcd', undefined), false); 1.89 +assertEq('abc'.startsWith('abcd', undefined), false); 1.90 +assertEq('abc'.startsWith('bcde', undefined), false); 1.91 + 1.92 +assertEq('abc'.startsWith('', null), true); 1.93 +assertEq('abc'.startsWith('\0', null), false); 1.94 +assertEq('abc'.startsWith('a', null), true); 1.95 +assertEq('abc'.startsWith('b', null), false); 1.96 +assertEq('abc'.startsWith('ab', null), true); 1.97 +assertEq('abc'.startsWith('bc', null), false); 1.98 +assertEq('abc'.startsWith('abc', null), true); 1.99 +assertEq('abc'.startsWith('bcd', null), false); 1.100 +assertEq('abc'.startsWith('abcd', null), false); 1.101 +assertEq('abc'.startsWith('bcde', null), false); 1.102 + 1.103 +assertEq('abc'.startsWith('', -Infinity), true); 1.104 +assertEq('abc'.startsWith('\0', -Infinity), false); 1.105 +assertEq('abc'.startsWith('a', -Infinity), true); 1.106 +assertEq('abc'.startsWith('b', -Infinity), false); 1.107 +assertEq('abc'.startsWith('ab', -Infinity), true); 1.108 +assertEq('abc'.startsWith('bc', -Infinity), false); 1.109 +assertEq('abc'.startsWith('abc', -Infinity), true); 1.110 +assertEq('abc'.startsWith('bcd', -Infinity), false); 1.111 +assertEq('abc'.startsWith('abcd', -Infinity), false); 1.112 +assertEq('abc'.startsWith('bcde', -Infinity), false); 1.113 + 1.114 +assertEq('abc'.startsWith('', -1), true); 1.115 +assertEq('abc'.startsWith('\0', -1), false); 1.116 +assertEq('abc'.startsWith('a', -1), true); 1.117 +assertEq('abc'.startsWith('b', -1), false); 1.118 +assertEq('abc'.startsWith('ab', -1), true); 1.119 +assertEq('abc'.startsWith('bc', -1), false); 1.120 +assertEq('abc'.startsWith('abc', -1), true); 1.121 +assertEq('abc'.startsWith('bcd', -1), false); 1.122 +assertEq('abc'.startsWith('abcd', -1), false); 1.123 +assertEq('abc'.startsWith('bcde', -1), false); 1.124 + 1.125 +assertEq('abc'.startsWith('', -0), true); 1.126 +assertEq('abc'.startsWith('\0', -0), false); 1.127 +assertEq('abc'.startsWith('a', -0), true); 1.128 +assertEq('abc'.startsWith('b', -0), false); 1.129 +assertEq('abc'.startsWith('ab', -0), true); 1.130 +assertEq('abc'.startsWith('bc', -0), false); 1.131 +assertEq('abc'.startsWith('abc', -0), true); 1.132 +assertEq('abc'.startsWith('bcd', -0), false); 1.133 +assertEq('abc'.startsWith('abcd', -0), false); 1.134 +assertEq('abc'.startsWith('bcde', -0), false); 1.135 + 1.136 +assertEq('abc'.startsWith('', +0), true); 1.137 +assertEq('abc'.startsWith('\0', +0), false); 1.138 +assertEq('abc'.startsWith('a', +0), true); 1.139 +assertEq('abc'.startsWith('b', +0), false); 1.140 +assertEq('abc'.startsWith('ab', +0), true); 1.141 +assertEq('abc'.startsWith('bc', +0), false); 1.142 +assertEq('abc'.startsWith('abc', +0), true); 1.143 +assertEq('abc'.startsWith('bcd', +0), false); 1.144 +assertEq('abc'.startsWith('abcd', +0), false); 1.145 +assertEq('abc'.startsWith('bcde', +0), false); 1.146 + 1.147 +assertEq('abc'.startsWith('', 1), true); 1.148 +assertEq('abc'.startsWith('\0', 1), false); 1.149 +assertEq('abc'.startsWith('a', 1), false); 1.150 +assertEq('abc'.startsWith('b', 1), true); 1.151 +assertEq('abc'.startsWith('ab', 1), false); 1.152 +assertEq('abc'.startsWith('bc', 1), true); 1.153 +assertEq('abc'.startsWith('abc', 1), false); 1.154 +assertEq('abc'.startsWith('bcd', 1), false); 1.155 +assertEq('abc'.startsWith('abcd', 1), false); 1.156 +assertEq('abc'.startsWith('bcde', 1), false); 1.157 + 1.158 +assertEq('abc'.startsWith('', +Infinity), true); 1.159 +assertEq('abc'.startsWith('\0', +Infinity), false); 1.160 +assertEq('abc'.startsWith('a', +Infinity), false); 1.161 +assertEq('abc'.startsWith('b', +Infinity), false); 1.162 +assertEq('abc'.startsWith('ab', +Infinity), false); 1.163 +assertEq('abc'.startsWith('bc', +Infinity), false); 1.164 +assertEq('abc'.startsWith('abc', +Infinity), false); 1.165 +assertEq('abc'.startsWith('bcd', +Infinity), false); 1.166 +assertEq('abc'.startsWith('abcd', +Infinity), false); 1.167 +assertEq('abc'.startsWith('bcde', +Infinity), false); 1.168 + 1.169 +assertEq('abc'.startsWith('', true), true); 1.170 +assertEq('abc'.startsWith('\0', true), false); 1.171 +assertEq('abc'.startsWith('a', true), false); 1.172 +assertEq('abc'.startsWith('b', true), true); 1.173 +assertEq('abc'.startsWith('ab', true), false); 1.174 +assertEq('abc'.startsWith('bc', true), true); 1.175 +assertEq('abc'.startsWith('abc', true), false); 1.176 +assertEq('abc'.startsWith('bcd', true), false); 1.177 +assertEq('abc'.startsWith('abcd', true), false); 1.178 +assertEq('abc'.startsWith('bcde', true), false); 1.179 + 1.180 +assertEq('abc'.startsWith('', 'x'), true); 1.181 +assertEq('abc'.startsWith('\0', 'x'), false); 1.182 +assertEq('abc'.startsWith('a', 'x'), true); 1.183 +assertEq('abc'.startsWith('b', 'x'), false); 1.184 +assertEq('abc'.startsWith('ab', 'x'), true); 1.185 +assertEq('abc'.startsWith('bc', 'x'), false); 1.186 +assertEq('abc'.startsWith('abc', 'x'), true); 1.187 +assertEq('abc'.startsWith('bcd', 'x'), false); 1.188 +assertEq('abc'.startsWith('abcd', 'x'), false); 1.189 +assertEq('abc'.startsWith('bcde', 'x'), false); 1.190 + 1.191 +assertEq('[a-z]+(bar)?'.startsWith('[a-z]+'), true); 1.192 +assertThrows(function() { '[a-z]+(bar)?'.startsWith(/[a-z]+/); }, TypeError); 1.193 +assertEq('[a-z]+(bar)?'.startsWith('(bar)?', 6), true); 1.194 +assertThrows(function() { '[a-z]+(bar)?'.startsWith(/(bar)?/); }, TypeError); 1.195 +assertThrows(function() { '[a-z]+/(bar)?/'.startsWith(/(bar)?/); }, TypeError); 1.196 +var global = newGlobal(); 1.197 +global.eval('this.re = /(bar)?/'); 1.198 +assertThrows(function() { '[a-z]+/(bar)?/'.startsWith(global.re); }, TypeError); 1.199 + 1.200 +// http://mathiasbynens.be/notes/javascript-unicode#poo-test 1.201 +var string = 'I\xF1t\xEBrn\xE2ti\xF4n\xE0liz\xE6ti\xF8n\u2603\uD83D\uDCA9'; 1.202 +assertEq(string.startsWith(''), true); 1.203 +assertEq(string.startsWith('\xF1t\xEBr'), false); 1.204 +assertEq(string.startsWith('\xF1t\xEBr', 1), true); 1.205 +assertEq(string.startsWith('\xE0liz\xE6'), false); 1.206 +assertEq(string.startsWith('\xE0liz\xE6', 11), true); 1.207 +assertEq(string.startsWith('\xF8n\u2603\uD83D\uDCA9'), false); 1.208 +assertEq(string.startsWith('\xF8n\u2603\uD83D\uDCA9', 18), true); 1.209 +assertEq(string.startsWith('\u2603'), false); 1.210 +assertEq(string.startsWith('\u2603', 20), true); 1.211 +assertEq(string.startsWith('\uD83D\uDCA9'), false); 1.212 +assertEq(string.startsWith('\uD83D\uDCA9', 21), true); 1.213 + 1.214 +assertThrows(function() { String.prototype.startsWith.call(undefined); }, TypeError); 1.215 +assertThrows(function() { String.prototype.startsWith.call(undefined, 'b'); }, TypeError); 1.216 +assertThrows(function() { String.prototype.startsWith.call(undefined, 'b', 4); }, TypeError); 1.217 +assertThrows(function() { String.prototype.startsWith.call(null); }, TypeError); 1.218 +assertThrows(function() { String.prototype.startsWith.call(null, 'b'); }, TypeError); 1.219 +assertThrows(function() { String.prototype.startsWith.call(null, 'b', 4); }, TypeError); 1.220 +assertEq(String.prototype.startsWith.call(42, '2'), false); 1.221 +assertEq(String.prototype.startsWith.call(42, '4'), true); 1.222 +assertEq(String.prototype.startsWith.call(42, 'b', 4), false); 1.223 +assertEq(String.prototype.startsWith.call(42, '2', 1), true); 1.224 +assertEq(String.prototype.startsWith.call(42, '2', 4), false); 1.225 +assertEq(String.prototype.startsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 0), false); 1.226 +assertEq(String.prototype.startsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 1), true); 1.227 +assertEq(String.prototype.startsWith.call({ 'toString': function() { return 'abc'; } }, 'b', 2), false); 1.228 +assertThrows(function() { String.prototype.startsWith.call({ 'toString': function() { throw RangeError(); } }, /./); }, RangeError); 1.229 +assertThrows(function() { String.prototype.startsWith.call({ 'toString': function() { return 'abc'; } }, /./); }, TypeError); 1.230 + 1.231 +assertThrows(function() { String.prototype.startsWith.apply(undefined); }, TypeError); 1.232 +assertThrows(function() { String.prototype.startsWith.apply(undefined, ['b']); }, TypeError); 1.233 +assertThrows(function() { String.prototype.startsWith.apply(undefined, ['b', 4]); }, TypeError); 1.234 +assertThrows(function() { String.prototype.startsWith.apply(null); }, TypeError); 1.235 +assertThrows(function() { String.prototype.startsWith.apply(null, ['b']); }, TypeError); 1.236 +assertThrows(function() { String.prototype.startsWith.apply(null, ['b', 4]); }, TypeError); 1.237 +assertEq(String.prototype.startsWith.apply(42, ['2']), false); 1.238 +assertEq(String.prototype.startsWith.apply(42, ['4']), true); 1.239 +assertEq(String.prototype.startsWith.apply(42, ['b', 4]), false); 1.240 +assertEq(String.prototype.startsWith.apply(42, ['2', 1]), true); 1.241 +assertEq(String.prototype.startsWith.apply(42, ['2', 4]), false); 1.242 +assertEq(String.prototype.startsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 0]), false); 1.243 +assertEq(String.prototype.startsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 1]), true); 1.244 +assertEq(String.prototype.startsWith.apply({ 'toString': function() { return 'abc'; } }, ['b', 2]), false); 1.245 +assertThrows(function() { String.prototype.startsWith.apply({ 'toString': function() { throw RangeError(); } }, [/./]); }, RangeError); 1.246 +assertThrows(function() { String.prototype.startsWith.apply({ 'toString': function() { return 'abc'; } }, [/./]); }, TypeError);