blob: f66b62003132f16aa58c10921fa8f6783590a6a7 [file] [log] [blame]
// This test checks the behavior of the String iterator
var testString = "Cocoa,Cappuccino";
var stringIterator = testString[Symbol.iterator]();
var stringIteratorPrototype = stringIterator.__proto__;
var stringIteratorPrototypeNext = stringIteratorPrototype.next;
if (stringIterator.hasOwnProperty('next'))
throw "next method should exists on %StringIteratorPrototype%";
if (!stringIteratorPrototype.hasOwnProperty('next'))
throw "next method should exists on %StringIteratorPrototype%";
var iterator = testString[Symbol.iterator]();
var i = 0;
while (true) {
var {done, value} = iterator.next();
if (done)
break;
if (value !== testString[i])
throw "Error: bad value: " + value;
i++;
}
if (testString.length !== i)
throw "Error: bad value: " + i;
function testSurrogatePair(testString, expected, numberOfElements) {
if (testString.length !== numberOfElements)
throw "Error: bad value: " + testString.length;
var iterator = testString[Symbol.iterator]();
var i = 0;
while (true) {
var {done, value} = iterator.next();
if (done)
break;
if (value !== expected[i])
throw "Error: bad value: " + value;
i++;
}
if (i !== expected.length)
throw "Error: bad value: " + i;
for (var codePoint of testString) {
if (value !== expected[i])
throw "Error: bad value: " + value;
}
}
// "\uD842\uDFB7\u91ce\u5bb6"
var testString = "𠮷野家";
var expected = [
String.fromCharCode(0xD842, 0xDFB7),
String.fromCharCode(0x91CE),
String.fromCharCode(0x5BB6),
];
testSurrogatePair(testString, expected, 4);
var testString = "A\uD842";
var expected = [
String.fromCharCode(0x0041),
String.fromCharCode(0xD842),
];
testSurrogatePair(testString, expected, 2);
var testString = "A\uD842A";
var expected = [
String.fromCharCode(0x0041),
String.fromCharCode(0xD842),
String.fromCharCode(0x0041),
];
testSurrogatePair(testString, expected, 3);
var testString = "A\uD842\uDFB7";
var expected = [
String.fromCharCode(0x0041),
String.fromCharCode(0xD842, 0xDFB7),
];
testSurrogatePair(testString, expected, 3);
var testString = "\uD842A\uDFB7";
var expected = [
String.fromCharCode(0xD842),
String.fromCharCode(0x0041),
String.fromCharCode(0xDFB7),
];
testSurrogatePair(testString, expected, 3);
var testString = "\uDFB7\uD842A";
var expected = [
String.fromCharCode(0xDFB7),
String.fromCharCode(0xD842),
String.fromCharCode(0x0041),
];
testSurrogatePair(testString, expected, 3);
var string1 = "Cocoa";
var string1Iterator = string1[Symbol.iterator]();
var index = 0;
while (true) {
var result = stringIteratorPrototypeNext.call(string1Iterator);
var value = result.value;
if (result.done) {
break;
}
if (value !== string1[index++])
throw "Error: bad value: " + value;
}
if (index !== 5)
throw "Error: bad index: " + index;
function increment(iter) {
return stringIteratorPrototypeNext.call(iter);
}
var string1 = "Cocoa";
var string2 = "Cocoa";
var string1Iterator = string1[Symbol.iterator]();
var string2Iterator = string2[Symbol.iterator]();
for (var i = 0; i < 3; ++i) {
var value1 = increment(string1Iterator).value;
var value2 = increment(string2Iterator).value;
if (value1 !== value2)
throw "Error: bad value: " + value1 + " " + value2;
}
var string1 = "Cappuccino";
var string1Iterator = string1[Symbol.iterator]();
var value = string1Iterator.next().value;
if (value !== "C")
throw "Error: bad value: " + value;
var value = string1Iterator.next().value;
if (value !== "a")
throw "Error: bad value: " + value;
var value = string1Iterator.next().value;
if (value !== "p")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== "p")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== "u")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== "c")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== "c")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== "i")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== "n")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== "o")
throw "Error: bad value: " + value;
var value = stringIteratorPrototypeNext.call(string1Iterator).value;
if (value !== undefined)
throw "Error: bad value: " + value;
var primitives = [
"string",
42,
0.03,
false,
true,
Symbol("Cocoa"),
null,
undefined
];
for (var primitive of primitives) {
var didThrow = null;
try {
stringIteratorPrototypeNext.call(primitive);
} catch (e) {
didThrow = e;
}
if (!didThrow)
throw "Error: no error thrown";
var message = 'TypeError: %StringIteratorPrototype%.next requires that |this| be a String Iterator instance';
if (primitive == null)
message = 'TypeError: %StringIteratorPrototype%.next requires that |this| not be null or undefined'
if (String(didThrow) !== message)
throw "Error: bad error thrown: " + didThrow;
}
var nonRelatedObjects = [
{},
[],
new Date(),
new Error(),
Object(Symbol()),
new String("Cappuccino"),
new Number(42),
new Boolean(false),
function () { },
];
for (var object of nonRelatedObjects) {
var didThrow = null;
try {
stringIteratorPrototypeNext.call(object);
} catch (e) {
didThrow = e;
}
if (!didThrow)
throw "Error: no error thrown";
if (String(didThrow) !== 'TypeError: %StringIteratorPrototype%.next requires that |this| be a String Iterator instance')
throw "Error: bad error thrown: " + didThrow;
}