| // META: global=jsshell |
| // META: script=assertions.js |
| |
| function nulls(n) { |
| return Array(n).fill(null); |
| } |
| |
| test(() => { |
| const argument = { "element": "anyfunc", "initial": 5 }; |
| const table = new WebAssembly.Table(argument); |
| assert_throws(new TypeError(), () => table.grow()); |
| }, "Missing arguments"); |
| |
| test(t => { |
| const thisValues = [ |
| undefined, |
| null, |
| true, |
| "", |
| Symbol(), |
| 1, |
| {}, |
| WebAssembly.Table, |
| WebAssembly.Table.prototype, |
| ]; |
| |
| const argument = { |
| valueOf: t.unreached_func("Should not touch the argument (valueOf)"), |
| toString: t.unreached_func("Should not touch the argument (toString)"), |
| }; |
| |
| const fn = WebAssembly.Table.prototype.grow; |
| |
| for (const thisValue of thisValues) { |
| assert_throws(new TypeError(), () => fn.call(thisValue, argument), `this=${format_value(thisValue)}`); |
| } |
| }, "Branding"); |
| |
| test(() => { |
| const argument = { "element": "anyfunc", "initial": 5 }; |
| const table = new WebAssembly.Table(argument); |
| assert_equal_to_array(table, nulls(5), "before"); |
| |
| const result = table.grow(3); |
| assert_equals(result, 5); |
| assert_equal_to_array(table, nulls(8), "after"); |
| }, "Basic"); |
| |
| test(() => { |
| const argument = { "element": "anyfunc", "initial": 3, "maximum": 5 }; |
| const table = new WebAssembly.Table(argument); |
| assert_equal_to_array(table, nulls(3), "before"); |
| |
| const result = table.grow(2); |
| assert_equals(result, 3); |
| assert_equal_to_array(table, nulls(5), "after"); |
| }, "Reached maximum"); |
| |
| test(() => { |
| const argument = { "element": "anyfunc", "initial": 2, "maximum": 5 }; |
| const table = new WebAssembly.Table(argument); |
| assert_equal_to_array(table, nulls(2), "before"); |
| |
| assert_throws(new RangeError(), () => table.grow(4)); |
| assert_equal_to_array(table, nulls(2), "after"); |
| }, "Exceeded maximum"); |
| |
| const outOfRangeValues = [ |
| undefined, |
| NaN, |
| Infinity, |
| -Infinity, |
| -1, |
| 0x100000000, |
| 0x1000000000, |
| "0x100000000", |
| { valueOf() { return 0x100000000; } }, |
| ]; |
| |
| for (const value of outOfRangeValues) { |
| test(() => { |
| const argument = { "element": "anyfunc", "initial": 1 }; |
| const table = new WebAssembly.Table(argument); |
| assert_throws(new TypeError(), () => table.grow(value)); |
| }, `Out-of-range argument: ${format_value(value)}`); |
| } |