the-biscuit-machine/test/vitest/__tests__/thermostat.test.ts

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);
});