js/src/tests/ecma_5/strict/13.1.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/tests/ecma_5/strict/13.1.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,345 @@
     1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     1.5 +
     1.6 +/*
     1.7 + * Any copyright is dedicated to the Public Domain.
     1.8 + * http://creativecommons.org/licenses/publicdomain/
     1.9 + */
    1.10 +
    1.11 +/*
    1.12 + * In strict mode, it is a syntax error for an identifier to appear
    1.13 + * more than once in a function's argument list.
    1.14 + */
    1.15 +
    1.16 +/*
    1.17 + * The parameters of ordinary function definitions should not contain
    1.18 + * duplicate identifiers.
    1.19 + */
    1.20 +assertEq(testLenientAndStrict('function f(x,y) {}',
    1.21 +                              parsesSuccessfully,
    1.22 +                              parsesSuccessfully),
    1.23 +         true);
    1.24 +assertEq(testLenientAndStrict('function f(x,x) {}',
    1.25 +                              parsesSuccessfully,
    1.26 +                              parseRaisesException(SyntaxError)),
    1.27 +         true);
    1.28 +assertEq(testLenientAndStrict('function f(x,y,z,y) {}',
    1.29 +                              parsesSuccessfully,
    1.30 +                              parseRaisesException(SyntaxError)),
    1.31 +         true);
    1.32 +
    1.33 +/* Exercise the hashed local name map case. */
    1.34 +assertEq(testLenientAndStrict('function f(a,b,c,d,e,f,g,h,d) {}',
    1.35 +                              parsesSuccessfully,
    1.36 +                              parseRaisesException(SyntaxError)),
    1.37 +         true);
    1.38 +
    1.39 +/*
    1.40 + * SpiderMonkey has always treated duplicates in destructuring
    1.41 + * patterns as an error. Strict mode should not affect this.
    1.42 + */
    1.43 +assertEq(testLenientAndStrict('function f([x,y]) {}',
    1.44 +                              parsesSuccessfully,
    1.45 +                              parsesSuccessfully),
    1.46 +         true);
    1.47 +assertEq(testLenientAndStrict('function f([x,x]){}',
    1.48 +                              parseRaisesException(SyntaxError),
    1.49 +                              parseRaisesException(SyntaxError)),
    1.50 +         true);
    1.51 +assertEq(testLenientAndStrict('function f(x,[x]){}',
    1.52 +                              parseRaisesException(SyntaxError),
    1.53 +                              parseRaisesException(SyntaxError)),
    1.54 +         true);
    1.55 +
    1.56 +/*
    1.57 + * Strict rules apply to the parameters if the function's body is
    1.58 + * strict.
    1.59 + */
    1.60 +assertEq(testLenientAndStrict('function f(x,x) { "use strict" };',
    1.61 +                              parseRaisesException(SyntaxError),
    1.62 +                              parseRaisesException(SyntaxError)),
    1.63 +         true);
    1.64 +
    1.65 +/*
    1.66 + * Calls to the function constructor should not be affected by the
    1.67 + * strictness of the calling code, but should be affected by the
    1.68 + * strictness of the function body.
    1.69 + */
    1.70 +assertEq(testLenientAndStrict('Function("x","x","")',
    1.71 +                              completesNormally,
    1.72 +                              completesNormally),
    1.73 +         true);
    1.74 +assertEq(testLenientAndStrict('Function("x","y","")',
    1.75 +                              completesNormally,
    1.76 +                              completesNormally),
    1.77 +         true);
    1.78 +assertEq(testLenientAndStrict('Function("x","x","\'use strict\'")',
    1.79 +                              raisesException(SyntaxError),
    1.80 +                              raisesException(SyntaxError)),
    1.81 +         true);
    1.82 +assertEq(testLenientAndStrict('Function("x","y","\'use strict\'")',
    1.83 +                              completesNormally,
    1.84 +                              completesNormally),
    1.85 +         true);
    1.86 +
    1.87 +
    1.88 +/*
    1.89 + * The parameter lists of function expressions should not contain
    1.90 + * duplicate identifiers.
    1.91 + */
    1.92 +assertEq(testLenientAndStrict('(function (x,x) 2)',
    1.93 +                               parsesSuccessfully,
    1.94 +                               parseRaisesException(SyntaxError)),
    1.95 +         true);
    1.96 +assertEq(testLenientAndStrict('(function (x,y) 2)',
    1.97 +                              parsesSuccessfully,
    1.98 +                              parsesSuccessfully),
    1.99 +         true);
   1.100 +
   1.101 +/*
   1.102 + * All permutations of:
   1.103 + * - For the two magic identifiers 'arguments' or 'eval'
   1.104 + *   - For function definitions, function expressions, expression closures,
   1.105 + *     and getter and setter property definitions,
   1.106 + *     - For forms that inherit their context's strictness, and forms that
   1.107 + *       include their own strictness directives,
   1.108 + *       - For ordinary parameters, array destructuring parameters, and 
   1.109 + *         object destructuring parameters,
   1.110 + *         - the magic identifiers may be used to name such parameters
   1.111 + *           in lenient code, but not in strict code
   1.112 + *       - the magic identifiers may be used as function names in lenient code,
   1.113 + *         but not in strict code
   1.114 + */
   1.115 +assertEq(testLenientAndStrict('function f(eval){}',
   1.116 +                              parsesSuccessfully,
   1.117 +                              parseRaisesException(SyntaxError)),
   1.118 +         true);
   1.119 +assertEq(testLenientAndStrict('function f([eval]){}',
   1.120 +                              parsesSuccessfully,
   1.121 +                              parseRaisesException(SyntaxError)),
   1.122 +         true);
   1.123 +assertEq(testLenientAndStrict('function f({x:eval}){}',
   1.124 +                              parsesSuccessfully,
   1.125 +                              parseRaisesException(SyntaxError)),
   1.126 +         true);
   1.127 +assertEq(testLenientAndStrict('function eval(){}',
   1.128 +                              parsesSuccessfully,
   1.129 +                              parseRaisesException(SyntaxError)),
   1.130 +         true);
   1.131 +assertEq(testLenientAndStrict('function f(eval){"use strict";}',
   1.132 +                              parseRaisesException(SyntaxError),
   1.133 +                              parseRaisesException(SyntaxError)),
   1.134 +         true);
   1.135 +assertEq(testLenientAndStrict('function f([eval]){"use strict";}',
   1.136 +                              parseRaisesException(SyntaxError),
   1.137 +                              parseRaisesException(SyntaxError)),
   1.138 +         true);
   1.139 +assertEq(testLenientAndStrict('function f({x:eval}){"use strict";}',
   1.140 +                              parseRaisesException(SyntaxError),
   1.141 +                              parseRaisesException(SyntaxError)),
   1.142 +         true);
   1.143 +assertEq(testLenientAndStrict('function eval(){"use strict";}',
   1.144 +                              parseRaisesException(SyntaxError),
   1.145 +                              parseRaisesException(SyntaxError)),
   1.146 +         true);
   1.147 +assertEq(testLenientAndStrict('(function f(eval){})',
   1.148 +                              parsesSuccessfully,
   1.149 +                              parseRaisesException(SyntaxError)),
   1.150 +         true);
   1.151 +assertEq(testLenientAndStrict('(function f([eval]){})',
   1.152 +                              parsesSuccessfully,
   1.153 +                              parseRaisesException(SyntaxError)),
   1.154 +         true);
   1.155 +assertEq(testLenientAndStrict('(function f({x:eval}){})',
   1.156 +                              parsesSuccessfully,
   1.157 +                              parseRaisesException(SyntaxError)),
   1.158 +         true);
   1.159 +assertEq(testLenientAndStrict('(function eval(){})',
   1.160 +                              parsesSuccessfully,
   1.161 +                              parseRaisesException(SyntaxError)),
   1.162 +         true);
   1.163 +assertEq(testLenientAndStrict('(function f(eval){"use strict";})',
   1.164 +                              parseRaisesException(SyntaxError),
   1.165 +                              parseRaisesException(SyntaxError)),
   1.166 +         true);
   1.167 +assertEq(testLenientAndStrict('(function f([eval]){"use strict";})',
   1.168 +                              parseRaisesException(SyntaxError),
   1.169 +                              parseRaisesException(SyntaxError)),
   1.170 +         true);
   1.171 +assertEq(testLenientAndStrict('(function f({x:eval}){"use strict";})',
   1.172 +                              parseRaisesException(SyntaxError),
   1.173 +                              parseRaisesException(SyntaxError)),
   1.174 +         true);
   1.175 +assertEq(testLenientAndStrict('(function eval(){"use strict";})',
   1.176 +                              parseRaisesException(SyntaxError),
   1.177 +                              parseRaisesException(SyntaxError)),
   1.178 +         true);
   1.179 +assertEq(testLenientAndStrict('(function f(eval) 2)',
   1.180 +                              parsesSuccessfully,
   1.181 +                              parseRaisesException(SyntaxError)),
   1.182 +         true);
   1.183 +assertEq(testLenientAndStrict('(function f([eval]) 2)',
   1.184 +                              parsesSuccessfully,
   1.185 +                              parseRaisesException(SyntaxError)),
   1.186 +         true);
   1.187 +assertEq(testLenientAndStrict('(function f({x:eval}) 2)',
   1.188 +                              parsesSuccessfully,
   1.189 +                              parseRaisesException(SyntaxError)),
   1.190 +         true);
   1.191 +assertEq(testLenientAndStrict('(function eval() 2)',
   1.192 +                              parsesSuccessfully,
   1.193 +                              parseRaisesException(SyntaxError)),
   1.194 +         true);
   1.195 +assertEq(testLenientAndStrict('({set x(eval){}})',
   1.196 +                              parsesSuccessfully,
   1.197 +                              parseRaisesException(SyntaxError)),
   1.198 +         true);
   1.199 +assertEq(testLenientAndStrict('({set x([eval]){}})',
   1.200 +                              parsesSuccessfully,
   1.201 +                              parseRaisesException(SyntaxError)),
   1.202 +         true);
   1.203 +assertEq(testLenientAndStrict('({set x({x:eval}){}})',
   1.204 +                              parsesSuccessfully,
   1.205 +                              parseRaisesException(SyntaxError)),
   1.206 +         true);
   1.207 +assertEq(testLenientAndStrict('({set x(eval){"use strict";}})',
   1.208 +                              parseRaisesException(SyntaxError),
   1.209 +                              parseRaisesException(SyntaxError)),
   1.210 +         true);
   1.211 +assertEq(testLenientAndStrict('({set x([eval]){"use strict";}})',
   1.212 +                              parseRaisesException(SyntaxError),
   1.213 +                              parseRaisesException(SyntaxError)),
   1.214 +         true);
   1.215 +assertEq(testLenientAndStrict('({set x({x:eval}){"use strict";}})',
   1.216 +                              parseRaisesException(SyntaxError),
   1.217 +                              parseRaisesException(SyntaxError)),
   1.218 +         true);
   1.219 +assertEq(testLenientAndStrict('function f(arguments){}',
   1.220 +                              parsesSuccessfully,
   1.221 +                              parseRaisesException(SyntaxError)),
   1.222 +         true);
   1.223 +assertEq(testLenientAndStrict('function f([arguments]){}',
   1.224 +                              parsesSuccessfully,
   1.225 +                              parseRaisesException(SyntaxError)),
   1.226 +         true);
   1.227 +assertEq(testLenientAndStrict('function f({x:arguments}){}',
   1.228 +                              parsesSuccessfully,
   1.229 +                              parseRaisesException(SyntaxError)),
   1.230 +         true);
   1.231 +assertEq(testLenientAndStrict('function arguments(){}',
   1.232 +                              parsesSuccessfully,
   1.233 +                              parseRaisesException(SyntaxError)),
   1.234 +         true);
   1.235 +assertEq(testLenientAndStrict('function f(arguments){"use strict";}',
   1.236 +                              parseRaisesException(SyntaxError),
   1.237 +                              parseRaisesException(SyntaxError)),
   1.238 +         true);
   1.239 +assertEq(testLenientAndStrict('function f([arguments]){"use strict";}',
   1.240 +                              parseRaisesException(SyntaxError),
   1.241 +                              parseRaisesException(SyntaxError)),
   1.242 +         true);
   1.243 +assertEq(testLenientAndStrict('function f({x:arguments}){"use strict";}',
   1.244 +                              parseRaisesException(SyntaxError),
   1.245 +                              parseRaisesException(SyntaxError)),
   1.246 +         true);
   1.247 +assertEq(testLenientAndStrict('function arguments(){"use strict";}',
   1.248 +                              parseRaisesException(SyntaxError),
   1.249 +                              parseRaisesException(SyntaxError)),
   1.250 +         true);
   1.251 +assertEq(testLenientAndStrict('(function f(arguments){})',
   1.252 +                              parsesSuccessfully,
   1.253 +                              parseRaisesException(SyntaxError)),
   1.254 +         true);
   1.255 +assertEq(testLenientAndStrict('(function f([arguments]){})',
   1.256 +                              parsesSuccessfully,
   1.257 +                              parseRaisesException(SyntaxError)),
   1.258 +         true);
   1.259 +assertEq(testLenientAndStrict('(function f({x:arguments}){})',
   1.260 +                              parsesSuccessfully,
   1.261 +                              parseRaisesException(SyntaxError)),
   1.262 +         true);
   1.263 +assertEq(testLenientAndStrict('(function arguments(){})',
   1.264 +                              parsesSuccessfully,
   1.265 +                              parseRaisesException(SyntaxError)),
   1.266 +         true);
   1.267 +assertEq(testLenientAndStrict('(function f(arguments){"use strict";})',
   1.268 +                              parseRaisesException(SyntaxError),
   1.269 +                              parseRaisesException(SyntaxError)),
   1.270 +         true);
   1.271 +assertEq(testLenientAndStrict('(function f([arguments]){"use strict";})',
   1.272 +                              parseRaisesException(SyntaxError),
   1.273 +                              parseRaisesException(SyntaxError)),
   1.274 +         true);
   1.275 +assertEq(testLenientAndStrict('(function f({x:arguments}){"use strict";})',
   1.276 +                              parseRaisesException(SyntaxError),
   1.277 +                              parseRaisesException(SyntaxError)),
   1.278 +         true);
   1.279 +assertEq(testLenientAndStrict('(function arguments(){"use strict";})',
   1.280 +                              parseRaisesException(SyntaxError),
   1.281 +                              parseRaisesException(SyntaxError)),
   1.282 +         true);
   1.283 +assertEq(testLenientAndStrict('(function f(arguments) 2)',
   1.284 +                              parsesSuccessfully,
   1.285 +                              parseRaisesException(SyntaxError)),
   1.286 +         true);
   1.287 +assertEq(testLenientAndStrict('(function f([arguments]) 2)',
   1.288 +                              parsesSuccessfully,
   1.289 +                              parseRaisesException(SyntaxError)),
   1.290 +         true);
   1.291 +assertEq(testLenientAndStrict('(function f({x:arguments}) 2)',
   1.292 +                              parsesSuccessfully,
   1.293 +                              parseRaisesException(SyntaxError)),
   1.294 +         true);
   1.295 +assertEq(testLenientAndStrict('(function arguments() 2)',
   1.296 +                              parsesSuccessfully,
   1.297 +                              parseRaisesException(SyntaxError)),
   1.298 +         true);
   1.299 +assertEq(testLenientAndStrict('({set x(arguments){}})',
   1.300 +                              parsesSuccessfully,
   1.301 +                              parseRaisesException(SyntaxError)),
   1.302 +         true);
   1.303 +assertEq(testLenientAndStrict('({set x([arguments]){}})',
   1.304 +                              parsesSuccessfully,
   1.305 +                              parseRaisesException(SyntaxError)),
   1.306 +         true);
   1.307 +assertEq(testLenientAndStrict('({set x({x:arguments}){}})',
   1.308 +                              parsesSuccessfully,
   1.309 +                              parseRaisesException(SyntaxError)),
   1.310 +         true);
   1.311 +assertEq(testLenientAndStrict('({set x(arguments){"use strict";}})',
   1.312 +                              parseRaisesException(SyntaxError),
   1.313 +                              parseRaisesException(SyntaxError)),
   1.314 +         true);
   1.315 +assertEq(testLenientAndStrict('({set x([arguments]){"use strict";}})',
   1.316 +                              parseRaisesException(SyntaxError),
   1.317 +                              parseRaisesException(SyntaxError)),
   1.318 +         true);
   1.319 +assertEq(testLenientAndStrict('({set x({x:arguments}){"use strict";}})',
   1.320 +                              parseRaisesException(SyntaxError),
   1.321 +                              parseRaisesException(SyntaxError)),
   1.322 +         true);
   1.323 +
   1.324 +/*
   1.325 + * Functions produced using the Function constructor may not use
   1.326 + * 'eval' or 'arguments' as a parameter name if their body is strict
   1.327 + * mode code. The strictness of the calling code does not affect the
   1.328 + * constraints applied to the parameters.
   1.329 + */
   1.330 +assertEq(testLenientAndStrict('Function("eval","")',
   1.331 +                              completesNormally,
   1.332 +                              completesNormally),
   1.333 +         true);
   1.334 +assertEq(testLenientAndStrict('Function("eval","\'use strict\';")',
   1.335 +                              raisesException(SyntaxError),
   1.336 +                              raisesException(SyntaxError)),
   1.337 +         true);
   1.338 +assertEq(testLenientAndStrict('Function("arguments","")',
   1.339 +                              completesNormally,
   1.340 +                              completesNormally),
   1.341 +         true);
   1.342 +assertEq(testLenientAndStrict('Function("arguments","\'use strict\';")',
   1.343 +                              raisesException(SyntaxError),
   1.344 +                              raisesException(SyntaxError)),
   1.345 +         true);
   1.346 +
   1.347 +
   1.348 +reportCompare(true, true);

mercurial