import { isEqual } from "../..";

describe("isEqual - byValue", () => {
  describe("primitive value", () => {
    it("equals", () => {
      const prev = {
        prop_1: 1,
      };

      const next = {
        prop_1: 1,
      };

      const byValue = ["prop_1"];

      expect(isEqual({ byValue })(prev, next)).toBe(true);
    });

    it("equals", () => {
      const prop_2 = [1, 2, 3];

      const prev = {
        prop_1: 1,
        prop_2,
      };

      const next = {
        prop_1: 1,
        prop_2,
      };

      const byValue = ["prop_1"];
      const byReference = ["prop_2"];

      expect(isEqual({ byValue, byReference })(prev, next)).toBe(true);
    });

    it("not equals", () => {
      const prev = {
        prop_1: 1,
      };

      const next = {
        prop_1: 2,
      };

      const byValue = ["prop_1"];
      expect(isEqual({ byValue })(prev, next)).toBe(false);
    });

    it("not equals", () => {
      const prev = {
        prop_1: 1,
      };

      const next = {
        prop_1: undefined,
      };

      const byValue = ["prop_1"];
      expect(isEqual({ byValue })(prev, next)).toBe(false);
    });

    it("not equals", () => {
      const prev = {
        prop_1: 1,
        prop_2: [1, 2, 3],
      };

      const next = {
        prop_1: 1,
        prop_2: [1, 2, 3],
      };

      const byValue = ["prop_1"];
      const byReference = ["prop_2"];
      expect(isEqual({ byValue, byReference })(prev, next)).toBe(false);
    });

    it("not equals", () => {
      const prev = {
        index: 0,
        focused: false,
      };

      const next = {
        index: 0,
        focused: true,
      };

      const byValue = ["focused", "index"];

      expect(isEqual({ byValue })(prev, next)).toBe(false);
    });
  });

  describe("reference value", () => {
    it("equals", () => {
      const prev = {
        prop_1: [1, 2, 3],
      };

      const next = {
        prop_1: [1, 2, 3],
      };

      const byValue = ["prop_1"];

      expect(isEqual({ byValue })(prev, next)).toBe(true);
    });

    it("not equals", () => {
      const prev = {
        prop_1: [1, 2, 3],
      };

      const next = {
        prop_1: [1, 2, 4],
      };

      const byValue = ["prop_1"];

      expect(isEqual({ byValue })(prev, next)).toBe(false);
    });
  });
});
