// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.

import { assertEquals, assertThrows } from "jsr:@std/assert@^0.215.0";
import { validateBinaryLike } from "./_util.ts";

Deno.test("validateBinaryLike()", () => {
  assertEquals(validateBinaryLike("hello"), new TextEncoder().encode("hello"));
  assertEquals(
    validateBinaryLike(new Uint8Array([1, 2, 3])),
    new Uint8Array([1, 2, 3]),
  );
  assertEquals(
    validateBinaryLike(new Uint8Array([1, 2, 3]).buffer),
    new Uint8Array([1, 2, 3]),
  );
});

Deno.test("validateBinaryLike() throws on invalid inputs", () => {
  assertThrows(
    () => {
      validateBinaryLike(1);
    },
    TypeError,
    "The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type number.",
  );
  assertThrows(
    () => {
      validateBinaryLike(undefined);
    },
    TypeError,
    "The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type undefined.",
  );
  assertThrows(
    () => {
      validateBinaryLike(null);
    },
    TypeError,
    "The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type null.",
  );
  assertThrows(
    () => {
      validateBinaryLike({});
    },
    TypeError,
    "The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type Object.",
  );
  assertThrows(
    () => {
      validateBinaryLike(new class MyClass {}());
    },
    TypeError,
    "The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type MyClass.",
  );
  assertThrows(
    () => {
      validateBinaryLike(Object.create(null));
    },
    TypeError,
    "The input must be a Uint8Array, a string, or an ArrayBuffer. Received a value of the type object.",
  );
});
