2018-08-27 21:03:21 +02:00
|
|
|
// Reviewed
|
|
|
|
/**
|
|
|
|
#### ch
|
|
|
|
Error: bad error thrown: Error: Terminate iteration.
|
|
|
|
*/
|
|
|
|
|
2018-07-03 21:59:58 +02:00
|
|
|
// This test checks the behavior of custom iterable objects.
|
|
|
|
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return {
|
|
|
|
done: this.__key === 42,
|
|
|
|
value: this.__key++
|
|
|
|
};
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
var expected = 0;
|
|
|
|
for (var value of iter) {
|
|
|
|
if (value !== expected++)
|
|
|
|
throw "Error: bad value: " + value;
|
|
|
|
}
|
|
|
|
if (returnCalled)
|
|
|
|
throw "Error: return is called.";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return {
|
|
|
|
done: this.__key === 42,
|
|
|
|
value: this.__key++
|
|
|
|
};
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
return {
|
|
|
|
done: true,
|
|
|
|
value: undefined
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
throw "Error: Terminate iteration.";
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "Error: Terminate iteration.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (!returnCalled)
|
|
|
|
throw "Error: return is not called.";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return {
|
|
|
|
done: this.__key === 42,
|
|
|
|
value: this.__key++
|
|
|
|
};
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
return {
|
|
|
|
done: true,
|
|
|
|
value: undefined
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
for (var value of iter) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!returnCalled)
|
|
|
|
throw "Error: return is not called.";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
get next() {
|
|
|
|
throw "Error: looking up next.";
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
throw "Error: Iteration should not occur.";
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "Error: looking up next.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (returnCalled)
|
|
|
|
throw "Error: return is called.";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return {
|
|
|
|
done: this.__key === 42,
|
|
|
|
value: this.__key++
|
|
|
|
};
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
get return() {
|
|
|
|
throw "Error: looking up return."
|
|
|
|
}
|
|
|
|
};
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
throw "Error: Terminate iteration.";
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "Error: looking up return.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
throw "Error: next is called."
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
return {
|
|
|
|
done: true,
|
|
|
|
value: undefined
|
|
|
|
};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
throw "Error: Terminate iteration.";
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "Error: next is called.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (returnCalled)
|
|
|
|
throw "Error: return is called.";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return { done: false, value: 42 };
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
throw "Error: return is called.";
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
throw "Error: Terminate iteration.";
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "Error: Terminate iteration.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (!returnCalled)
|
|
|
|
throw "Error: return is not called.";
|
|
|
|
|
|
|
|
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return { done: false, value: 42 };
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
throw "Error: return is called.";
|
|
|
|
}
|
|
|
|
};
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "Error: return is called.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (!returnCalled)
|
|
|
|
throw "Error: return is not called.";
|
|
|
|
|
|
|
|
|
|
|
|
var primitives = [
|
|
|
|
undefined,
|
|
|
|
null,
|
|
|
|
42,
|
|
|
|
"string",
|
|
|
|
true,
|
|
|
|
Symbol("Cocoa")
|
|
|
|
];
|
|
|
|
|
|
|
|
function iteratorInterfaceErrorTest(notIteratorResult) {
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return notIteratorResult;
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
throw "Error: Iteration should not occur.";
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "TypeError: Iterator result interface is not an object.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (returnCalled)
|
|
|
|
throw "Error: return is called.";
|
|
|
|
}
|
|
|
|
|
|
|
|
function iteratorInterfaceErrorTestReturn(notIteratorResult) {
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return { done: false, value: 42 };
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
return notIteratorResult;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
throw "Error: Terminate iteration.";
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "Error: Terminate iteration.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (!returnCalled)
|
|
|
|
throw "Error: return is not called.";
|
|
|
|
}
|
|
|
|
|
|
|
|
primitives.forEach(iteratorInterfaceErrorTest);
|
|
|
|
primitives.forEach(iteratorInterfaceErrorTestReturn);
|
|
|
|
|
|
|
|
|
|
|
|
function iteratorInterfaceBreakTestReturn(notIteratorResult) {
|
|
|
|
var returnCalled = false;
|
|
|
|
var iter = {
|
|
|
|
__key: 0,
|
|
|
|
next: function () {
|
|
|
|
return { done: false, value: 42 };
|
|
|
|
},
|
|
|
|
[Symbol.iterator]: function () {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
return: function () {
|
|
|
|
returnCalled = true;
|
|
|
|
return notIteratorResult;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
try {
|
|
|
|
for (var value of iter) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
if (String(e) !== "TypeError: Iterator result interface is not an object.")
|
|
|
|
throw "Error: bad error thrown: " + e;
|
|
|
|
}
|
|
|
|
if (!returnCalled)
|
|
|
|
throw "Error: return is not called.";
|
|
|
|
}
|
|
|
|
|
|
|
|
primitives.forEach(iteratorInterfaceBreakTestReturn);
|