js/src/tests/ecma_5/RegExp/instance-property-storage-introspection.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/tests/ecma_5/RegExp/instance-property-storage-introspection.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,153 @@
     1.4 +/*
     1.5 + * Any copyright is dedicated to the Public Domain.
     1.6 + * http://creativecommons.org/licenses/publicdomain/
     1.7 + */
     1.8 +
     1.9 +var BUGNUMBER = 640072;
    1.10 +var summary =
    1.11 +  "Represent /a/.{lastIndex,global,source,multiline,sticky,ignoreCase} with " +
    1.12 +  "plain old data properties";
    1.13 +
    1.14 +print(BUGNUMBER + ": " + summary);
    1.15 +
    1.16 +/**************
    1.17 + * BEGIN TEST *
    1.18 + **************/
    1.19 +
    1.20 +function checkDataProperty(obj, p, expect, msg)
    1.21 +{
    1.22 +  var d = Object.getOwnPropertyDescriptor(obj, p);
    1.23 +
    1.24 +  assertEq(d.value, expect.value, msg + ": bad value for " + p);
    1.25 +  assertEq(d.writable, expect.writable, msg + ": bad writable for " + p);
    1.26 +  assertEq(d.enumerable, expect.enumerable, msg + ": bad enumerable for " + p);
    1.27 +  assertEq(d.configurable, expect.configurable, msg + ": bad configurable for " + p);
    1.28 +
    1.29 +  // Try redefining the property using its initial values: these should all be
    1.30 +  // silent no-ops.
    1.31 +  Object.defineProperty(obj, p, { value: expect.value });
    1.32 +  Object.defineProperty(obj, p, { writable: expect.writable });
    1.33 +  Object.defineProperty(obj, p, { enumerable: expect.enumerable });
    1.34 +  Object.defineProperty(obj, p, { configurable: expect.configurable });
    1.35 +
    1.36 +  var d2 = Object.getOwnPropertyDescriptor(obj, p);
    1.37 +  assertEq(d.value, d2.value, msg + ": value changed on redefinition of " + p + "?");
    1.38 +  assertEq(d.writable, d2.writable, msg + ": writable changed on redefinition of " + p + "?");
    1.39 +  assertEq(d.enumerable, d2.enumerable, msg + ": enumerable changed on redefinition of " + p + "?");
    1.40 +  assertEq(d.configurable, d2.configurable, msg + ": configurable changed on redefinition of " + p + "?");
    1.41 +}
    1.42 +
    1.43 +
    1.44 +// Check a bunch of "empty" regular expressions first.
    1.45 +
    1.46 +var choices = [{ msg: "RegExp.prototype",
    1.47 +                 get: function() { return RegExp.prototype; } },
    1.48 +               { msg: "new RegExp()",
    1.49 +                 get: function() { return new RegExp(); } },
    1.50 +               { msg: "/(?:)/",
    1.51 +                 get: Function("return /(?:)/;") }];
    1.52 +
    1.53 +function checkRegExp(r, msg, lastIndex, global, ignoreCase, multiline)
    1.54 +{
    1.55 +  var expect;
    1.56 +
    1.57 +  expect = { value: lastIndex, enumerable: false, configurable: false, writable: true };
    1.58 +  checkDataProperty(r, "lastIndex", expect, msg);
    1.59 +
    1.60 +  // check source specially: its value is under-defined in the spec
    1.61 +  var d = Object.getOwnPropertyDescriptor(r, "source");
    1.62 +  assertEq(d.writable, false, "bad writable: " + msg);
    1.63 +  assertEq(d.enumerable, false, "bad enumerable: " + msg);
    1.64 +  assertEq(d.configurable, false, "bad configurable: " + msg);
    1.65 +
    1.66 +  expect = { value: global, enumerable: false, configurable: false, writable: false };
    1.67 +  checkDataProperty(r, "global", expect, msg);
    1.68 +
    1.69 +  expect = { value: ignoreCase, enumerable: false, configurable: false, writable: false };
    1.70 +  checkDataProperty(r, "ignoreCase", expect, msg);
    1.71 +
    1.72 +  expect = { value: multiline, enumerable: false, configurable: false, writable: false };
    1.73 +  checkDataProperty(r, "multiline", expect, msg);
    1.74 +}
    1.75 +
    1.76 +checkRegExp(RegExp.prototype, "RegExp.prototype", 0, false, false, false);
    1.77 +checkRegExp(new RegExp(), "new RegExp()", 0, false, false, false);
    1.78 +checkRegExp(/(?:)/, "/(?:)/", 0, false, false, false);
    1.79 +checkRegExp(Function("return /(?:)/;")(), 'Function("return /(?:)/;")()', 0, false, false, false);
    1.80 +
    1.81 +for (var i = 0; i < choices.length; i++)
    1.82 +{
    1.83 +  var choice = choices[i];
    1.84 +  var msg = choice.msg;
    1.85 +  var r = choice.get();
    1.86 +
    1.87 +  checkRegExp(r, msg, 0, false, false, false);
    1.88 +}
    1.89 +
    1.90 +// Now test less generic regular expressions
    1.91 +
    1.92 +checkRegExp(/a/gim, "/a/gim", 0, true, true, true);
    1.93 +
    1.94 +var r;
    1.95 +
    1.96 +do
    1.97 +{
    1.98 +  r = /abcd/mg;
    1.99 +  checkRegExp(r, "/abcd/mg initially", 0, true, false, true);
   1.100 +  r.exec("abcdefg");
   1.101 +  checkRegExp(r, "/abcd/mg step 1", 4, true, false, true);
   1.102 +  r.exec("abcdabcd");
   1.103 +  checkRegExp(r, "/abcd/mg step 2", 8, true, false, true);
   1.104 +  r.exec("abcdabcd");
   1.105 +  checkRegExp(r, "/abcd/mg end", 0, true, false, true);
   1.106 +
   1.107 +  r = /cde/ig;
   1.108 +  checkRegExp(r, "/cde/ig initially", 0, true, true, false);
   1.109 +  var obj = r.lastIndex = { valueOf: function() { return 2; } };
   1.110 +  checkRegExp(r, "/cde/ig after lastIndex", obj, true, true, false);
   1.111 +  r.exec("aaacdef");
   1.112 +  checkRegExp(r, "/cde/ig after exec", 6, true, true, false);
   1.113 +  Object.defineProperty(r, "lastIndex", { value: 3 });
   1.114 +  checkRegExp(r, "/cde/ig after define 3", 3, true, true, false);
   1.115 +  Object.defineProperty(r, "lastIndex", { value: obj });
   1.116 +  checkRegExp(r, "/cde/ig after lastIndex", obj, true, true, false);
   1.117 +
   1.118 +
   1.119 +  // Tricky bits of testing: make sure that redefining lastIndex doesn't change
   1.120 +  // the slot where the lastIndex property is initially stored, even if
   1.121 +  // the redefinition also changes writability.
   1.122 +  r = /a/g;
   1.123 +  checkRegExp(r, "/a/g initially", 0, true, false, false);
   1.124 +  Object.defineProperty(r, "lastIndex", { value: 2 });
   1.125 +  r.exec("aabbbba");
   1.126 +  checkRegExp(r, "/a/g after first exec", 7, true, false, false);
   1.127 +  assertEq(r.lastIndex, 7);
   1.128 +  r.lastIndex = 2;
   1.129 +  checkRegExp(r, "/a/g after assign", 2, true, false, false);
   1.130 +  r.exec("aabbbba");
   1.131 +  assertEq(r.lastIndex, 7); // check in reverse order
   1.132 +  checkRegExp(r, "/a/g after second exec", 7, true, false, false);
   1.133 +
   1.134 +  r = /c/g;
   1.135 +  r.lastIndex = 2;
   1.136 +  checkRegExp(r, "/c/g initially", 2, true, false, false);
   1.137 +  Object.defineProperty(r, "lastIndex", { writable: false });
   1.138 +  assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false);
   1.139 +  try { r.exec("aabbbba"); } catch (e) { /* swallow error if thrown */ }
   1.140 +  assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false);
   1.141 +  assertEq(Object.getOwnPropertyDescriptor(r, "source").writable, false);
   1.142 +  assertEq(Object.getOwnPropertyDescriptor(r, "global").value, true);
   1.143 +  assertEq(Object.getOwnPropertyDescriptor(r, "global").writable, false);
   1.144 +  assertEq(Object.getOwnPropertyDescriptor(r, "ignoreCase").value, false);
   1.145 +  assertEq(Object.getOwnPropertyDescriptor(r, "ignoreCase").writable, false);
   1.146 +  assertEq(Object.getOwnPropertyDescriptor(r, "multiline").value, false);
   1.147 +  assertEq(Object.getOwnPropertyDescriptor(r, "multiline").writable, false);
   1.148 +}
   1.149 +while (Math.random() > 17); // fake loop to discourage RegExp object caching
   1.150 +
   1.151 +/******************************************************************************/
   1.152 +
   1.153 +if (typeof reportCompare === "function")
   1.154 +  reportCompare(true, true);
   1.155 +
   1.156 +print("All tests passed!");

mercurial