Feature/render pipeline (#232)

* refactor(engine): 重构2D渲染管线坐标系统

* feat(engine): 完善2D渲染管线和编辑器视口功能

* feat(editor): 实现Viewport变换工具系统

* feat(editor): 优化Inspector渲染性能并修复Gizmo变换工具显示

* feat(editor): 实现Run on Device移动预览功能

* feat(editor): 添加组件属性控制和依赖关系系统

* feat(editor): 实现动画预览功能和优化SpriteAnimator编辑器

* feat(editor): 修复SpriteAnimator动画预览功能并迁移CI到pnpm

* feat(editor): 修复SpriteAnimator动画预览并迁移到pnpm

* feat(editor): 修复SpriteAnimator动画预览并迁移到pnpm

* feat(editor): 修复SpriteAnimator动画预览并迁移到pnpm

* feat(editor): 修复SpriteAnimator动画预览并迁移到pnpm

* feat(ci): 迁移项目到pnpm并修复CI构建问题

* chore: 迁移CI工作流到pnpm并添加WASM构建支持

* chore: 迁移CI工作流到pnpm并添加WASM构建支持

* chore: 迁移CI工作流到pnpm并添加WASM构建支持

* chore: 迁移CI工作流到pnpm并添加WASM构建支持

* chore: 迁移CI工作流到pnpm并添加WASM构建支持

* chore: 迁移CI工作流到pnpm并添加WASM构建支持

* chore: 移除 network 相关包

* chore: 移除 network 相关包
This commit is contained in:
YHH
2025-11-23 14:49:37 +08:00
committed by GitHub
parent b15cbab313
commit a3f7cc38b1
247 changed files with 33561 additions and 52047 deletions

View File

@@ -1,12 +1,16 @@
import { Component } from '../../../src/ECS/Component';
import { EntitySystem } from '../../../src/ECS/Systems/EntitySystem';
import {
ECSComponent,
ECSSystem,
getComponentTypeName,
import {
ECSComponent,
ECSSystem,
getComponentTypeName,
getSystemTypeName,
getComponentInstanceTypeName,
getSystemInstanceTypeName
getSystemInstanceTypeName,
getComponentDependencies,
Property,
getPropertyMetadata,
hasPropertyMetadata
} from '../../../src/ECS/Decorators';
describe('TypeDecorators', () => {
@@ -121,4 +125,106 @@ describe('TypeDecorators', () => {
}).toThrow('ECSSystem装饰器必须提供有效的类型名称');
});
});
describe('组件依赖', () => {
test('应该存储和获取组件依赖关系', () => {
@ECSComponent('BaseComponent')
class BaseComponent extends Component {}
@ECSComponent('DependentComponent', { requires: ['BaseComponent'] })
class DependentComponent extends Component {}
const dependencies = getComponentDependencies(DependentComponent);
expect(dependencies).toEqual(['BaseComponent']);
});
test('没有依赖的组件应该返回undefined', () => {
@ECSComponent('IndependentComponent')
class IndependentComponent extends Component {}
const dependencies = getComponentDependencies(IndependentComponent);
expect(dependencies).toBeUndefined();
});
test('应该支持多个依赖', () => {
@ECSComponent('MultiDependentComponent', { requires: ['ComponentA', 'ComponentB', 'ComponentC'] })
class MultiDependentComponent extends Component {}
const dependencies = getComponentDependencies(MultiDependentComponent);
expect(dependencies).toEqual(['ComponentA', 'ComponentB', 'ComponentC']);
});
});
describe('@Property 装饰器', () => {
test('应该为属性设置元数据', () => {
@ECSComponent('PropertyTestComponent')
class PropertyTestComponent extends Component {
@Property({ type: 'number', label: 'Speed' })
public speed: number = 10;
}
const metadata = getPropertyMetadata(PropertyTestComponent);
expect(metadata).toBeDefined();
expect(metadata!['speed']).toEqual({ type: 'number', label: 'Speed' });
});
test('应该支持多个属性装饰器', () => {
@ECSComponent('MultiPropertyComponent')
class MultiPropertyComponent extends Component {
@Property({ type: 'number', label: 'X Position' })
public x: number = 0;
@Property({ type: 'number', label: 'Y Position' })
public y: number = 0;
@Property({ type: 'string', label: 'Name' })
public name: string = '';
}
const metadata = getPropertyMetadata(MultiPropertyComponent);
expect(metadata).toBeDefined();
expect(metadata!['x']).toEqual({ type: 'number', label: 'X Position' });
expect(metadata!['y']).toEqual({ type: 'number', label: 'Y Position' });
expect(metadata!['name']).toEqual({ type: 'string', label: 'Name' });
});
test('hasPropertyMetadata 应该正确检测属性元数据', () => {
@ECSComponent('HasMetadataComponent')
class HasMetadataComponent extends Component {
@Property({ type: 'boolean' })
public active: boolean = true;
}
@ECSComponent('NoMetadataComponent')
class NoMetadataComponent extends Component {
public value: number = 0;
}
expect(hasPropertyMetadata(HasMetadataComponent)).toBe(true);
expect(hasPropertyMetadata(NoMetadataComponent)).toBe(false);
});
test('应该支持完整的属性选项', () => {
@ECSComponent('FullOptionsComponent')
class FullOptionsComponent extends Component {
@Property({
type: 'number',
label: 'Health',
min: 0,
max: 100,
step: 1
})
public health: number = 100;
}
const metadata = getPropertyMetadata(FullOptionsComponent);
expect(metadata!['health']).toEqual({
type: 'number',
label: 'Health',
min: 0,
max: 100,
step: 1
});
});
});
});