diff options
Diffstat (limited to 'testing/web-platform/tests/webidl/ecmascript-binding/sequence-conversion.html')
-rw-r--r-- | testing/web-platform/tests/webidl/ecmascript-binding/sequence-conversion.html | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webidl/ecmascript-binding/sequence-conversion.html b/testing/web-platform/tests/webidl/ecmascript-binding/sequence-conversion.html new file mode 100644 index 0000000000..40764e9f57 --- /dev/null +++ b/testing/web-platform/tests/webidl/ecmascript-binding/sequence-conversion.html @@ -0,0 +1,157 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>Sequence conversion</title> +<link rel="help" href="https://webidl.spec.whatwg.org/#es-sequence"> +<link rel="author" title="Domenic Denicola" href="mailto:d@domenic.me"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> + +<canvas></canvas> + +<script> +"use strict"; + +const canvas = document.querySelector("canvas"); +const ctx = canvas.getContext("2d"); + +test(() => { + ctx.setLineDash([1, 2]); + assert_array_equals(ctx.getLineDash(), [1, 2]); +}, "An array"); + +test(() => { + function* generatorFunc() { + yield 4; + yield 5; + } + const generator = generatorFunc(); + + ctx.setLineDash(generator); + assert_array_equals(ctx.getLineDash(), [4, 5]); +}, "A generator"); + +test(() => { + function* generatorFunc() { + yield 6; + yield 7; + } + + let callCount = 0; + const array = [1, 2]; + Object.defineProperty(array, Symbol.iterator, { + get() { + ++callCount; + return generatorFunc; + } + }); + + ctx.setLineDash(array); + assert_array_equals(ctx.getLineDash(), [6, 7]); + assert_equals(callCount, 1, "@@iterator must only have been gotten once"); +}, "An array with an overridden Symbol.iterator"); + +test(t => { + function* generatorFunc() { + yield ["foo", "bar"]; + yield ["baz", "quux"]; + } + + let callCount = 0; + const obj = {}; + Object.defineProperty(obj, Symbol.iterator, { + get() { + ++callCount; + return generatorFunc; + } + }); + + const searchParams = new URLSearchParams(obj); + assert_equals(searchParams.get("foo"), "bar"); + assert_equals(searchParams.get("baz"), "quux"); + assert_equals(callCount, 1, "@@iterator must only have been gotten once"); +}, "An object with an overriden Symbol.iterator"); + +test(t => { + const originalIterator = Object.getOwnPropertyDescriptor(Array.prototype, Symbol.iterator); + t.add_cleanup(() => { + Object.defineProperty(Array.prototype, Symbol.iterator, originalIterator); + }); + + function* generatorFunc() { + yield 11; + yield 12; + } + + let callCount = 0; + const array = [1, 2]; + Object.defineProperty(Array.prototype, Symbol.iterator, { + get() { + ++callCount; + return generatorFunc; + } + }); + + ctx.setLineDash(array); + assert_array_equals(ctx.getLineDash(), [11, 12]); + assert_equals(callCount, 1, "@@iterator must only have been gotten once"); +}, "An array with an overridden Symbol.iterator on the prototype"); + +test(t => { + const arrayIteratorPrototype = Object.getPrototypeOf(Array.prototype[Symbol.iterator]()); + const nextBefore = arrayIteratorPrototype.next; + t.add_cleanup(() => { + arrayIteratorPrototype.next = nextBefore; + }); + + let callCount = 0; + arrayIteratorPrototype.next = () => { + switch (callCount) { + case 0: { + ++callCount; + return { done: false, value: 8 }; + } + case 1: { + ++callCount; + return { done: false, value: 9 }; + } + case 2: { + ++callCount; + return { done: true, value: 10 }; // value should be ignored this time + } + default: { + assert_unreached("next() should be called three times exactly"); + } + } + }; + + const array = [1, 2]; + ctx.setLineDash(array); + assert_array_equals(ctx.getLineDash(), [8, 9]); + assert_equals(callCount, 3, "next() must have been called thrice"); +}, "An array with an overridden %ArrayIterator%.prototype.next"); + +test(t => { + t.add_cleanup(() => { + delete Array.prototype[1]; + }); + + Object.defineProperty(Array.prototype, "1", { + configurable: true, + enumerable: true, + get() { + return 14; + } + }); + + const array = [13, , 15, 16]; + ctx.setLineDash(array); + assert_array_equals(ctx.getLineDash(), [13, 14, 15, 16]); +}, "A holey array with fallback to an accessor on the prototype"); + +test(t => { + // Should fail rather than falling back to record + assert_throws_js(TypeError, function() { new URLSearchParams(["key", "value"]); }); +}, "A string array in sequence<sequence> or record"); + +</script> |