1
This commit is contained in:
57
src/hooks/rpg-runtime-story/storyContextBuilder.test.ts
Normal file
57
src/hooks/rpg-runtime-story/storyContextBuilder.test.ts
Normal file
@@ -0,0 +1,57 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { AnimationState, type GameState, type StoryMoment } from '../../types';
|
||||
import { buildStoryContextFromState } from './storyContextBuilder';
|
||||
|
||||
function createState(overrides: Partial<GameState> = {}): GameState {
|
||||
return {
|
||||
worldType: 'WUXIA',
|
||||
runtimeSessionId: 'runtime-main',
|
||||
runtimeActionVersion: 3,
|
||||
runtimeMode: 'play',
|
||||
runtimePersistenceDisabled: false,
|
||||
playerHp: 30,
|
||||
playerMaxHp: 40,
|
||||
playerMana: 12,
|
||||
playerMaxMana: 20,
|
||||
inBattle: false,
|
||||
playerX: 0,
|
||||
playerFacing: 'right',
|
||||
animationState: AnimationState.IDLE,
|
||||
playerSkillCooldowns: {},
|
||||
currentScenePreset: {
|
||||
id: 'forest-trail',
|
||||
name: '林间小径',
|
||||
description: '风声穿过树梢。',
|
||||
},
|
||||
...overrides,
|
||||
} as GameState;
|
||||
}
|
||||
|
||||
describe('storyContextBuilder', () => {
|
||||
it('keeps normal play context lightweight', () => {
|
||||
const context = buildStoryContextFromState(createState());
|
||||
|
||||
expect(context.runtimeSessionId).toBe('runtime-main');
|
||||
expect(context.runtimeSnapshot).toBeUndefined();
|
||||
});
|
||||
|
||||
it('attaches transient snapshot for disabled persistence runtime', () => {
|
||||
const state = createState({
|
||||
runtimeSessionId: 'runtime-preview',
|
||||
runtimePersistenceDisabled: true,
|
||||
});
|
||||
const currentStory: StoryMoment = {
|
||||
text: '断桥客站在风口,等你先开口。',
|
||||
options: [],
|
||||
};
|
||||
|
||||
const context = buildStoryContextFromState(state, { currentStory });
|
||||
|
||||
expect(context.runtimeSnapshot).toEqual({
|
||||
bottomTab: 'adventure',
|
||||
gameState: state,
|
||||
currentStory,
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user