集成tsrpc代替protobuf
This commit is contained in:
113
packages/network/tests/Serialization/TsrpcSerializer.test.ts
Normal file
113
packages/network/tests/Serialization/TsrpcSerializer.test.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { Component } from '@esengine/ecs-framework';
|
||||
import { TsrpcSerializer, SyncField } from '../../src/Serialization';
|
||||
import { TsrpcSerializable } from '../../src/Serialization/TsrpcDecorators';
|
||||
|
||||
@TsrpcSerializable()
|
||||
class TestComponent extends Component {
|
||||
@SyncField()
|
||||
public health: number = 100;
|
||||
|
||||
@SyncField()
|
||||
public name: string = 'Test';
|
||||
|
||||
@SyncField()
|
||||
public isActive: boolean = true;
|
||||
}
|
||||
|
||||
describe('TsrpcSerializer', () => {
|
||||
let serializer: TsrpcSerializer;
|
||||
let testComponent: TestComponent;
|
||||
|
||||
beforeEach(() => {
|
||||
serializer = TsrpcSerializer.getInstance();
|
||||
testComponent = new TestComponent();
|
||||
testComponent.health = 80;
|
||||
testComponent.name = 'Player';
|
||||
testComponent.isActive = false;
|
||||
});
|
||||
|
||||
describe('序列化', () => {
|
||||
it('应该能序列化TSRPC组件', () => {
|
||||
const result = serializer.serialize(testComponent);
|
||||
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.type).toBe('tsrpc');
|
||||
expect(result?.componentType).toBe('TestComponent');
|
||||
expect(result?.data).toBeInstanceOf(Uint8Array);
|
||||
expect(result?.size).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('不支持的组件应该返回null', () => {
|
||||
// 创建一个没有装饰器的组件类
|
||||
class UnsupportedComponent extends Component {}
|
||||
const unsupportedComponent = new UnsupportedComponent();
|
||||
const result = serializer.serialize(unsupportedComponent);
|
||||
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('反序列化', () => {
|
||||
it('应该能反序列化TSRPC数据', () => {
|
||||
// 先序列化
|
||||
const serializedData = serializer.serialize(testComponent);
|
||||
expect(serializedData).not.toBeNull();
|
||||
|
||||
// 再反序列化
|
||||
const deserializedComponent = serializer.deserialize(serializedData!, TestComponent);
|
||||
|
||||
expect(deserializedComponent).not.toBeNull();
|
||||
expect(deserializedComponent?.health).toBe(80);
|
||||
expect(deserializedComponent?.name).toBe('Player');
|
||||
expect(deserializedComponent?.isActive).toBe(false);
|
||||
});
|
||||
|
||||
it('错误的数据类型应该返回null', () => {
|
||||
const invalidData = {
|
||||
type: 'json' as const,
|
||||
componentType: 'TestComponent',
|
||||
data: {},
|
||||
size: 0
|
||||
};
|
||||
|
||||
const result = serializer.deserialize(invalidData);
|
||||
expect(result).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe('统计信息', () => {
|
||||
it('应该正确更新统计信息', () => {
|
||||
const initialStats = serializer.getStats();
|
||||
|
||||
// 执行序列化
|
||||
serializer.serialize(testComponent);
|
||||
|
||||
const afterSerializeStats = serializer.getStats();
|
||||
expect(afterSerializeStats.serializeCount).toBe(initialStats.serializeCount + 1);
|
||||
|
||||
// 执行反序列化
|
||||
const serializedData = serializer.serialize(testComponent);
|
||||
if (serializedData) {
|
||||
serializer.deserialize(serializedData, TestComponent);
|
||||
}
|
||||
|
||||
const finalStats = serializer.getStats();
|
||||
expect(finalStats.deserializeCount).toBe(initialStats.deserializeCount + 1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('性能功能', () => {
|
||||
it('应该正确计算序列化大小', () => {
|
||||
const initialStats = serializer.getStats();
|
||||
|
||||
// 执行序列化
|
||||
const result = serializer.serialize(testComponent);
|
||||
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.size).toBeGreaterThan(0);
|
||||
|
||||
const finalStats = serializer.getStats();
|
||||
expect(finalStats.averageSerializedSize).toBeGreaterThan(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user