import {
  getThemeProp,
  getThemeStringProp,
  getThemeNumberProp,
} from "../../index";
import ThemePropertyException from "../../../exceptions/ThemePropertyException";

const STRING_PROP_VALUE = "This is a string prop";

describe("createTheme", () => {
  const theme = {
    STRING_PROP: STRING_PROP_VALUE,
    NUMBER_PROP: 12345,
    OBJECT_PROP: {
      key: "value",
    },
    /**
     */
    FUNCTION_PROP: () => "function result",
    NULL_PROP: null,
  };

  it("getThemeProp", () => {
    expect(getThemeProp(theme, "STRING_PROP", "DEFAULT")).toBe(
      STRING_PROP_VALUE,
    );
    expect(getThemeProp(theme, "NUMBER_PROP", "DEFAULT")).toBe(12345);
    expect(getThemeProp(theme, "OBJECT_PROP", "DEFAULT")).toStrictEqual({
      key: "value",
    });

    expect(() => getThemeProp(theme, "FUNCTION_PROP", "DEFAULT")).toThrow(
      ThemePropertyException,
    );
    expect(getThemeProp(theme, "NULL_PROP", "DEFAULT")).toBe("DEFAULT");
    expect(getThemeProp(theme, "NOT_EXISTING", "DEFAULT")).toBe("DEFAULT");
  });

  it("getThemeStringProp", () => {
    expect(getThemeStringProp(theme, "STRING_PROP", "DEFAULT")).toBe(
      STRING_PROP_VALUE,
    );
    expect(getThemeStringProp(theme, "NUMBER_PROP", "DEFAULT")).toBe("12345");
    expect(() => getThemeStringProp(theme, "OBJECT_PROP", "DEFAULT")).toThrow(
      ThemePropertyException,
    );

    expect(() => getThemeStringProp(theme, "FUNCTION_PROP", "DEFAULT")).toThrow(
      ThemePropertyException,
    );
    expect(getThemeStringProp(theme, "NULL_PROP", "DEFAULT")).toBe("DEFAULT");
    expect(getThemeStringProp(theme, "NOT_EXISTING", "DEFAULT")).toBe(
      "DEFAULT",
    );
  });

  it("getThemeNumberProp", () => {
    expect(() => getThemeNumberProp(theme, "STRING_PROP", 123)).toThrow(
      ThemePropertyException,
    );
    expect(getThemeNumberProp(theme, "NUMBER_PROP", 123)).toBe(12345);
    expect(() => getThemeNumberProp(theme, "OBJECT_PROP", 123)).toThrow(
      ThemePropertyException,
    );

    expect(() => getThemeNumberProp(theme, "FUNCTION_PROP", 123)).toThrow(
      ThemePropertyException,
    );
    expect(getThemeNumberProp(theme, "NULL_PROP", 123)).toBe(123);
    expect(getThemeNumberProp(theme, "NOT_EXISTING", 123)).toBe(123);
  });
});
