// Type conversion error should report its type.

load(libdir + 'asserts.js');

function test() {
  // constructor
  assertTypeErrorMessage(() => { ctypes.int32_t("foo"); },
                         "can't convert the string \"foo\" to the type int32_t");
  assertTypeErrorMessage(() => { ctypes.int32_t(null); },
                         "can't convert null to the type int32_t");
  assertTypeErrorMessage(() => { ctypes.int32_t(undefined); },
                         "can't convert undefined to the type int32_t");
  assertTypeErrorMessage(() => { ctypes.int32_t({}); },
                         "can't convert the object ({}) to the type int32_t");
  assertTypeErrorMessage(() => { ctypes.int32_t([]); },
                         "can't convert the array [] to the type int32_t");
  assertTypeErrorMessage(() => { ctypes.int32_t(new Int8Array([])); },
                         "can't convert the typed array ({}) to the type int32_t");
  assertTypeErrorMessage(() => { ctypes.int32_t(ctypes.int32_t); },
                         "can't convert ctypes.int32_t to the type int32_t");
  assertTypeErrorMessage(() => { ctypes.int32_t("0xfffffffffffffffffffffff"); },
                         "can't convert the string \"0xfffffffffffffffffffffff\" to the type int32_t");
  if (typeof Symbol === "function") {
    assertTypeErrorMessage(() => { ctypes.int32_t(Symbol.iterator); },
                           "can't convert Symbol.iterator to the type int32_t");
    assertTypeErrorMessage(() => { ctypes.int32_t(Symbol("foo")); },
                           "can't convert Symbol(\"foo\") to the type int32_t");
  }

  // value setter
  let test_struct = ctypes.StructType("test_struct", [{ "x": ctypes.int32_t }]);
  let struct_val = test_struct();
  assertTypeErrorMessage(() => { ctypes.bool().value = struct_val; },
                         "can't convert test_struct(0) to the type boolean");
  assertTypeErrorMessage(() => { ctypes.char16_t().value = struct_val; },
                         "can't convert test_struct(0) to the type char16_t");
  assertTypeErrorMessage(() => { ctypes.int8_t().value = struct_val; },
                         "can't convert test_struct(0) to the type int8_t");
  assertTypeErrorMessage(() => { ctypes.double().value = struct_val; },
                         "can't convert test_struct(0) to the type double");
}

if (typeof ctypes === "object")
  test();
