From ea192a515b3a61757d13ed9c2d7070fba44f9468 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 19 Sep 2024 10:27:00 -0400 Subject: [PATCH] Add a little tiny bit of testing for the fsm. --- js/{fsm.js => fsm.mjs} | 8 +++--- js/fsm_test.mjs | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 4 deletions(-) rename js/{fsm.js => fsm.mjs} (95%) create mode 100644 js/fsm_test.mjs diff --git a/js/fsm.js b/js/fsm.mjs similarity index 95% rename from js/fsm.js rename to js/fsm.mjs index e264ba7..1c1408b 100644 --- a/js/fsm.js +++ b/js/fsm.mjs @@ -117,8 +117,8 @@ names in the event handler class (`VideoEvents` above). */ -import assert from "./assert.js"; -import { log } from "./logging.js"; + +import assert from "assert"; /* A very simple Finite State Machine class. Nothing fancy, just a state @@ -205,12 +205,12 @@ export class FSM { assert(next_state.length == 2, `Returning an array only allows 2 elements (state, func) but you returned ${next_state}`); let [state, func] = next_state; - log.debug(`FSM ${this.events.constructor.name}: (${event}) = ${this.state} -> ${state} (${args})`, "DATA:", this.data, func ? `THEN ${func.name}()` : undefined); + console.debug(`FSM ${this.events.constructor.name}: (${event}) = ${this.state} -> ${state} (${args})`, "DATA:", this.data, func ? `THEN ${func.name}()` : undefined); this.transition(state); await func(); } else { - log.debug(`FSM ${this.events.constructor.name}: (${event}) = ${this.state} -> ${next_state} (${args})`, "DATA:", this.data); + console.debug(`FSM ${this.events.constructor.name}: (${event}) = ${this.state} -> ${next_state} (${args})`, "DATA:", this.data); this.transition(next_state); } diff --git a/js/fsm_test.mjs b/js/fsm_test.mjs new file mode 100644 index 0000000..847a6aa --- /dev/null +++ b/js/fsm_test.mjs @@ -0,0 +1,56 @@ +import FSM from "./fsm.mjs"; +import assert from "assert"; + +const add_test = () => { + console.log("Additional function call on state transition passed."); +} + +class TestMachine { + constructor(data) { + console.log("DATA IS", data); + this.data = data; + } + + async open(state, inc) { + switch(state) { + case "START": + console.log("THIS", this); + this.data.count = this.data.count + inc; + return "OPEN"; + default: + return "ERROR"; + } + } + + close(state, inc) { + switch(state) { + case "OPEN": + this.data.count = this.data.count + inc; + return ["CLOSED", add_test]; + default: + return "ERROR"; + } + } +} + + +let data = {count: 0}; +let events = new TestMachine(data); +let fsm1 = new FSM(data, events); + +fsm1.onTransition((fsm) => { + console.log("On transition: ", fsm.state); +}); + +await fsm1.do('open', 3); +assert(fsm1.state === "OPEN"); +assert(data.count === 3); + +await fsm1.do('close', 4); +assert(fsm1.state === "CLOSED"); +assert(data.count === 7); + +// test the errors +await fsm1.do('open'); +assert(fsm1.state === "ERROR"); +assert(data.count === 7); // still 2 after error