Files
esengine/packages/core/tests/reactive-query-timing.test.ts

90 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, it, expect } from '@jest/globals';
import { Scene, Entity, Component, EntitySystem, Matcher, ECSComponent } from '../src';
@ECSComponent('TestTransform')
class TestTransform extends Component {
constructor(public x: number = 0, public y: number = 0) {
super();
}
}
@ECSComponent('TestRenderable')
class TestRenderable extends Component {
constructor(public sprite: string = 'default') {
super();
}
}
class TestRenderSystem extends EntitySystem {
public entitiesFound: Entity[] = [];
constructor() {
super(Matcher.all(TestTransform, TestRenderable));
}
protected override process(entities: readonly Entity[]): void {
this.entitiesFound = Array.from(entities);
console.log(`TestRenderSystem.process: 找到 ${entities.length} 个实体`);
}
protected override onAdded(entity: Entity): void {
console.log(`TestRenderSystem.onAdded: 实体 ${entity.name}(${entity.id}) 被添加`);
}
}
class TestGameScene extends Scene {
private renderSystem: TestRenderSystem | null = null;
public override initialize(): void {
super.initialize();
console.log('\n=== Scene.initialize() 开始 ===');
// 1. 先添加System这是GameScene的做法
console.log('步骤1: 添加RenderSystem');
this.renderSystem = new TestRenderSystem();
this.addEntityProcessor(this.renderSystem);
// 2. 然后创建实体这是GameScene的做法
console.log('\n步骤2: 创建实体');
const entity = this.createEntity('Player');
console.log(`实体已创建: ${entity.name}(${entity.id})`);
console.log('\n步骤3: 添加组件');
entity.addComponent(new TestTransform(100, 200));
entity.addComponent(new TestRenderable('player-sprite'));
console.log(`实体组件数量: ${entity.components.length}`);
console.log('=== Scene.initialize() 结束 ===\n');
}
public getRenderSystem(): TestRenderSystem | null {
return this.renderSystem;
}
}
describe('响应式查询时序测试模拟GameScene', () => {
it('应该在Scene.initialize()中先添加System再创建实体时正常工作', () => {
console.log('\n\n========== 测试开始 ==========');
const scene = new TestGameScene();
console.log('\n调用scene.initialize()');
scene.initialize();
console.log('\n调用Scene.begin()');
scene.begin();
console.log('\n第一次Scene.update()');
scene.update();
const renderSystem = scene.getRenderSystem();
expect(renderSystem).not.toBeNull();
console.log(`\nRenderSystem找到的实体数量: ${renderSystem!.entitiesFound.length}`);
expect(renderSystem!.entitiesFound.length).toBe(1);
console.log('========== 测试结束 ==========\n\n');
});
});