| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Sequence conversion</title> |
| <link rel="help" href="https://heycam.github.io/webidl/#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 => { |
| 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"); |
| |
| </script> |