summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/test262/built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore.js')
-rw-r--r--js/src/tests/test262/built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore.js67
1 files changed, 67 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore.js b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore.js
new file mode 100644
index 0000000000..066d67da3e
--- /dev/null
+++ b/js/src/tests/test262/built-ins/RegExp/prototype/Symbol.search/lastindex-no-restore.js
@@ -0,0 +1,67 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+es6id: 21.2.5.9
+description: Behavior when some lastIndex writes should be skipped.
+info: |
+ [...]
+ 4. Let previousLastIndex be ? Get(rx, "lastIndex").
+ 5. If SameValue(previousLastIndex, 0) is false, then
+ a. Perform ? Set(rx, "lastIndex", 0, true).
+ [...]
+ 7. Let currentLastIndex be ? Get(rx, "lastIndex").
+ 8. If SameValue(currentLastIndex, previousLastIndex) is false, then
+ a. Perform ? Set(rx, "lastIndex", previousLastIndex, true).
+ [...]
+features: [Symbol.search]
+---*/
+
+var lastIndexValue;
+var lastIndexValueAfterExec;
+var lastIndexReads;
+var lastIndexWrites;
+var execCallCount;
+var result;
+
+var fakeRe = {
+ get lastIndex() {
+ lastIndexReads++;
+ return lastIndexValue;
+ },
+ set lastIndex(_) {
+ lastIndexWrites++;
+ lastIndexValue = _;
+ },
+ exec: function() {
+ execCallCount++;
+ lastIndexValue = lastIndexValueAfterExec;
+ return null;
+ }
+};
+
+function reset(value, valueAfterExec) {
+ lastIndexValue = value;
+ lastIndexValueAfterExec = valueAfterExec;
+ lastIndexReads = 0;
+ lastIndexWrites = 0;
+ execCallCount = 0;
+}
+
+reset(0, 0);
+result = RegExp.prototype[Symbol.search].call(fakeRe);
+assert.sameValue(result, -1);
+assert.sameValue(lastIndexValue, 0);
+assert.sameValue(lastIndexReads, 2);
+assert.sameValue(lastIndexWrites, 0);
+assert.sameValue(execCallCount, 1);
+
+reset(420, 420);
+result = RegExp.prototype[Symbol.search].call(fakeRe);
+assert.sameValue(result, -1);
+assert.sameValue(lastIndexValue, 420);
+assert.sameValue(lastIndexReads, 2);
+assert.sameValue(lastIndexWrites, 1);
+assert.sameValue(execCallCount, 1);
+
+reportCompare(0, 0);