| Index: third_party/WebKit/LayoutTests/bindings/sequence-type.html
|
| diff --git a/third_party/WebKit/LayoutTests/bindings/sequence-type.html b/third_party/WebKit/LayoutTests/bindings/sequence-type.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c50b3b3f668dc3df710cc8a8b0db0db3d8047c83
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/bindings/sequence-type.html
|
| @@ -0,0 +1,207 @@
|
| +<!DOCTYPE html>
|
| +<script src="../resources/testharness.js"></script>
|
| +<script src="../resources/testharnessreport.js"></script>
|
| +<script>
|
| + function createIterable(iterations) {
|
| + return {
|
| + [Symbol.iterator]() {
|
| + var i = 0;
|
| + return {next: () => iterations[i++]};
|
| + },
|
| + };
|
| + }
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence(null) },
|
| + "Converting null to sequence must throw a type error");
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence(undefined) },
|
| + "Converting undefined to sequence must throw a type error");
|
| + assert_equals(sequenceTest.identityOctetSequenceOrNull(null), null,
|
| + "Converting null to a nullable sequence works");
|
| + assert_equals(sequenceTest.identityOctetSequenceOrNull(undefined), null,
|
| + "Converting undefined to a nullable sequence works");
|
| + }, "null and undefined conversions");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + let emptyArray = [];
|
| + let emptyObject = createIterable([{done: true}]);
|
| +
|
| + let convertedArray = sequenceTest.identityLongSequence(emptyArray);
|
| + assert_array_equals(convertedArray, [], "Empty array produces an empty vector");
|
| + let convertedObject = sequenceTest.identityLongSequence(emptyObject);
|
| + assert_array_equals(convertedObject, [], "Empty object produces an empty vector");
|
| + }, "Empty sequences");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + let obj = createIterable([
|
| + { done: false, value: 34 },
|
| + { done: false, value: 42 },
|
| + { done: true }
|
| + ]);
|
| + let convertedObj = sequenceTest.identityLongSequence(obj);
|
| + assert_array_equals(convertedObj, [34, 42],
|
| + "'done: true' does not need a value property");
|
| +
|
| + obj = createIterable([
|
| + { done: false, value: 34 },
|
| + { done: false, value: 42 },
|
| + { done: true, value: 88 }
|
| + ]);
|
| + convertedObj = sequenceTest.identityLongSequence(obj);
|
| + assert_array_equals(convertedObj, [34, 42],
|
| + "'value' is ignored when 'done' is true");
|
| +
|
| + obj = createIterable([
|
| + { done: 0, value: 42 },
|
| + { done: 1, value: 34 }
|
| + ]);
|
| + convertedObj = sequenceTest.identityDoubleSequence(obj);
|
| + assert_array_equals(convertedObj, [42],
|
| + "'done' is always converted to a boolean");
|
| + }, "Iterator stop values");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + let array = [1, 2];
|
| + let convertedArray = sequenceTest.identityDoubleSequence(array);
|
| + assert_not_equals(array, convertedArray);
|
| + convertedArray.push(42);
|
| + let convertedArray2 = sequenceTest.identityDoubleSequence(array);
|
| + assert_equals(array.length, 2);
|
| + assert_not_equals(convertedArray, convertedArray2);
|
| + assert_array_equals(convertedArray2, [1, 2]);
|
| + }, "Sequences are passed by value");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + let longArray = ['not', 'a', 'long'];
|
| + longArray[5] = 42;
|
| + let convertedLongArray = sequenceTest.identityLongSequence(longArray);
|
| + assert_array_equals(convertedLongArray, [0, 0, 0, 0, 0, 42],
|
| + "Long array with gaps correctly produces a vector");
|
| +
|
| + let doubleArray = [34, 42.5];
|
| + doubleArray[9] = 2; // The elements inbetween are all undefined.
|
| + assert_throws(new TypeError, () => { sequenceTest.identityDoubleSequence(doubleArray) },
|
| + "Converting an undefined value to double throws a TypeError and " +
|
| + "causes the sequence -> C++ conversion to fail");
|
| +
|
| + let byteStringSequenceSequence = [
|
| + ["foo"],
|
| + ["bar"]
|
| + ];
|
| + byteStringSequenceSequence[7] = ["baz"];
|
| + assert_throws(new TypeError, () => {
|
| + sequenceTest.identityByteStringSequenceSequence(byteStringSequenceSequence);
|
| + }, "Converting an undefined to a sequence<> throws a TypeError and causes the " +
|
| + "entire conversion to fail");
|
| + }, "Arrays with gaps in the elements");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence({}) },
|
| + "Objects without Symbol.iterator cannot be converted");
|
| +
|
| + let obj = {
|
| + [Symbol.iterator]: 42
|
| + };
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence(obj) },
|
| + "Symbol.iterator must be callable");
|
| +
|
| + obj = {
|
| + [Symbol.iterator]() {
|
| + return 42;
|
| + }
|
| + }
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence(obj) },
|
| + "Symbol.iterator must return an object");
|
| +
|
| + obj = {
|
| + [Symbol.iterator]() {
|
| + return {}
|
| + }
|
| + }
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence(obj) },
|
| + "Symbol.iterator must return an object with a 'next' callable");
|
| +
|
| + obj = {
|
| + [Symbol.iterator]() {
|
| + return {'next': 42}
|
| + }
|
| + }
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence(obj) },
|
| + "Symbol.iterator must return an object with a 'next' callable");
|
| +
|
| + obj = {
|
| + [Symbol.iterator]() {
|
| + return {'next': () => { return 42 }}
|
| + }
|
| + }
|
| + assert_throws(new TypeError, () => { sequenceTest.identityLongSequence(obj) },
|
| + "'next' must return an object");
|
| + }, "Invalid iterable protocols");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + assert_false(sequenceTest.unionReceivedSequence(42),
|
| + "Passing a double should convert the union to double");
|
| + assert_false(sequenceTest.unionReceivedSequence(true),
|
| + "Passing a boolean should convert the union to double");
|
| + assert_true(sequenceTest.unionReceivedSequence([]),
|
| + "Passing an empty array should convert the union to a sequence");
|
| + assert_true(sequenceTest.unionReceivedSequence([34, 42]),
|
| + "Passing an array should convert the union to a sequence");
|
| + let obj = createIterable([{done: false, value: 99},
|
| + {done: false, value: -3.14},
|
| + {done: true}]);
|
| + assert_true(sequenceTest.unionReceivedSequence(obj),
|
| + "Passing an iterable object should convert the union to a sequence");
|
| + }, "Sequences in unions");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + let foods = ["Sushi", "Beer"];
|
| + assert_throws(new TypeError, () => { sequenceTest.identityFoodEnumSequence(foods) },
|
| + "Invalid enum type must throw a type error");
|
| +
|
| + foods = createIterable([{done: false, value: "Spaghetti"},
|
| + {done: false, value: "Bread"},
|
| + {done: true}]);
|
| + assert_array_equals(sequenceTest.identityFoodEnumSequence(foods),
|
| + ["Spaghetti", "Bread"]);
|
| + }, "Enum sequences");
|
| +
|
| + test(() => {
|
| + let sequenceTest = internals.sequenceTest();
|
| +
|
| + let sequenceCreationFunctions = [
|
| + (elem) => { return [elem] },
|
| + (elem) => { return createIterable([{done: false, value: elem},
|
| + {done: true}]) }
|
| + ];
|
| + for (sequenceCreationFunction of sequenceCreationFunctions) {
|
| + let elem = document.createElement('p');
|
| + sequenceTest.setElementSequence(sequenceCreationFunction(elem));
|
| + assert_array_equals(sequenceTest.getElementSequence(), [elem],
|
| + "The same DOM object was stored in the sequence");
|
| + assert_not_equals(sequenceTest.getElementSequence()[0],
|
| + document.createElement('br'),
|
| + "The same DOM object was stored in the sequence");
|
| +
|
| + elem = document.createElement('br');
|
| + assert_not_equals(sequenceTest.getElementSequence()[0], elem,
|
| + "Changing the original object does not change the sequence value");
|
| + }
|
| + }, "Converting DOM object sequences");
|
| +</script>
|
|
|