import { Percentage } from "../percentage"; // Ajusta la ruta según sea necesario

describe("Percentage Value Object", () => {
  test("Debe crear un porcentaje válido con escala por defecto", () => {
    const result = Percentage.create({ value: 200 }); // 2.00%
    expect(result.isSuccess).toBe(true);
    expect(result.data?.toString()).toBe("2.00%");
  });

  test("Debe crear un porcentaje válido con escala definida", () => {
    const result = Percentage.create({ value: 2150, scale: 2 }); // 21.50%
    expect(result.isSuccess).toBe(true);
    expect(result.data?.toString()).toBe("21.50%");
  });

  test("Debe devolver error si la cantidad supera el 100%", () => {
    const result = Percentage.create({ value: 48732000, scale: 4 });
    expect(result.isSuccess).toBe(false);
    expect(result.error.message).toBe("La escala debe estar entre 0 y 2.");
  });

  test("Debe devolver error si la cantidad es negativa", () => {
    const result = Percentage.create({ value: -100, scale: 2 });
    expect(result.isSuccess).toBe(false);
    expect(result.error.message).toContain("La cantidad no puede ser negativa.");
  });

  test("Debe devolver error si la escala es menor a 0", () => {
    const result = Percentage.create({ value: 100, scale: -1 });
    expect(result.isSuccess).toBe(false);
    expect(result.error.message).toContain("Number must be greater than or equal to 0");
  });

  test("Debe devolver error si la escala es mayor a 10", () => {
    const result = Percentage.create({ value: 100, scale: 11 });
    expect(result.isSuccess).toBe(false);
    expect(result.error.message).toContain("La escala debe estar entre 0 y 2.");
  });

  test("Debe representar correctamente el valor como string", () => {
    const result = Percentage.create({ value: 750, scale: 2 }); // 7.50%
    expect(result.isSuccess).toBe(true);
    expect(result.data?.toString()).toBe("7.50%");
  });

  test("Debe manejar correctamente el caso de 0%", () => {
    const result = Percentage.create({ value: 0, scale: 2 });
    expect(result.isSuccess).toBe(true);
    expect(result.data?.toString()).toBe("0.00%");
  });
});
