improve ping-pong test

main
Brian Sakal 2 years ago
parent ad41407ac6
commit a6f6c3cd17

@ -15,6 +15,9 @@
var Goto = function(targetStateName) { var Goto = function(targetStateName) {
return { type: "Goto", targetStateName }; return { type: "Goto", targetStateName };
}; };
var Context = function(fn) {
return { type: "ContextMutation", fn };
};
function interpret(machine, options) { function interpret(machine, options) {
let { state, context } = options; let { state, context } = options;
if (typeof state === "undefined") { if (typeof state === "undefined") {
@ -86,11 +89,11 @@
send(ctx.clientActor, ["received-response", self]); send(ctx.clientActor, ["received-response", self]);
}; };
var startTimer = async (ctx, e, self) => { var startTimer = async (ctx, e, self) => {
await wait(500); await wait(1500);
send(self, ["timer-finished", null]); send(self, ["timer-finished", null]);
}; };
var log = (ctx, e, self) => { var log = (ctx, e, self) => {
console.log(self.state); console.log(self.state, ctx);
}; };
var client = Machine( var client = Machine(
State( State(
@ -113,6 +116,7 @@
"entry", "entry",
SideEffect(log), SideEffect(log),
SideEffect(makeRequest), SideEffect(makeRequest),
Context((ctx) => ({ ...ctx, requestsMade: ctx.requestsMade + 1 })),
Goto("awaiting-response") Goto("awaiting-response")
) )
), ),
@ -125,6 +129,7 @@
On( On(
"received-response", "received-response",
SideEffect(log), SideEffect(log),
Context((ctx) => ({ ...ctx, responsesReceived: ctx.responsesReceived + 1 })),
Goto("making-request") Goto("making-request")
) )
) )
@ -158,7 +163,7 @@
) )
) )
); );
var clientActor = interpret(client, { context: {} }); var clientActor = interpret(client, { context: { requestsMade: 0, responsesReceived: 0 } });
var serverActor = interpret(server, { context: {} }); var serverActor = interpret(server, { context: {} });
send(clientActor, ["server-created", serverActor]); send(clientActor, ["server-created", serverActor]);
})(); })();

@ -1,21 +1,10 @@
import { Machine, State, On, SideEffect, Goto, Spawn, Unspawn, interpret, Interpreter_T, send, Event_T } from '../index'; import { Machine, State, On, SideEffect, Goto, Spawn, Unspawn, interpret, Interpreter_T, send, Event_T, Context } from '../index';
const wait = (ms:number)=>new Promise((resolve)=>{ setTimeout(()=>{ resolve(1); }, ms); }); const wait = (ms:number)=>new Promise((resolve)=>{ setTimeout(()=>{ resolve(1); }, ms); });
const makeRequest = (ctx,e,self)=>{ send(ctx.serverActor, ['received-request',self]); }; const makeRequest = (ctx,e,self)=>{ send(ctx.serverActor, ['received-request',self]); };
const sendResponse = (ctx,e,self)=>{ send(ctx.clientActor, ['received-response',self]); }; const sendResponse = (ctx,e,self)=>{ send(ctx.clientActor, ['received-response',self]); };
const startTimer = async (ctx,e,self)=>{ await wait(500); send(self, ['timer-finished',null]); } const startTimer = async (ctx,e,self)=>{ await wait(1500); send(self, ['timer-finished',null]); }
const log = (ctx, e, self:Interpreter_T)=>{ console.log(self.state); }; const log = (ctx, e, self:Interpreter_T)=>{ console.log(self.state, ctx); };
type Sc =
| 'idle'
| 'making-request'
| 'awaiting-response';
type Ec =
| ['entry',null]
| ['received-response',Interpreter_T]
| ['server-created', Interpreter_T];
type Cc =
| {serverActor?:Interpreter_T};
const client = const client =
Machine( Machine(
@ -32,6 +21,7 @@ const client =
On('entry', On('entry',
SideEffect(log), SideEffect(log),
SideEffect(makeRequest), SideEffect(makeRequest),
Context((ctx)=>({...ctx, requestsMade: ctx.requestsMade+1})),
Goto('awaiting-response') Goto('awaiting-response')
), ),
), ),
@ -41,20 +31,12 @@ const client =
), ),
On('received-response', On('received-response',
SideEffect(log), SideEffect(log),
Context((ctx)=>({...ctx, responsesReceived: ctx.responsesReceived+1})),
Goto('making-request') Goto('making-request')
), ),
), ),
); );
type Ss =
| 'awaiting-request'
| 'sending-response';
type Es =
| ['entry',null]
| ['received-request',Interpreter_T]
| ['timer-finished', null];
type Cs = {clientActor?:Interpreter_T};
const server = const server =
Machine( Machine(
State('awaiting-request', State('awaiting-request',
@ -78,6 +60,6 @@ const server =
), ),
); );
const clientActor = interpret(client, {context:{}}); const clientActor = interpret(client, {context:{requestsMade:0, responsesReceived:0}});
const serverActor = interpret(server, {context:{}}); const serverActor = interpret(server, {context:{}});
send(clientActor, ['server-created', serverActor]); send(clientActor, ['server-created', serverActor]);
Loading…
Cancel
Save