mapillary-js/test/state/StateTransitionMatrix.test.ts
2021-04-27 08:23:04 +02:00

157 lines
5.8 KiB
TypeScript

import { bootstrap } from "../Bootstrap";
bootstrap();
import { StateTransitionMatrix } from "../../src/state/StateTransitionMatrix";
import { State } from "../../src/state/State";
import { TraversingState } from "../../src/state/state/TraversingState";
import { generateStateParams } from "../helper/StateHelper";
import { EarthState } from "../../src/state/state/EarthState";
import { CustomState } from "../../src/state/state/CustomState";
import { WaitingState } from "../../src/state/state/WaitingState";
import { InteractiveWaitingState } from "../../src/state/state/InteractiveWaitingState";
describe("StateTransitionMatrix.ctor", () => {
it("should be contructed", () => {
const matrix = new StateTransitionMatrix();
expect(matrix).toBeDefined();
});
});
describe("StateTransitionMatrix.getState", () => {
it("should return correct state", () => {
const matrix = new StateTransitionMatrix();
const custom = matrix.getState(
new CustomState(generateStateParams()));
expect(custom).toBe(State.Custom);
const earth = matrix.getState(
new EarthState(generateStateParams()));
expect(earth).toBe(State.Earth);
const traversing = matrix.getState(
new TraversingState(generateStateParams()));
expect(traversing).toBe(State.Traversing);
const waiting = matrix.getState(
new WaitingState(generateStateParams()));
expect(waiting).toBe(State.Waiting);
const waitingInteractively = matrix.getState(
new InteractiveWaitingState(generateStateParams()));
expect(waitingInteractively).toBe(State.WaitingInteractively);
});
});
describe("StateTransitionMatrix.validate", () => {
it("should only validate valid transitions", () => {
const matrix = new StateTransitionMatrix();
const custom = new CustomState(generateStateParams());
expect(matrix.validate(custom, State.Custom)).toBe(false);
expect(matrix.validate(custom, State.Earth)).toBe(true);
expect(matrix.validate(custom, State.Traversing)).toBe(true);
expect(matrix.validate(custom, State.Waiting)).toBe(false);
expect(matrix.validate(custom, State.WaitingInteractively)).toBe(false);
const earth = new EarthState(generateStateParams());
expect(matrix.validate(earth, State.Custom)).toBe(true);
expect(matrix.validate(earth, State.Earth)).toBe(false);
expect(matrix.validate(earth, State.Traversing)).toBe(true);
expect(matrix.validate(earth, State.Waiting)).toBe(false);
expect(matrix.validate(earth, State.WaitingInteractively)).toBe(false);
const traversing = new TraversingState(generateStateParams());
expect(matrix.validate(traversing, State.Custom)).toBe(true);
expect(matrix.validate(traversing, State.Earth)).toBe(true);
expect(matrix.validate(traversing, State.Traversing)).toBe(false);
expect(matrix.validate(traversing, State.Waiting)).toBe(true);
expect(matrix.validate(traversing, State.WaitingInteractively))
.toBe(true);
const waiting = new WaitingState(generateStateParams());
expect(matrix.validate(waiting, State.Custom)).toBe(false);
expect(matrix.validate(waiting, State.Earth)).toBe(false);
expect(matrix.validate(waiting, State.Traversing)).toBe(true);
expect(matrix.validate(waiting, State.Waiting)).toBe(false);
expect(matrix.validate(waiting, State.WaitingInteractively)).toBe(true);
const waitingInteractively =
new InteractiveWaitingState(generateStateParams());
expect(matrix.validate(waitingInteractively, State.Custom))
.toBe(false);
expect(matrix.validate(waitingInteractively, State.Earth))
.toBe(false);
expect(matrix.validate(waitingInteractively, State.Traversing))
.toBe(true);
expect(matrix.validate(waitingInteractively, State.Waiting))
.toBe(true);
expect(
matrix
.validate(
waitingInteractively,
State.WaitingInteractively))
.toBe(false);
});
});
describe("StateTransitionMatrix.generate", () => {
it("should generate concrete state instances", () => {
const matrix = new StateTransitionMatrix();
expect(
matrix
.generate(
State.Custom,
generateStateParams()))
.toBeInstanceOf(CustomState);
expect(
matrix
.generate(
State.Earth,
generateStateParams()))
.toBeInstanceOf(EarthState);
expect(
matrix
.generate(
State.Traversing,
generateStateParams()))
.toBeInstanceOf(TraversingState);
expect(
matrix
.generate(
State.Waiting,
generateStateParams()))
.toBeInstanceOf(WaitingState);
expect(
matrix
.generate(
State.WaitingInteractively,
generateStateParams()))
.toBeInstanceOf(InteractiveWaitingState);
});
});
describe("StateTransitionMatrix.transition", () => {
it("should transition", () => {
const matrix = new StateTransitionMatrix();
const state = new CustomState(generateStateParams());
const transitioned = matrix.transition(state, State.Earth);
expect(transitioned).toBeInstanceOf(EarthState);
});
it("should throw if transition is not valid", () => {
const matrix = new StateTransitionMatrix();
const state = new CustomState(generateStateParams());
expect(() => { matrix.transition(state, State.Waiting); }).toThrow();
});
});