import NumberFormatter from "../../utils/NumberFormatter";

describe("NumberFormatter.test", () => {
    describe("Money format utils: NumberFormatter.format()", () => {
        test("Falsy values", () => {
            expect(NumberFormatter.format(0)).toEqual("0.00");
            // expect(NumberFormatter.format(null)).toEqual("0");
            // expect(NumberFormatter.format(undefined)).toEqual("0");
            expect(NumberFormatter.format(0.0)).toEqual("0.00");
        })
        test("Integer numbers", () => {
            expect(NumberFormatter.format(1000)).toEqual("1 000.00");
            expect(NumberFormatter.format(3440325423)).toEqual("3 440 325 423.00");
        });
        test("Float numbers", () => {
            expect(NumberFormatter.format(67000.33)).toEqual("67 000.33");
            expect(NumberFormatter.format(30000 / 23)).toEqual("1 304.35");
        });
    });
    describe("MathJs fraction round utils: tiyinRound()", () => {
        test("Falsy values", () => {
            expect(NumberFormatter.round(0)).toEqual(0);
            // expect(NumberFormatter.round(null)).toEqual(0);
            // expect(NumberFormatter.round(undefined)).toEqual(0);
            expect(NumberFormatter.round(0.0)).toEqual(0);
        })
        test("Integer numbers", () => {
            expect(NumberFormatter.round(1000)).toEqual(1000);
            expect(NumberFormatter.round(3440325423)).toEqual(3440325423);
        });
        test("Float numbers", () => {
            expect(NumberFormatter.round(67000.33)).toEqual(67000.33);
            expect(NumberFormatter.round(30000 / 23)).toEqual(1304.35);
        });
    });

    describe("MathJs evaluate utils: NumberFormatter.evaluateAndRound()", () => {
        test("Falsy expression", () => {
            expect(NumberFormatter.evaluateAndRound('')).toEqual(0);
            expect(NumberFormatter.evaluateAndRound('  ')).toEqual(0);
            expect(NumberFormatter.evaluateAndRound('0')).toEqual(0);
            // expect(NumberFormatter.evaluateAndRound(null)).toEqual(0);
            // expect(NumberFormatter.evaluateAndRound(undefined)).toEqual(0);
            expect(NumberFormatter.evaluateAndRound('0.0')).toEqual(0);
            expect(NumberFormatter.evaluateAndRound('0.0000001')).toEqual(0);
        })
        test("Integer expression", () => {
            expect(NumberFormatter.evaluateAndRound("1000+(-8999+222-8222)-2*800+98000")).toEqual(80401);
            expect(NumberFormatter.evaluateAndRound("3440325423")).toEqual(3440325423);
        });
        test("Float expression", () => {
            expect(NumberFormatter.evaluateAndRound("(2000+5000-2233)*25000-3*4*7000/343")).toEqual(119174755.1);
            expect(NumberFormatter.evaluateAndRound("67000.33 + 2*8000 + 3*4*7000/343")).toEqual(83245.23);
            expect(NumberFormatter.evaluateAndRound("2/4")).toEqual(0.5);
        });
        test("Failed expression", () => {
            expect(() => NumberFormatter.evaluateAndRound("Invalid expression")).toThrowError();
            expect(() => NumberFormatter.evaluateAndRound("sdfa+sadf-sd")).toThrowError();
            expect(() => NumberFormatter.evaluateAndRound("2**4")).toThrow(SyntaxError);
            expect(() => NumberFormatter.evaluateAndRound(".$#")).toThrowError();
        });
    });
});