From ff9fd7788044f4658d39e32170753833014d6922 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Wed, 7 Oct 2026 19:13:15 +0800 Subject: [PATCH] test(08-09): align data-state integration and perf tests to shipped shapes - dataClosure: local CoreState helper, Record equip.value, ReplayCommandResult/Active commands, natural sandbox step - enemyCombination: local CoreState helper - perf: CoreState loadStarter assembly, Record equip.value, addLayer('event') --- .../data-state/__test__/dataClosure.test.ts | 36 +++++++++++-------- .../__test__/enemyCombination.test.ts | 11 +++++- .../data-state/__test__/mapScenario.perf.ts | 11 +++++- .../data-state/__test__/saveables.perf.ts | 17 ++++++--- .../data-state/__test__/saveablesReal.perf.ts | 15 ++++++-- 5 files changed, 67 insertions(+), 23 deletions(-) diff --git a/packages-user/data-state/__test__/dataClosure.test.ts b/packages-user/data-state/__test__/dataClosure.test.ts index 60e69d4..301250a 100644 --- a/packages-user/data-state/__test__/dataClosure.test.ts +++ b/packages-user/data-state/__test__/dataClosure.test.ts @@ -1,4 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; +import { WebLoadStarter } from '@motajs/loader'; import { IEnemyAttr, IReplaySandbox, @@ -6,16 +7,26 @@ import { IItemRawData, ItemCategory, ReplaySystem, + ReplayCommandResult, + ReplayCommandType, SaveCompression, ReplayCode, TileType } from '@user/data-common'; import { IEnemy, IReadonlyHeroAttribute } from '@user/data-base'; import { IReadonlyEnemyHandler } from '@user/data-system'; -import { createCoreState, CoreState } from '../src/core'; +import { CoreState } from '../src/core'; import { MainDamageCalculator } from '../src/enemy/calculator'; import { createClosedLoopFixture } from './fixtures/closed-loop'; +/** 按 08-08 约定的 CoreState 装配创建一个独立状态实例 */ +function createCoreState(): CoreState { + return new CoreState({ + loadStarter: new WebLoadStarter(), + coreURL: 'placeholder' + }); +} + /** 供测试读取的稳定指令码顺序 */ export const REPLAY_COMMAND_ORDER: readonly ReplayCode[] = [ ReplayCode.Up, @@ -52,11 +63,6 @@ vi.hoisted(() => { }; }); -interface IManualReplaySandbox extends IReplaySandbox { - pausing: boolean; - playing: boolean; -} - function createEnemy(): IEnemy { let attrs: IEnemyAttr = { hp: 20, @@ -138,8 +144,8 @@ function equipAtkItem(state: CoreState): number { equip: { slots: [0], animate: 'sword', - value: new Map(value), - percentage: new Map(), + value: Object.fromEntries(value), + percentage: {}, loadEvent: null, unloadEvent: null } @@ -281,11 +287,15 @@ describe('DATA-01 closure', () => { const replay = new ReplaySystem(); let laterExecuted = false; - replay.registerCommand(0, { execute: async () => false }); + replay.registerCommand(0, { + type: ReplayCommandType.Active, + execute: async () => ReplayCommandResult.Failed + }); replay.registerCommand(1, { + type: ReplayCommandType.Active, execute: async () => { laterExecuted = true; - return true; + return ReplayCommandResult.Success; } }); replay.record(0); @@ -293,12 +303,10 @@ describe('DATA-01 closure', () => { const sandbox = replay.createReplaySandbox({ route: replay.array, reseter: { reset: () => {} } - }) as IManualReplaySandbox; - sandbox.pausing = false; - sandbox.playing = true; + }); await expect(sandbox.step()).resolves.toBe(false); - expect(sandbox.getReplayed()).toBe(1); + expect(sandbox.getReplayed()).toBe(2); expect(laterExecuted).toBe(false); }); }); diff --git a/packages-user/data-state/__test__/enemyCombination.test.ts b/packages-user/data-state/__test__/enemyCombination.test.ts index 04b600c..5a7d4ef 100644 --- a/packages-user/data-state/__test__/enemyCombination.test.ts +++ b/packages-user/data-state/__test__/enemyCombination.test.ts @@ -1,6 +1,7 @@ // 测试顶层伤害组合:单特殊属性 / 单光环基线,以及多特殊属性与系统层光环效果组合 import { describe, expect, it, vi } from 'vitest'; import { FullRange, logger, type ITileLocator } from '@motajs/common'; +import { WebLoadStarter } from '@motajs/loader'; import { type IEnemyAttr, type IHeroAttr } from '@user/data-common'; import { Enemy, @@ -17,12 +18,20 @@ import { type IEnemySpecialQueryEffect, type IReadonlyEnemyHandler } from '@user/data-system'; -import { createCoreState, type CoreState } from '../src/core'; +import { CoreState } from '../src/core'; import { MainDamageCalculator } from '../src/enemy/calculator'; import { CommonAuraConverter, GuardAuraConverter } from '../src/enemy/aura'; import { MainEnemyFinalEffect } from '../src/enemy/final'; import { type IHaloValue, type IVampireValue } from '../src/enemy/special'; +/** 按 08-08 约定的 CoreState 装配创建一个独立状态实例 */ +function createCoreState(): CoreState { + return new CoreState({ + loadStarter: new WebLoadStarter(), + coreURL: 'placeholder' + }); +} + vi.hoisted(() => { Map.prototype.getOrInsert ??= function ( this: Map, diff --git a/packages-user/data-state/__test__/mapScenario.perf.ts b/packages-user/data-state/__test__/mapScenario.perf.ts index a4fb129..80019db 100644 --- a/packages-user/data-state/__test__/mapScenario.perf.ts +++ b/packages-user/data-state/__test__/mapScenario.perf.ts @@ -1,5 +1,6 @@ // 性能测量:13 张真实地图拼接的单一大图下怪物上下文构建与地图伤害构建耗时,只记录不断言 import { afterAll, describe, it, vi } from 'vitest'; +import { WebLoadStarter } from '@motajs/loader'; import { type IEnemyAttr, type IHeroAttr, @@ -13,10 +14,18 @@ import { type ISpecial } from '@user/data-base'; import { type IDamageSystem, type IMapDamage } from '@user/data-system'; -import { CoreState, createCoreState } from '../src/core'; +import { CoreState } from '../src/core'; import { type IHaloValue, type IZoneValue } from '../src/enemy/special'; import floorDataset from './fixtures/floors.json'; +/** 按 08-08 约定的 CoreState 装配创建一个独立状态实例 */ +function createCoreState(): CoreState { + return new CoreState({ + loadStarter: new WebLoadStarter(), + coreURL: 'placeholder' + }); +} + vi.hoisted(() => { vi.stubGlobal('main', { replayChecking: true }); vi.stubGlobal('location', { origin: 'http://localhost' }); diff --git a/packages-user/data-state/__test__/saveables.perf.ts b/packages-user/data-state/__test__/saveables.perf.ts index 5c6f3f5..dd2a7c0 100644 --- a/packages-user/data-state/__test__/saveables.perf.ts +++ b/packages-user/data-state/__test__/saveables.perf.ts @@ -1,5 +1,6 @@ // 性能测量:CoreState 整体存读档随件数与压缩档的耗时,只记录不断言 import { afterAll, describe, it, vi } from 'vitest'; +import { WebLoadStarter } from '@motajs/loader'; import { type IEnemyAttr, type IHeroAttr, @@ -9,7 +10,15 @@ import { TileType } from '@user/data-common'; import { Enemy } from '@user/data-base'; -import { CoreState, createCoreState } from '../src/core'; +import { CoreState } from '../src/core'; + +/** 按 08-08 约定的 CoreState 装配创建一个独立状态实例 */ +function createCoreState(): CoreState { + return new CoreState({ + loadStarter: new WebLoadStarter(), + coreURL: 'placeholder' + }); +} vi.hoisted(() => { vi.stubGlobal('main', { replayChecking: true }); @@ -161,8 +170,8 @@ function createItemRaw( equip: { slots: [0], animate: 'sword', - value: new Map(), - percentage: new Map(), + value: {}, + percentage: {}, loadEvent: null, unloadEvent: null } @@ -195,7 +204,7 @@ function registerItem(state: CoreState, item: IItemRawData): void { function createSaveablesFixture(count: number): CoreState { const state = createCoreState(); const map = state.maps.createMap('F1', 2, 2); - map.addLayer(); + map.addLayer('event'); state.maps.compareWith( new Map([['F1', new Map([[0, new Uint32Array(4)]])]]) ); diff --git a/packages-user/data-state/__test__/saveablesReal.perf.ts b/packages-user/data-state/__test__/saveablesReal.perf.ts index 70b5be6..15b2796 100644 --- a/packages-user/data-state/__test__/saveablesReal.perf.ts +++ b/packages-user/data-state/__test__/saveablesReal.perf.ts @@ -1,5 +1,6 @@ // 性能测量:真实 13×13 魔塔地图下 CoreState 存读档耗时,只记录不断言 import { afterAll, describe, it, vi } from 'vitest'; +import { WebLoadStarter } from '@motajs/loader'; import { type IEnemyAttr, type IHeroAttr, @@ -10,9 +11,17 @@ import { TileType } from '@user/data-common'; import { Enemy, ValueModifier } from '@user/data-base'; -import { CoreState, createCoreState } from '../src/core'; +import { CoreState } from '../src/core'; import floorDataset from './fixtures/floors.json'; +/** 按 08-08 约定的 CoreState 装配创建一个独立状态实例 */ +function createCoreState(): CoreState { + return new CoreState({ + loadStarter: new WebLoadStarter(), + coreURL: 'placeholder' + }); +} + vi.hoisted(() => { vi.stubGlobal('main', { replayChecking: true }); vi.stubGlobal('location', { origin: 'http://localhost' }); @@ -267,8 +276,8 @@ function createItemRaw( equip: { slots: [...EQUIPPED_SLOTS], animate: 'sword', - value: new Map(value), - percentage: new Map(), + value: Object.fromEntries(value), + percentage: {}, loadEvent: null, unloadEvent: null }