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