Index: test/mjsunit/harmony/string-iterator.js |
diff --git a/test/mjsunit/harmony/string-iterator.js b/test/mjsunit/harmony/string-iterator.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8ff38ce1ce9e703a0ee8c2cbc09ea6b3c19b22c6 |
--- /dev/null |
+++ b/test/mjsunit/harmony/string-iterator.js |
@@ -0,0 +1,93 @@ |
+// Copyright 2014 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Flags: --harmony-iteration |
+ |
+ |
+function TestStringPrototypeIterator() { |
+ assertTrue(String.prototype.hasOwnProperty(Symbol.iterator)); |
+ assertFalse("".hasOwnProperty(Symbol.iterator)); |
+ assertFalse("".propertyIsEnumerable(Symbol.iterator)); |
+} |
+TestStringPrototypeIterator(); |
+ |
+ |
+function assertIteratorResult(value, done, result) { |
+ assertEquals({value: value, done: done}, result); |
+} |
+ |
+ |
+function TestManualIteration() { |
+ var string = "abc"; |
+ var iterator = string[Symbol.iterator](); |
+ assertIteratorResult('a', false, iterator.next()); |
+ assertIteratorResult('b', false, iterator.next()); |
+ assertIteratorResult('c', false, iterator.next()); |
+ assertIteratorResult(void 0, true, iterator.next()); |
+ assertIteratorResult(void 0, true, iterator.next()); |
+} |
+TestManualIteration(); |
+ |
+ |
+function TestSurrogatePairs() { |
+ var lo = "\uD834"; |
+ var hi = "\uDF06"; |
+ var pair = lo + hi; |
+ var string = "abc" + pair + "def" + lo + pair + hi + lo; |
+ var iterator = string[Symbol.iterator](); |
+ assertIteratorResult('a', false, iterator.next()); |
+ assertIteratorResult('b', false, iterator.next()); |
+ assertIteratorResult('c', false, iterator.next()); |
+ assertIteratorResult(pair, false, iterator.next()); |
+ assertIteratorResult('d', false, iterator.next()); |
+ assertIteratorResult('e', false, iterator.next()); |
+ assertIteratorResult('f', false, iterator.next()); |
+ assertIteratorResult(lo, false, iterator.next()); |
+ assertIteratorResult(pair, false, iterator.next()); |
+ assertIteratorResult(hi, false, iterator.next()); |
+ assertIteratorResult(lo, false, iterator.next()); |
+ assertIteratorResult(void 0, true, iterator.next()); |
+ assertIteratorResult(void 0, true, iterator.next()); |
+} |
+TestSurrogatePairs(); |
+ |
+ |
+function TestStringIteratorPrototype() { |
+ var iterator = ""[Symbol.iterator](); |
+ var StringIteratorPrototype = iterator.__proto__; |
+ assertFalse(StringIteratorPrototype.hasOwnProperty('constructor')); |
+ assertEquals(StringIteratorPrototype.__proto__, Object.prototype); |
+ assertArrayEquals(['next'], |
+ Object.getOwnPropertyNames(StringIteratorPrototype)); |
+ assertEquals('[object String Iterator]', "" + iterator); |
+} |
+TestStringIteratorPrototype(); |
+ |
+ |
+function TestForOf() { |
+ var lo = "\uD834"; |
+ var hi = "\uDF06"; |
+ var pair = lo + hi; |
+ var string = "abc" + pair + "def" + lo + pair + hi + lo; |
+ var expected = ['a', 'b', 'c', pair, 'd', 'e', 'f', lo, pair, hi, lo]; |
+ |
+ var i = 0; |
+ for (var char of string) { |
+ assertEquals(expected[i++], char); |
+ } |
+ |
+ assertEquals(expected.length, i); |
+} |
+TestForOf(); |
+ |
+ |
+function TestNonOwnSlots() { |
+ var iterator = ""[Symbol.iterator](); |
+ var object = {__proto__: iterator}; |
+ |
+ assertThrows(function() { |
+ object.next(); |
rossberg
2014/06/18 09:33:19
Nit: fits on one line
|
+ }, TypeError); |
+} |
+TestNonOwnSlots(); |