Skip to content

Commit cf668f2

Browse files
committed
tests: process-store
1 parent f0d4851 commit cf668f2

11 files changed

+178
-54
lines changed

.gitignore

+2-9
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
1-
bw-replay-example-bins
2-
maps
31
node_modules
42
.env
53
.cache
6-
bwdata
74
dist
8-
.vscode
9-
ramps
105
.DS_Store
116
static
127
test
13-
packages/casclib/.gitmodules
14-
packages/casclib/build
158
yarn-error.log
16-
matches.json
17-
titan.js
9+
titan.js
10+
.vscode

.python-version

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.10.7

.vscode/launch.json

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
// Use IntelliSense to learn about possible attributes.
3+
// Hover to view descriptions of existing attributes.
4+
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5+
"version": "0.2.0",
6+
"configurations": [
7+
{
8+
"name": "Debug Jest Tests",
9+
"type": "node",
10+
"request": "launch",
11+
"runtimeArgs": [
12+
"--inspect-brk",
13+
"${workspaceRoot}/node_modules/jest/bin/jest.js",
14+
"--runInBand"
15+
],
16+
"console": "integratedTerminal",
17+
"internalConsoleOptions": "neverOpen",
18+
"skipFiles": ["<node_internals>/**"],
19+
"autoAttachChildProcesses": true
20+
},
21+
22+
{
23+
"type": "node",
24+
"request": "launch",
25+
"name": "Electron: Main",
26+
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-webpack",
27+
"runtimeArgs": ["dev"],
28+
"windows": {
29+
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-webpack.cmd"
30+
},
31+
"skipFiles": ["<node_internals>/**"]
32+
}
33+
]
34+
}

src/renderer/core/world/world-composer.ts

+3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,13 @@ import { TypeEmitter } from "@utils/type-emitter";
2626
import { World, WorldEvents } from "./world";
2727
import { borrow, expose, mix } from "@utils/object-utils";
2828
import { mixer } from "@core/global";
29+
import processStore from "@stores/process-store";
2930
// import { useSettingsStore } from "@stores/settings-store";
3031

3132
export const createWorldComposer = async (openBW: OpenBW, assets: Assets, map: Chk, players: BasePlayer[], commands: CommandsStream) => {
3233

34+
processStore().clearAll();
35+
3336
const janitor = new Janitor("WorldComposer");
3437
const events = janitor.mop(new TypeEmitter<WorldEvents>(), "events");
3538
const settings = createReactiveSessionVariables(events);

src/renderer/image/generate-map/chk-to-terrain-mesh.ts

-2
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ export async function chkToTerrainMesh(mapWidth: number, mapHeight: number, tile
8484
janitor.mop(effectsTextures, "effectsTextures");
8585
//TODO: generate water mask
8686

87-
genProcess.complete();
88-
8987
renderComposer.preprocessEnd();
9088

9189
const terrain = await createTerrainGeometryFromQuartiles(mapWidth, mapHeight, creepTexture, creepEdgesTexture, geomOptions, dataTextures, heightMaps, textures, effectsTextures);

src/renderer/image/generate-map/create-terrain-geom-from-quartiles.ts

-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ export const createTerrainGeometryFromQuartiles = async (
198198
quartileWidth: qw, quartileHeight: qh, tilesX, tilesY
199199
}
200200

201-
genProcess.complete();
202201
return terrain;
203202
};
204203
export default createTerrainGeometryFromQuartiles;

src/renderer/scenes/home/space-scene.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ let fireTexture: Texture;
132132

133133
export const preloadIntro = async () => {
134134

135-
const { increment, complete } = processStore().addOrCreate("intro", 4);
135+
const { increment } = processStore().addOrCreate("intro", 4);
136136

137137
//TODO submit to types
138138
//@ts-ignore
@@ -151,8 +151,6 @@ export const preloadIntro = async () => {
151151

152152
battleLights.load(fireTexture);
153153

154-
complete();
155-
156154
};
157155

158156
let mouse = new Vector3();

src/renderer/scenes/map-scene-loader.ts

-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,6 @@ export const mapSceneLoader = async (chkFilepath: string): Promise<SceneState> =
9393
}
9494
);
9595

96-
process.complete();
97-
9896
return {
9997
id: "@map",
10098
start: () => {

src/renderer/scenes/replay-scene-loader.ts

-2
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,6 @@ export const replaySceneLoader = async (filepath: string): Promise<SceneState> =
130130

131131
document.title = `Titan Reactor - ${gameTitle}`;
132132

133-
loadProcess.complete();
134-
135133
return {
136134
id: "@replay",
137135
start: () => {
+127-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,137 @@
1-
import { describe, it } from "@jest/globals";
1+
import { describe, it, jest } from "@jest/globals";
22
import processStore from "./process-store";
3+
4+
jest.mock("@ipc/log");
5+
6+
//TODO: fix this hack
7+
Object.defineProperty(window.performance, 'mark', {
8+
configurable: true,
9+
value: jest.fn(),
10+
});
11+
12+
Object.defineProperty(window.performance, 'clearMeasures', {
13+
configurable: true,
14+
value: jest.fn(),
15+
});
16+
17+
Object.defineProperty(window.performance, 'clearMarks', {
18+
configurable: true,
19+
value: jest.fn(),
20+
});
21+
22+
Object.defineProperty(window.performance, 'measure', {
23+
configurable: true,
24+
value: jest.fn(() => ({ duration: 100 })),
25+
});
26+
327
describe("ProcessStore", () => {
428

5-
it("should have empty processes on init", () => {
29+
beforeEach(() => {
30+
31+
processStore().clearAll();
32+
33+
});
34+
35+
it("total should default to 0 with no processes", () => {
636

737
expect(processStore().processes).toHaveLength(0);
838

39+
expect(processStore().getTotalProgress()).toBe(0);
40+
41+
});
42+
43+
it("create should add a process and return a wrapper", () => {
44+
45+
const wrapper = processStore().create("test", 100);
46+
47+
expect(processStore().processes).toHaveLength(1);
48+
49+
expect(processStore().getTotalProgress()).toBe(0);
50+
51+
expect(wrapper).toBeDefined();
52+
53+
});
54+
55+
it("should increment increment a process", () => {
56+
57+
const wrapper = processStore().create("test", 2);
58+
59+
expect(processStore().getTotalProgress()).toBe(0);
60+
61+
wrapper.increment();
62+
63+
expect(processStore().getTotalProgress()).toBe(0.5);
64+
65+
expect(processStore().isInProgress(wrapper.id)).toBe(true);
66+
67+
expect(processStore().isComplete(wrapper.id)).toBe(false);
68+
969
});
1070

71+
it("should be complete if current === max", () => {
72+
73+
const wrapper = processStore().create("test", 1);
74+
75+
expect(processStore().getTotalProgress()).toBe(0);
76+
77+
wrapper.increment();
78+
79+
expect(processStore().getTotalProgress()).toBe(1);
80+
81+
expect(processStore().isComplete(wrapper.id)).toBe(true);
82+
83+
expect(processStore().isInProgress(wrapper.id)).toBe(false);
84+
85+
86+
});
87+
88+
it("should clear completed when asked", () => {
89+
90+
const wrapper = processStore().create("test", 1);
91+
const other = processStore().create("test2", 1);
92+
93+
expect(processStore().getTotalProgress()).toBe(0);
94+
95+
wrapper.increment();
96+
97+
expect(processStore().getTotalProgress()).toBe(0.5);
98+
99+
expect(processStore().isComplete(wrapper.id)).toBe(true);
100+
101+
expect(processStore().isInProgress(wrapper.id)).toBe(false);
102+
103+
expect(processStore().isComplete(other.id)).toBe(false);
104+
105+
expect(processStore().isInProgress(other.id)).toBe(true);
106+
107+
processStore().clearCompleted();
108+
109+
expect(processStore().getTotalProgress()).toBe(0);
110+
111+
expect(processStore().processes).toHaveLength(1);
112+
113+
114+
});
115+
116+
117+
it("should add to an open processwhen asked", () => {
118+
119+
const wrapper = processStore().create("test", 1);
120+
const other = processStore().addOrCreate("test2", 1);
121+
122+
expect(wrapper.id).toBe(other.id);
123+
124+
expect(processStore().getTotalProgress()).toBe(0);
125+
126+
wrapper.increment();
127+
128+
expect(processStore().getTotalProgress()).toBe(0.5);
129+
130+
other.increment();
131+
132+
expect(processStore().getTotalProgress()).toBe(1);
133+
134+
135+
});
11136

12137
});

src/renderer/stores/process-store.ts

+10-33
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ export type IncrementalProcess = {
1111
current: number;
1212
};
1313

14-
type ProcessWrapper = { id: string, increment: () => void, complete: () => void, add(additiona: number): void };
14+
type ProcessWrapper = { id: string, increment: () => void, add(additiona: number): void };
15+
1516
export type ProcessStore = {
1617
processes: IncrementalProcess[];
1718
create: (label: string, max: number) => ProcessWrapper;
1819
increment: (id: string, current?: number) => void;
19-
forceComplete: (id: string) => void;
2020
isComplete: (id: string) => boolean;
2121
isInProgress: (id: string) => boolean;
2222
getTotalProgress: () => number;
@@ -32,15 +32,12 @@ export const useProcessStore = create<ProcessStore>((set, get) => ({
3232
_createProcessWrapper: (id: string, process: IncrementalProcess) => ({
3333
id,
3434
increment: () => get().increment(id),
35-
complete: () => get().forceComplete(id),
3635
add: (additional: number) => {
3736
process.max += additional;
3837
}
3938
}),
4039
create: (label: string, max = PROCESS_MAX) => {
4140
const id = MathUtils.generateUUID();
42-
performance.clearMarks(`process-${id}`);
43-
performance.clearMeasures(`process-${id}`);
4441
log.verbose("@process/init: " + label);
4542

4643
performance.mark(`process-${id}`);
@@ -61,6 +58,7 @@ export const useProcessStore = create<ProcessStore>((set, get) => ({
6158
addOrCreate: (label: string, max: number) => {
6259
const existing = get().processes[0];
6360
if (existing) {
61+
performance.mark(`process-${existing.id}`);
6462
existing.max += max;
6563
return get()._createProcessWrapper(existing.id, existing);
6664
} else {
@@ -79,34 +77,13 @@ export const useProcessStore = create<ProcessStore>((set, get) => ({
7977
(p) => (p.id === id ? { ...p, current: next } : p)
8078
),
8179
}));
82-
}
83-
},
84-
forceComplete: (id: string, clear = true) => {
85-
if (get().isComplete(id)) {
86-
return;
87-
}
88-
if (!get().isInProgress(id)) {
89-
log.error(`@process/complete: process ${id} is not in progress`);
90-
return;
91-
}
92-
93-
const perf = performance.measure(`process-${id}`);
94-
performance.clearMarks(`process-${id}`);
95-
performance.clearMeasures(`process-${id}`);
9680

97-
const { label } = get().processes.find((p) => p.id === id)!;
98-
99-
log.info(`@process/complete: ${label} ${perf.duration}ms`);
100-
101-
const process = get().processes.find((p) => p.id === id);
102-
if (!process) return;
103-
104-
process.current = process.max;
105-
106-
if (clear) {
107-
set(({ processes }) => ({
108-
processes: processes.filter((p) => p.id !== id)
109-
}));
81+
if (next === process.max) {
82+
const perf = performance.measure(`process-${id}`);
83+
performance.clearMarks(`process-${id}`);
84+
performance.clearMeasures(`process-${id}`);
85+
log.info(`@process/complete: ${process.label} ${perf.duration}ms`);
86+
}
11087
}
11188
},
11289
clearAll: () => {
@@ -120,7 +97,7 @@ export const useProcessStore = create<ProcessStore>((set, get) => ({
12097
}));
12198
},
12299
isInProgress: (id: string) =>
123-
get().processes.some((p) => p.id === id),
100+
get().processes.some((p) => p.id === id && p.current < p.max),
124101
isComplete: (id: string) =>
125102
get().processes.some((p) => p.id === id && p.current >= p.max),
126103
getTotalProgress: () => {

0 commit comments

Comments
 (0)