const assert = require('assert');
const wasm = require('wasm-bindgen-test');

exports.works_call = a => {
    a();
};

exports.works_thread = a => a(2);

let CANNOT_REUSE_CACHE = null;

exports.cannot_reuse_call = a => {
    CANNOT_REUSE_CACHE = a;
};

exports.cannot_reuse_call_again = () => {
    CANNOT_REUSE_CACHE();
};

exports.long_lived_call1 = a => {
    a();
};

exports.long_lived_call2 = a => a(2);

exports.many_arity_call1 = a => {
    a();
};
exports.many_arity_call2 = a => {
    a(1);
};
exports.many_arity_call3 = a => {
    a(1, 2);
};
exports.many_arity_call4 = a => {
    a(1, 2, 3);
};
exports.many_arity_call5 = a => {
    a(1, 2, 3, 4);
};
exports.many_arity_call6 = a => {
    a(1, 2, 3, 4, 5);
};
exports.many_arity_call7 = a => {
    a(1, 2, 3, 4, 5, 6);
};
exports.many_arity_call8 = a => {
    a(1, 2, 3, 4, 5, 6, 7);
};
exports.many_arity_call9 = a => {
    a(1, 2, 3, 4, 5, 6, 7, 8);
};

let LONG_LIVED_DROPPING_CACHE = null;

exports.long_lived_dropping_cache = a => {
    LONG_LIVED_DROPPING_CACHE = a;
};
exports.long_lived_dropping_call = () => {
    LONG_LIVED_DROPPING_CACHE();
};

let LONG_FNMUT_RECURSIVE_CACHE = null;

exports.long_fnmut_recursive_cache = a => {
    LONG_FNMUT_RECURSIVE_CACHE = a;
};
exports.long_fnmut_recursive_call = () => {
    LONG_FNMUT_RECURSIVE_CACHE();
};

exports.fnmut_call = a => {
    a();
};

exports.fnmut_thread = a => a(2);

let FNMUT_BAD_F = null;

exports.fnmut_bad_call = a => {
    FNMUT_BAD_F = a;
    a();
};

exports.fnmut_bad_again = x => {
    if (x) {
        FNMUT_BAD_F();
    }
};

exports.string_arguments_call = a => {
    a('foo');
};

exports.string_ret_call = a => {
    assert.strictEqual(a('foo'), 'foobar');
};

let DROP_DURING_CALL = null;
exports.drop_during_call_save = f => {
  DROP_DURING_CALL = f;
};
exports.drop_during_call_call = () => DROP_DURING_CALL();

exports.js_test_closure_returner = () => {
  wasm.closure_returner().someKey();
};

exports.calling_it_throws = a => {
  try {
    a();
    return false;
  } catch(_) {
    return true;
  }
};

exports.call_val = f => f();

exports.pass_reference_first_arg_twice = (a, b, c) => {
  b(a);
  c(a);
  a.free();
};

exports.call_destroyed = f => {
  assert.throws(f, /invoked recursively or destroyed/);
};

let FORGOTTEN_CLOSURE = null;

exports.js_store_forgotten_closure = f => {
  FORGOTTEN_CLOSURE = f;
};

exports.js_call_forgotten_closure = () => {
  FORGOTTEN_CLOSURE();
};
