import { ROOM_TEMPERATURE, useBiscuitOven } from 'src/composables/biscuitOven'; import { TEMPERATURE_TOLERANCE, useThermostat, } from 'src/composables/thermostat'; import { expect, test } from 'vitest'; import { nextTick, ref, watchEffect } from 'vue'; import { toggleTickAsync } from '../utils'; test('starts in the off state', () => { const targetTemperature = ref('none'); const currentTemperature = ref(ROOM_TEMPERATURE); const { inTargetZoneOut, isHeaterOnOut } = useThermostat( targetTemperature, currentTemperature ); expect(inTargetZoneOut.value).toBe(false); expect(isHeaterOnOut.value).toBe(false); }); test('requests heats up when needed', async () => { const targetTemperature = ref(200); const currentTemperature = ref(ROOM_TEMPERATURE); const { inTargetZoneOut, isHeaterOnOut } = useThermostat( targetTemperature, currentTemperature ); expect(inTargetZoneOut.value).toBe(false); expect(isHeaterOnOut.value).toBe(true); }); test('requests cooldown when needed', async () => { const targetTemperature = ref(200); const currentTemperature = ref(220); const { inTargetZoneOut, isHeaterOnOut } = useThermostat( targetTemperature, currentTemperature ); expect(inTargetZoneOut.value).toBe(false); expect(isHeaterOnOut.value).toBe(false); }); test('target zone report is correct', async () => { const TARGET_TEMPERATURE = 200; const targetTemperature = ref(TARGET_TEMPERATURE); const currentTemperature = ref(0); const { inTargetZoneOut } = useThermostat( targetTemperature, currentTemperature ); currentTemperature.value = TARGET_TEMPERATURE + TEMPERATURE_TOLERANCE; await nextTick(); expect(inTargetZoneOut.value).toBe(true); currentTemperature.value = TARGET_TEMPERATURE - TEMPERATURE_TOLERANCE; await nextTick(); expect(inTargetZoneOut.value).toBe(true); currentTemperature.value = TARGET_TEMPERATURE - TEMPERATURE_TOLERANCE - 0.1; await nextTick(); expect(inTargetZoneOut.value).toBe(false); currentTemperature.value = TARGET_TEMPERATURE + TEMPERATURE_TOLERANCE + 0.1; await nextTick(); expect(inTargetZoneOut.value).toBe(false); }); test('keeps stable target temperature when connected to an oven', async () => { const TARGET_TEMPERATURE = 200; const targetTemperature = ref(TARGET_TEMPERATURE); const isHeaterOnIn = ref(false); const tick = ref(false); const { currentTemperature } = useBiscuitOven(tick, isHeaterOnIn); const { inTargetZoneOut, isHeaterOnOut } = useThermostat( targetTemperature, currentTemperature ); watchEffect(() => (isHeaterOnIn.value = isHeaterOnOut.value)); await toggleTickAsync(tick, 1000); expect(inTargetZoneOut.value).toBe(true); });