import getResponsiveValue, { ValueMap } from './getResponsiveValue';
import { Dimensions } from 'react-native';

type testCase = [ ValueMap, number[] ];

const testCases: testCase[] = [
	// [ valueMap, outputs ]
	[{ sm: 40 }, [40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]],
	[{ sm: 40, md: 70 }, [40, 40, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70]],
	[{ sm: 40, md: 70, lg: 90 }, [40, 40, 70, 70, 70, 90, 90, 90, 90, 90, 90, 90, 90]],
	[{ sm: 40, md: 70, lg: 90, xl: 110 }, [40, 40, 70, 70, 70, 90, 90, 90, 110, 110, 110, 110, 110]],
	[{ sm: 40, md: 70, lg: 90, xl: 110, xxl: 130 }, [40, 40, 70, 70, 70, 90, 90, 90, 110, 110, 110, 130, 130]],
	[{ md: 70 }, [70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70]],
	[{ lg: 90 }, [90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90]],
	[{ xl: 110 }, [110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110]],
	[{ xxl: 130 }, [130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130]],
	[{ sm: 10, lg: 50 }, [10, 10, 10, 10, 10, 50, 50, 50, 50, 50, 50, 50, 50]],
	[{ sm: 10, xl: 50 }, [10, 10, 10, 10, 10, 10, 10, 10, 50, 50, 50, 50, 50]],
	[{ sm: 10, xxl: 50 }, [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 50, 50]],
	[{ md: 30, lg: 50 }, [30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50, 50]],
	[{ md: 30, xl: 50 }, [30, 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50]],
	[{ md: 30, xxl: 50 }, [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 50, 50]],
	[{ xl: 30, xxl: 50 }, [30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 50, 50]],
];

describe('getResponsiveValue', () => {

	test('should throw exception if value map is an empty object', () => {
		const input = {};
		expect(() => getResponsiveValue(input)).toThrow('valueMap cannot be an empty object!');
	});

	test('should return correct values', () => {
		const mockReturnValues = [
			{ width: 400 },
			{ width: 480 },
			{ width: 481 },
			{ width: 600 },
			{ width: 768 },
			{ width: 769 },
			{ width: 900 },
			{ width: 1024 },
			{ width: 1025 },
			{ width: 1115 },
			{ width: 1200 },
			{ width: 1201 },
			{ width: 1300 },
		];

		for (let i = 0; i < testCases.length; i++) {
			const input = testCases[i][0];

			for (let j = 0; j < mockReturnValues.length; j++) {
				// Mock the device width values returned by Dimensions.get() using 'mockReturnValues' for better test coverage
				Dimensions.get = jest.fn().mockReturnValue(mockReturnValues[j]);
				const output: number = testCases[i][1][j];
				expect(getResponsiveValue(input)).toBe(output);
			}

		}
	});

});