| // 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. | |
| 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); | |
| assertEquals("String Iterator", StringIteratorPrototype[Symbol.toStringTag]); | |
| var desc = Object.getOwnPropertyDescriptor( | |
| StringIteratorPrototype, Symbol.toStringTag); | |
| assertTrue(desc.configurable); | |
| assertFalse(desc.writable); | |
| assertEquals("String Iterator", desc.value); | |
| } | |
| 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(); }, TypeError); | |
| } | |
| TestNonOwnSlots(); | |
| function TestSlicedStringRegression() { | |
| var long_string = "abcdefhijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; | |
| var sliced_string = long_string.substring(1); | |
| var iterator = sliced_string[Symbol.iterator](); | |
| } | |
| TestSlicedStringRegression(); | |
| (function(){ | |
| var str = "\uD83C\uDF1F\u5FCD\u8005\u306E\u653B\u6483\uD83C\uDF1F"; | |
| var arr = [...str]; | |
| assertEquals(["\uD83C\uDF1F", "\u5FCD", "\u8005", "\u306E", "\u653B", | |
| "\u6483", "\uD83C\uDF1F"], arr); | |
| assertEquals(7, arr.length); | |
| })(); |