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:
@@ -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
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user