UNPKG

finitestate

Version:

1. All actions are functions which have a $$displayName property. 2. All states are strings 3. Json representation for SSR

88 lines (79 loc) 2.28 kB
import FSM from "../lib"; class Counter extends FSM { constructor({ startValue, startState }) { super({ startState, startValue, transitions: ["increment", "finish", "reset"], states: ["start", "end", "running"], transitionMap: { start: { increment: "running", finish: "end" }, running: { increment: "running", finish: "end" }, end: { reset: "start" } } }); } increment() { return value => value + 1; } reset() {} finish() {} shouldTransitionOccur(_, { value }) { if (value >= 7) { return false; } return true; } } let counter; describe("CounterExample", () => { beforeEach(() => { counter = new Counter({ startState: "start", startValue: 5 }); }); test("Inherited FSM is a class", () => { expect(typeof Counter).toEqual("function"); }); test("Inherited FSM instance is an FSM", () => { expect(counter).toBeInstanceOf(FSM); expect(counter).toBeInstanceOf(Counter); }); test("Inherited FSM interface", () => { expect(typeof counter.actions).toBe("object"); expect(counter.value).toBe(5); expect(counter.state).toBe("start"); }); test("Inherited FSM transitions from start to running correctly", () => { expect(counter.value).toBe(5); expect(counter.state).toBe("start"); counter.actions.increment(); expect(counter.value).toBe(6); expect(counter.state).toBe("running"); }); test("Inherited FSM can inform which transitions are valid", () => { expect(counter.value).toBe(5); expect(counter.state).toBe("start"); expect(counter.isTransitionValid("finish")).toBe(true); expect(counter.isTransitionValid("reset")).toBe(false); counter.actions.increment(); expect(counter.value).toBe(6); expect(counter.state).toBe("running"); expect(counter.isTransitionValid("finish")).toBe(true); expect(counter.isTransitionValid("reset")).toBe(false); counter.actions.finish(); expect(counter.value).toBe(6); expect(counter.state).toBe("end"); expect(counter.isTransitionValid("finish")).toBe(false); expect(counter.isTransitionValid("reset")).toBe(true); }); });