import LayoutHintCollection from "../LayoutHintCollection";
import { IllegalArgumentException } from "../../../exceptions";

describe("layoutHintCollection", () => {
  const lh = new LayoutHintCollection([
    "saml-auth",
    "int=42",
    "int-colon:42",
    "no-val=",
    "no-val-colon:",
    "string-val=value",
    "string-val-colon:value",
    "multi-val=val1;val2;val3",
    "multi-val-colon:val1;val2;val3",
    "number=42.13",
    "number-colon:42.13",
  ]);

  it("can check if hint or part exists", () => {
    expect(lh.has("saml-auth")).toBe(true);
    expect(lh.has("saml")).toBe(true);
    expect(lh.has("not-existing")).toBe(false);
    expect(lh.has()).toBe(false);
  });

  it("can check exact if hint exists", () => {
    expect(lh.hasExact("saml-auth")).toBe(true);
    expect(lh.hasExact("saml")).toBe(false);
    expect(lh.hasExact("not-existing")).toBe(false);
    expect(lh.hasExact()).toBe(false);
  });

  it("correctly retrieves a layout hint", () => {
    expect(lh.getByLayoutHint("does-not-exist")).toBeNull();
    expect(lh.getByLayoutHint("saml-auth")).toBe("saml-auth");
    expect(lh.getByLayoutHint("no-val")).toBe("no-val=");
    expect(lh.getByLayoutHint("string-val")).toBe("string-val=value");
    expect(lh.getByLayoutHint("multi-val")).toBe("multi-val=val1;val2;val3");
    expect(lh.getByLayoutHint("int")).toBe("int=42");
    expect(lh.getByLayoutHint("number")).toBe("number=42.13");
  });

  it("correctly retrieves a layout hint value", () => {
    expect(lh.getLayoutHintValue("does-not-exist")).toBeNull();
    expect(lh.getLayoutHintValue("saml-auth")).toBeNull();
    expect(lh.getLayoutHintValue("no-val")).toBe("");
    expect(lh.getLayoutHintValue("string-val")).toBe("value");
    expect(lh.getLayoutHintValue("multi-val")).toBe("val1;val2;val3");
    expect(lh.getLayoutHintValue("int")).toBe("42");
    expect(lh.getLayoutHintValue("number")).toBe("42.13");

    expect(lh.getLayoutHintValue("no-val-colon")).toBe("");
    expect(lh.getLayoutHintValue("string-val-colon")).toBe("value");
    expect(lh.getLayoutHintValue("multi-val-colon")).toBe("val1;val2;val3");
    expect(lh.getLayoutHintValue("int-colon")).toBe("42");
    expect(lh.getLayoutHintValue("number-colon")).toBe("42.13");
    expect(lh.getLayoutHintValue("number-colon:")).toBe("42.13");
  });

  it("correctly retrieves multiple layout hint values", () => {
    expect(lh.getLayoutHintValues("does-not-exist")).toBeNull();
    expect(lh.getLayoutHintValue("saml-auth")).toBeNull();
    expect(lh.getLayoutHintValues("no-val")).toStrictEqual([]);
    expect(lh.getLayoutHintValues("string-val")).toStrictEqual(["value"]);
    expect(lh.getLayoutHintValues("multi-val")).toStrictEqual([
      "val1",
      "val2",
      "val3",
    ]);
    expect(lh.getLayoutHintValues("int")).toStrictEqual(["42"]);
    expect(lh.getLayoutHintValues("number")).toStrictEqual(["42.13"]);

    expect(lh.getLayoutHintValues("no-val-colon")).toStrictEqual([]);
    expect(lh.getLayoutHintValues("string-val-colon")).toStrictEqual(["value"]);
    expect(lh.getLayoutHintValues("multi-val-colon")).toStrictEqual([
      "val1",
      "val2",
      "val3",
    ]);
    expect(lh.getLayoutHintValues("int-colon")).toStrictEqual(["42"]);
    expect(lh.getLayoutHintValues("number-colon")).toStrictEqual(["42.13"]);
  });

  it("only handles arrays", () => {
    expect(() => {
      new LayoutHintCollection("test");
    }).toThrow(IllegalArgumentException);
  });
});
