blob: 8eb27b199aac6a81cc4c81276e1de2428cb2524e [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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 Murdochb8a8cc12014-11-26 15:28:44 +00005function TestStringPrototypeIterator() {
6 assertTrue(String.prototype.hasOwnProperty(Symbol.iterator));
7 assertFalse("".hasOwnProperty(Symbol.iterator));
8 assertFalse("".propertyIsEnumerable(Symbol.iterator));
9}
10TestStringPrototypeIterator();
11
12
13function assertIteratorResult(value, done, result) {
14 assertEquals({value: value, done: done}, result);
15}
16
17
18function 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}
27TestManualIteration();
28
29
30function 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}
50TestSurrogatePairs();
51
52
53function 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 Bernierd0a1eb72015-03-24 16:35:39 -040061 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 Murdochb8a8cc12014-11-26 15:28:44 +000067}
68TestStringIteratorPrototype();
69
70
71function 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}
85TestForOf();
86
87
88function TestNonOwnSlots() {
89 var iterator = ""[Symbol.iterator]();
90 var object = {__proto__: iterator};
91
92 assertThrows(function() { object.next(); }, TypeError);
93}
94TestNonOwnSlots();