wasm-bindgen/tests/wasm/classes.js
Alex Crichton 3f85d7db9f Remove the need for a ConstructorToken
This commit removes the need for an injected `ConstructorToken` type and
also cleans up the story we have for generating constructors a bit.
After this commit a `constructor()` is omitted entirely if we're in
non-debug mode and there's no actual listed constructor. Additionally we
don't deal with splat arguments and rerouting constructors, Nick was
kind enough to enlighten me about `Object.create` which is creating an
instance without running the constructor!

Instances of an exported type are now created through one of two
methods:

* If `#[wasm_bindgen(constructor)]` is present, then a `constructor` is
  generated with the appropriate signature. If a constructor is not
  present and we're in debug mode, a throwing constructor is generated.
  If we're in release mode and there's no constructor, no constructor is
  generated.

* Otherwise if a binding returns an instance of a type (or otherwise
  needs to manfuacture an instance, then it will cause an internal
  `__wrap` function to be generated. This function will use
  `Object.create` to create an instance without running the constructor.

This should ideally clean up our generated JS for classes quite a bit,
making it much more lean-and-mean!
2018-09-21 17:42:06 -07:00

135 lines
3.5 KiB
JavaScript

const wasm = require('wasm-bindgen-test.js');
const assert = require('assert');
exports.js_simple = () => {
const r = new wasm.ClassesSimple();
assert.strictEqual(r.add(0), 0);
assert.strictEqual(r.add(1), 1);
assert.strictEqual(r.add(1), 2);
r.add(2);
assert.strictEqual(r.consume(), 4);
assert.throws(() => r.free(), /null pointer passed to rust/);
const r2 = wasm.ClassesSimple.with_contents(10);
assert.strictEqual(r2.add(1), 11);
assert.strictEqual(r2.add(2), 13);
assert.strictEqual(r2.add(3), 16);
r2.free();
const r3 = new wasm.ClassesSimple();
assert.strictEqual(r3.add(42), 42);
r3.free();
};
exports.js_strings = () => {
const r = wasm.ClassesStrings1.new();
r.set(3);
let bar = r.bar('baz');
r.free();
assert.strictEqual(bar.name(), 'foo-baz-3');
bar.free();
};
exports.js_exceptions = () => {
// this test only works when `--debug` is passed to `wasm-bindgen` (or the
// equivalent thereof)
if (require('process').env.WASM_BINDGEN_NO_DEBUG)
return;
assert.throws(() => new wasm.ClassesExceptions1(), /cannot invoke `new` directly/);
let a = wasm.ClassesExceptions1.new();
a.free();
assert.throws(() => a.free(), /null pointer passed to rust/);
let b = wasm.ClassesExceptions1.new();
b.foo(b);
assert.throws(() => b.bar(b), /recursive use of an object/);
let c = wasm.ClassesExceptions1.new();
let d = wasm.ClassesExceptions2.new();
assert.throws(() => c.foo(d), /expected instance of ClassesExceptions1/);
d.free();
c.free();
};
exports.js_pass_one_to_another = () => {
let a = wasm.ClassesPassA.new();
let b = wasm.ClassesPassB.new();
a.foo(b);
a.bar(b);
a.free();
};
exports.take_class = foo => {
assert.strictEqual(foo.inner(), 13);
foo.free();
assert.throws(() => foo.free(), /null pointer passed to rust/);
};
exports.js_constructors = () => {
const foo = new wasm.ConstructorsFoo(1);
assert.strictEqual(foo.get_number(), 1);
foo.free();
assert.strictEqual(wasm.ConstructorsBar.new, undefined);
const foo2 = new wasm.ConstructorsFoo(2);
assert.strictEqual(foo2.get_number(), 2);
foo2.free();
const bar = new wasm.ConstructorsBar(3, 4);
assert.strictEqual(bar.get_sum(), 7);
bar.free();
assert.strictEqual(wasm.ConstructorsBar.other_name, undefined);
const bar2 = new wasm.ConstructorsBar(5, 6);
assert.strictEqual(bar2.get_sum(), 11);
bar2.free();
assert.strictEqual(wasm.cross_item_construction().get_sum(), 15);
};
exports.js_empty_structs = () => {
wasm.OtherEmpty.return_a_value();
};
exports.js_public_fields = () => {
const a = wasm.PublicFields.new();
assert.strictEqual(a.a, 0);
a.a = 3;
assert.strictEqual(a.a, 3);
assert.strictEqual(a.b, 0);
a.b = 7;
assert.strictEqual(a.b, 7);
assert.strictEqual(a.c, 0);
a.c = 8;
assert.strictEqual(a.c, 8);
assert.strictEqual(a.d, 0);
a.d = 3.3;
assert.strictEqual(a.d, 3);
};
exports.js_using_self = () => {
wasm.UseSelf.new().free();
};
exports.js_readonly_fields = () => {
const a = wasm.Readonly.new();
assert.strictEqual(a.a, 0);
a.a = 3;
assert.strictEqual(a.a, 0);
a.free();
};
exports.js_double_consume = () => {
const r = new wasm.DoubleConsume();
assert.throws(() => r.consume(r), /Attempt to use a moved value/);
};
exports.js_js_rename = () => {
(new wasm.JsRename()).bar();
wasm.classes_foo();
};