96 lines
2.7 KiB
TypeScript
96 lines
2.7 KiB
TypeScript
|
|
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<number | 'none'>('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);
|
||
|
|
});
|