Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 1 | // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 5 | function TestStringPrototypeIterator() { |
| 6 | assertTrue(String.prototype.hasOwnProperty(Symbol.iterator)); |
| 7 | assertFalse("".hasOwnProperty(Symbol.iterator)); |
| 8 | assertFalse("".propertyIsEnumerable(Symbol.iterator)); |
| 9 | } |
| 10 | TestStringPrototypeIterator(); |
| 11 | |
| 12 | |
| 13 | function assertIteratorResult(value, done, result) { |
| 14 | assertEquals({value: value, done: done}, result); |
| 15 | } |
| 16 | |
| 17 | |
| 18 | function TestManualIteration() { |
| 19 | var string = "abc"; |
| 20 | var iterator = string[Symbol.iterator](); |
| 21 | assertIteratorResult('a', false, iterator.next()); |
| 22 | assertIteratorResult('b', false, iterator.next()); |
| 23 | assertIteratorResult('c', false, iterator.next()); |
| 24 | assertIteratorResult(void 0, true, iterator.next()); |
| 25 | assertIteratorResult(void 0, true, iterator.next()); |
| 26 | } |
| 27 | TestManualIteration(); |
| 28 | |
| 29 | |
| 30 | function TestSurrogatePairs() { |
| 31 | var lo = "\uD834"; |
| 32 | var hi = "\uDF06"; |
| 33 | var pair = lo + hi; |
| 34 | var string = "abc" + pair + "def" + lo + pair + hi + lo; |
| 35 | var iterator = string[Symbol.iterator](); |
| 36 | assertIteratorResult('a', false, iterator.next()); |
| 37 | assertIteratorResult('b', false, iterator.next()); |
| 38 | assertIteratorResult('c', false, iterator.next()); |
| 39 | assertIteratorResult(pair, false, iterator.next()); |
| 40 | assertIteratorResult('d', false, iterator.next()); |
| 41 | assertIteratorResult('e', false, iterator.next()); |
| 42 | assertIteratorResult('f', false, iterator.next()); |
| 43 | assertIteratorResult(lo, false, iterator.next()); |
| 44 | assertIteratorResult(pair, false, iterator.next()); |
| 45 | assertIteratorResult(hi, false, iterator.next()); |
| 46 | assertIteratorResult(lo, false, iterator.next()); |
| 47 | assertIteratorResult(void 0, true, iterator.next()); |
| 48 | assertIteratorResult(void 0, true, iterator.next()); |
| 49 | } |
| 50 | TestSurrogatePairs(); |
| 51 | |
| 52 | |
| 53 | function TestStringIteratorPrototype() { |
| 54 | var iterator = ""[Symbol.iterator](); |
| 55 | var StringIteratorPrototype = iterator.__proto__; |
| 56 | assertFalse(StringIteratorPrototype.hasOwnProperty('constructor')); |
| 57 | assertEquals(StringIteratorPrototype.__proto__, Object.prototype); |
| 58 | assertArrayEquals(['next'], |
| 59 | Object.getOwnPropertyNames(StringIteratorPrototype)); |
| 60 | assertEquals('[object String Iterator]', "" + iterator); |
Emily Bernier | d0a1eb7 | 2015-03-24 16:35:39 -0400 | [diff] [blame] | 61 | assertEquals("String Iterator", StringIteratorPrototype[Symbol.toStringTag]); |
| 62 | var desc = Object.getOwnPropertyDescriptor( |
| 63 | StringIteratorPrototype, Symbol.toStringTag); |
| 64 | assertTrue(desc.configurable); |
| 65 | assertFalse(desc.writable); |
| 66 | assertEquals("String Iterator", desc.value); |
Ben Murdoch | b8a8cc1 | 2014-11-26 15:28:44 +0000 | [diff] [blame] | 67 | } |
| 68 | TestStringIteratorPrototype(); |
| 69 | |
| 70 | |
| 71 | function TestForOf() { |
| 72 | var lo = "\uD834"; |
| 73 | var hi = "\uDF06"; |
| 74 | var pair = lo + hi; |
| 75 | var string = "abc" + pair + "def" + lo + pair + hi + lo; |
| 76 | var expected = ['a', 'b', 'c', pair, 'd', 'e', 'f', lo, pair, hi, lo]; |
| 77 | |
| 78 | var i = 0; |
| 79 | for (var char of string) { |
| 80 | assertEquals(expected[i++], char); |
| 81 | } |
| 82 | |
| 83 | assertEquals(expected.length, i); |
| 84 | } |
| 85 | TestForOf(); |
| 86 | |
| 87 | |
| 88 | function TestNonOwnSlots() { |
| 89 | var iterator = ""[Symbol.iterator](); |
| 90 | var object = {__proto__: iterator}; |
| 91 | |
| 92 | assertThrows(function() { object.next(); }, TypeError); |
| 93 | } |
| 94 | TestNonOwnSlots(); |