-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfsm.test.ts
47 lines (39 loc) · 1.35 KB
/
fsm.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import { createFsm, type InferFsmStates } from './fsm.js';
describe('fsm', () => {
test('creation and transitions', () => {
const water = createFsm<{
liquid: string;
solid: number;
}>()
.transition('melt', { from: 'solid', to: 'liquid' })
.transition('freeze', { from: 'liquid', to: 'solid' });
const puddle: InferFsmStates<typeof water> = water.start('liquid', 'foo');
const liquidPuddle: InferFsmStates<typeof water, 'liquid'> = puddle;
expect(liquidPuddle).toEqual({
state: 'liquid',
transitions: { freeze: expect.any(Function) },
value: 'foo',
});
const frozenPuddle: InferFsmStates<typeof water, 'solid'> = puddle.transitions.freeze(1);
expect(frozenPuddle).toEqual({
state: 'solid',
transitions: { melt: expect.any(Function) },
value: 1,
});
});
test('ignore transition conflict', () => {
const water = createFsm<{
liquid: void;
solid: void;
}>()
.transition('melt', { from: 'solid', to: 'liquid' })
.transition('freeze', { from: 'liquid', to: 'solid' })
.transition('freeze', { from: 'liquid', to: 'liquid' as never });
const liquid = water.start('liquid');
expect(liquid.transitions.freeze()).toEqual({
state: 'solid',
transitions: { melt: expect.any(Function) },
value: undefined,
});
});
});