| // 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); |
| })(); |