vertecs
Version:
A typescript entity-component-system framework
136 lines (110 loc) • 4.5 kB
text/typescript
import { assert } from "chai";
import {
EcsManager,
Entity,
FiniteStateMachine,
FiniteStateMachineSystem,
IsNetworked,
NetworkFiniteStateMachine,
PrefabManager,
ServerNetworkSystem,
State,
TimedState,
TimedStateSystem,
} from "../../src";
import TestClientNetworkSystem from "./systems/TestClientNetworkSystem";
import TestClientHandler from "./systems/TestClientHandler";
class TimedStateTest1 extends TimedState {
public constructor() {
super(1000, 1, "test2");
}
}
class StateTest2 extends State {
public constructor() {
super();
}
}
class StateTest3 extends State {
public constructor() {
super();
}
}
describe("FiniteStateMachine", async () => {
const allowedNetworkComponents = [NetworkFiniteStateMachine];
let serverNetworkSystem: ServerNetworkSystem;
const serverEcsManager = new EcsManager();
let serverEntity;
let clientANetworkSystem: TestClientNetworkSystem;
const clientAEcsManager = new EcsManager();
before(async () => {
serverNetworkSystem = new ServerNetworkSystem(
allowedNetworkComponents,
TestClientHandler
);
await serverEcsManager.addSystem(serverNetworkSystem);
await serverEcsManager.addSystem(new FiniteStateMachineSystem());
await serverEcsManager.addSystem(new TimedStateSystem());
await serverEcsManager.start();
Object.assign(global, { WebSocket: (await import("ws")).WebSocket });
clientANetworkSystem = new TestClientNetworkSystem(
allowedNetworkComponents,
"ws://localhost:8080"
);
await clientAEcsManager.addSystem(clientANetworkSystem);
await clientAEcsManager.addSystem(new FiniteStateMachineSystem());
await clientAEcsManager.addSystem(new TimedStateSystem());
const testPrefab = new Entity();
const finiteStateMachine = new FiniteStateMachine(
"test1",
[
{ name: "test1", state: new TimedStateTest1() },
{ name: "test2", state: new StateTest2() },
{ name: "test3", state: new StateTest3() },
],
[
{ stateName: "test1", nextStateNames: ["test2"] },
{ stateName: "test2", nextStateNames: ["test3"] },
{ stateName: "test3", nextStateNames: ["test1"] },
]
);
testPrefab.addComponent(finiteStateMachine);
PrefabManager.add("testPrefab", testPrefab);
serverEntity = PrefabManager.get("testPrefab");
if (!serverEntity) throw new Error("Prefab not found");
serverEntity.addComponent(new IsNetworked());
serverEntity.addComponent(new NetworkFiniteStateMachine());
serverEcsManager.addEntity(serverEntity);
await clientAEcsManager.start();
});
it("should start with state1", async () => {
await new Promise((resolve) => setTimeout(resolve, 100));
const clientAEntity = clientAEcsManager.entities[0];
const finiteStateMachine =
clientAEntity.getComponent(FiniteStateMachine);
assert.equal(finiteStateMachine?.currentStateName, "test1");
});
it("should move to state2 after a second", async () => {
await new Promise((resolve) => setTimeout(resolve, 1000));
const clientAEntity = clientAEcsManager.entities[0];
const clientAFiniteStateMachine =
clientAEntity.getComponent(FiniteStateMachine);
const serverFiniteStateMachine =
serverEcsManager.entities[0].getComponent(FiniteStateMachine);
assert.equal(clientAFiniteStateMachine?.currentStateName, "test2");
assert.equal(serverFiniteStateMachine?.currentStateName, "test2");
});
it("should move to state3 after server moves to state3", async () => {
const serverFiniteStateMachine =
serverEcsManager.entities[0].getComponent(FiniteStateMachine);
serverFiniteStateMachine?.setNextState("test3");
await new Promise((resolve) => setTimeout(resolve, 100));
const clientAEntity = clientAEcsManager.entities[0];
const clientAFiniteStateMachine =
clientAEntity.getComponent(FiniteStateMachine);
assert.equal(clientAFiniteStateMachine?.currentStateName, "test3");
});
after(async () => {
await serverEcsManager.stop();
await clientAEcsManager.stop();
});
});