const coolprop = require('../src/index.js');

describe('Temperature Conversion Tests', () => {

    describe('Regular Temperature Conversions', () => {
        const testCases = [
            {
                startUnit: 'C',
                startValue: 25,
                expectedK: 298.15,
                conversions: {
                    F: 77,
                    K: 298.15,
                    C: 25
                }
            },
            {
                startUnit: 'F',
                startValue: 77,
                expectedK: 298.15,
                conversions: {
                    F: 77,
                    K: 298.15,
                    C: 25
                }
            },
            {
                startUnit: 'K',
                startValue: 298.15,
                expectedK: 298.15,
                conversions: {
                    F: 77,
                    K: 298.15,
                    C: 25
                }
            }
        ];

        testCases.forEach(({ startUnit, startValue, expectedK, conversions }) => {
            test(`${startValue}${startUnit} conversion chain`, () => {
                // First convert to Kelvin
                const toK = coolprop._convertTempToK(startValue, startUnit);
                expect(Math.round(toK * 100) / 100).toBe(expectedK);

                // Then convert from Kelvin to each unit
                Object.entries(conversions).forEach(([unit, expected]) => {
                    const converted = coolprop._convertTempFromK(toK, unit);
                    expect(Math.round(converted * 100) / 100).toBe(expected);
                });
            });
        });
    });

    describe('Delta Temperature Conversions', () => {
        const testCases = [
            {
                startValue: 10,  // 10K temperature difference
                expected: {
                    K: 10,
                    C: 10,
                    F: 18  // 10K = 18°F difference
                }
            }
        ];

        testCases.forEach(({ startValue, expected }) => {
            test(`${startValue}K delta conversion to all units`, () => {
                Object.entries(expected).forEach(([unit, expectedValue]) => {
                    const converted = coolprop._convertDeltaTempFromK(startValue, unit);
                    expect(Math.round(converted * 100) / 100).toBe(expectedValue);
                });
            });
        });
    });

    describe('Common Temperature Points', () => {
        const commonPoints = [
            {
                description: 'Water freezing point',
                C: 0,
                F: 32,
                K: 273.15
            },
            {
                description: 'Water boiling point',
                C: 100,
                F: 212,
                K: 373.15
            },
            {
                description: 'Room temperature',
                C: 20,
                F: 68,
                K: 293.15
            },
            {
                description: 'Typical refrigeration evaporator',
                C: 5,
                F: 41,
                K: 278.15
            },
            {
                description: 'Typical refrigeration condenser',
                C: 35,
                F: 95,
                K: 308.15
            }
        ];

        commonPoints.forEach(point => {
            test(`${point.description} conversions`, () => {
                // Test conversion to Kelvin from each unit
                const fromC = coolprop._convertTempToK(point.C, 'C');
                const fromF = coolprop._convertTempToK(point.F, 'F');
                
                expect(Math.round(fromC * 100) / 100).toBe(point.K);
                expect(Math.round(fromF * 100) / 100).toBe(point.K);

                // Test conversion from Kelvin to each unit
                const toC = coolprop._convertTempFromK(point.K, 'C');
                const toF = coolprop._convertTempFromK(point.K, 'F');

                expect(Math.round(toC * 100) / 100).toBe(point.C);
                expect(Math.round(toF * 100) / 100).toBe(point.F);
            });
        });
    });
}); 