forked from mirrors/gecko-dev
		
	The WebIDL spec requires enumerable operations here. --HG-- extra : rebase_source : 4c9925bac06badaeb22341e2ba206912142309c1
		
			
				
	
	
		
			160 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
	
		
			5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// META: global=jsshell
 | 
						|
// META: script=/wasm/jsapi/assertions.js
 | 
						|
 | 
						|
function test_operations(object, object_name, operations) {
 | 
						|
  for (const [name, length] of operations) {
 | 
						|
    test(() => {
 | 
						|
      const propdesc = Object.getOwnPropertyDescriptor(object, name);
 | 
						|
      assert_equals(typeof propdesc, "object");
 | 
						|
      assert_true(propdesc.writable, "writable");
 | 
						|
      assert_true(propdesc.enumerable, "enumerable");
 | 
						|
      assert_true(propdesc.configurable, "configurable");
 | 
						|
      assert_equals(propdesc.value, object[name]);
 | 
						|
    }, `${object_name}.${name}`);
 | 
						|
 | 
						|
    test(() => {
 | 
						|
      assert_function_name(object[name], name, `${object_name}.${name}`);
 | 
						|
    }, `${object_name}.${name}: name`);
 | 
						|
 | 
						|
    test(() => {
 | 
						|
      assert_function_length(object[name], length, `${object_name}.${name}`);
 | 
						|
    }, `${object_name}.${name}: length`);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function test_attributes(object, object_name, attributes) {
 | 
						|
  for (const [name, mutable] of attributes) {
 | 
						|
    test(() => {
 | 
						|
      const propdesc = Object.getOwnPropertyDescriptor(object, name);
 | 
						|
      assert_equals(typeof propdesc, "object");
 | 
						|
      assert_true(propdesc.enumerable, "enumerable");
 | 
						|
      assert_true(propdesc.configurable, "configurable");
 | 
						|
    }, `${object_name}.${name}`);
 | 
						|
 | 
						|
    test(() => {
 | 
						|
      const propdesc = Object.getOwnPropertyDescriptor(object, name);
 | 
						|
      assert_equals(typeof propdesc, "object");
 | 
						|
      assert_equals(typeof propdesc.get, "function");
 | 
						|
      assert_function_name(propdesc.get, "get " + name, `getter for "${name}"`);
 | 
						|
      assert_function_length(propdesc.get, 0, `getter for "${name}"`);
 | 
						|
    }, `${object_name}.${name}: getter`);
 | 
						|
 | 
						|
    test(() => {
 | 
						|
      const propdesc = Object.getOwnPropertyDescriptor(object, name);
 | 
						|
      assert_equals(typeof propdesc, "object");
 | 
						|
      if (mutable) {
 | 
						|
        assert_equals(typeof propdesc.set, "function");
 | 
						|
        assert_function_name(propdesc.set, "set " + name, `setter for "${name}"`);
 | 
						|
        assert_function_length(propdesc.set, 1, `setter for "${name}"`);
 | 
						|
      } else {
 | 
						|
        assert_equals(typeof propdesc.set, "undefined");
 | 
						|
      }
 | 
						|
    }, `${object_name}.${name}: setter`);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
test(() => {
 | 
						|
  const propdesc = Object.getOwnPropertyDescriptor(this, "WebAssembly");
 | 
						|
  assert_equals(typeof propdesc, "object");
 | 
						|
  assert_true(propdesc.writable, "writable");
 | 
						|
  assert_false(propdesc.enumerable, "enumerable");
 | 
						|
  assert_true(propdesc.configurable, "configurable");
 | 
						|
  assert_equals(propdesc.value, this.WebAssembly);
 | 
						|
}, "WebAssembly: property descriptor");
 | 
						|
 | 
						|
test(() => {
 | 
						|
  assert_throws(new TypeError(), () => WebAssembly());
 | 
						|
}, "WebAssembly: calling");
 | 
						|
 | 
						|
test(() => {
 | 
						|
  assert_throws(new TypeError(), () => new WebAssembly());
 | 
						|
}, "WebAssembly: constructing");
 | 
						|
 | 
						|
const interfaces = [
 | 
						|
  "Module",
 | 
						|
  "Instance",
 | 
						|
  "Memory",
 | 
						|
  "Table",
 | 
						|
  "Global",
 | 
						|
  "CompileError",
 | 
						|
  "LinkError",
 | 
						|
  "RuntimeError",
 | 
						|
];
 | 
						|
 | 
						|
for (const name of interfaces) {
 | 
						|
  test(() => {
 | 
						|
    const propdesc = Object.getOwnPropertyDescriptor(WebAssembly, name);
 | 
						|
    assert_equals(typeof propdesc, "object");
 | 
						|
    assert_true(propdesc.writable, "writable");
 | 
						|
    assert_false(propdesc.enumerable, "enumerable");
 | 
						|
    assert_true(propdesc.configurable, "configurable");
 | 
						|
    assert_equals(propdesc.value, WebAssembly[name]);
 | 
						|
  }, `WebAssembly.${name}: property descriptor`);
 | 
						|
 | 
						|
  test(() => {
 | 
						|
    const interface_object = WebAssembly[name];
 | 
						|
    const propdesc = Object.getOwnPropertyDescriptor(interface_object, "prototype");
 | 
						|
    assert_equals(typeof propdesc, "object");
 | 
						|
    assert_false(propdesc.writable, "writable");
 | 
						|
    assert_false(propdesc.enumerable, "enumerable");
 | 
						|
    assert_false(propdesc.configurable, "configurable");
 | 
						|
  }, `WebAssembly.${name}: prototype`);
 | 
						|
 | 
						|
  test(() => {
 | 
						|
    const interface_object = WebAssembly[name];
 | 
						|
    const interface_prototype_object = interface_object.prototype;
 | 
						|
    const propdesc = Object.getOwnPropertyDescriptor(interface_prototype_object, "constructor");
 | 
						|
    assert_equals(typeof propdesc, "object");
 | 
						|
    assert_true(propdesc.writable, "writable");
 | 
						|
    assert_false(propdesc.enumerable, "enumerable");
 | 
						|
    assert_true(propdesc.configurable, "configurable");
 | 
						|
    assert_equals(propdesc.value, interface_object);
 | 
						|
  }, `WebAssembly.${name}: prototype.constructor`);
 | 
						|
}
 | 
						|
 | 
						|
test_operations(WebAssembly, "WebAssembly", [
 | 
						|
  ["validate", 1],
 | 
						|
  ["compile", 1],
 | 
						|
  ["instantiate", 1],
 | 
						|
]);
 | 
						|
 | 
						|
 | 
						|
test_operations(WebAssembly.Module, "WebAssembly.Module", [
 | 
						|
  ["exports", 1],
 | 
						|
  ["imports", 1],
 | 
						|
  ["customSections", 2],
 | 
						|
]);
 | 
						|
 | 
						|
 | 
						|
test_attributes(WebAssembly.Instance.prototype, "WebAssembly.Instance", [
 | 
						|
  ["exports", false],
 | 
						|
]);
 | 
						|
 | 
						|
 | 
						|
test_operations(WebAssembly.Memory.prototype, "WebAssembly.Memory", [
 | 
						|
  ["grow", 1],
 | 
						|
]);
 | 
						|
 | 
						|
test_attributes(WebAssembly.Memory.prototype, "WebAssembly.Memory", [
 | 
						|
  ["buffer", false],
 | 
						|
]);
 | 
						|
 | 
						|
 | 
						|
test_operations(WebAssembly.Table.prototype, "WebAssembly.Table", [
 | 
						|
  ["grow", 1],
 | 
						|
  ["get", 1],
 | 
						|
  ["set", 2],
 | 
						|
]);
 | 
						|
 | 
						|
test_attributes(WebAssembly.Table.prototype, "WebAssembly.Table", [
 | 
						|
  ["length", false],
 | 
						|
]);
 | 
						|
 | 
						|
 | 
						|
test_operations(WebAssembly.Global.prototype, "WebAssembly.Global", [
 | 
						|
  ["valueOf", 0],
 | 
						|
]);
 | 
						|
 | 
						|
test_attributes(WebAssembly.Global.prototype, "WebAssembly.Global", [
 | 
						|
  ["value", true],
 | 
						|
]);
 |