2025-07-30 11:11:46 +08:00
|
|
|
import {
|
|
|
|
|
BigIntFactory,
|
2025-09-03 00:12:59 +08:00
|
|
|
IBigIntLike
|
2025-07-30 11:11:46 +08:00
|
|
|
} from '../../../src/ECS/Utils/BigIntCompatibility';
|
|
|
|
|
|
|
|
|
|
describe('BigInt兼容性测试', () => {
|
2025-09-03 00:12:59 +08:00
|
|
|
describe('基本功能', () => {
|
|
|
|
|
it('应该能够创建和获取数值', () => {
|
2025-07-30 11:11:46 +08:00
|
|
|
const zero = BigIntFactory.zero();
|
|
|
|
|
const one = BigIntFactory.one();
|
|
|
|
|
const value = BigIntFactory.create(42);
|
2025-09-03 00:12:59 +08:00
|
|
|
|
|
|
|
|
expect(zero.isZero()).toBe(true);
|
|
|
|
|
expect(one.valueOf()).toBe(1);
|
2025-07-30 11:11:46 +08:00
|
|
|
expect(value.valueOf()).toBe(42);
|
|
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
it('应该支持字符串创建', () => {
|
2025-07-30 11:11:46 +08:00
|
|
|
const value = BigIntFactory.create('123');
|
2025-09-03 00:12:59 +08:00
|
|
|
expect(value.valueOf()).toBe(123);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
describe('位运算', () => {
|
2025-07-30 11:11:46 +08:00
|
|
|
let value1: IBigIntLike;
|
|
|
|
|
let value2: IBigIntLike;
|
|
|
|
|
|
|
|
|
|
beforeEach(() => {
|
2025-09-03 00:12:59 +08:00
|
|
|
value1 = BigIntFactory.create(5); // 101
|
|
|
|
|
value2 = BigIntFactory.create(3); // 011
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
it('AND运算', () => {
|
|
|
|
|
const result = value1.and(value2); // 101 & 011 = 001
|
|
|
|
|
expect(result.valueOf()).toBe(1);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
it('OR运算', () => {
|
|
|
|
|
const result = value1.or(value2); // 101 | 011 = 111
|
|
|
|
|
expect(result.valueOf()).toBe(7);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
it('XOR运算', () => {
|
|
|
|
|
const result = value1.xor(value2); // 101 ^ 011 = 110
|
|
|
|
|
expect(result.valueOf()).toBe(6);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
it('NOT运算', () => {
|
2025-07-30 11:11:46 +08:00
|
|
|
const value = BigIntFactory.create(5); // 00000101
|
2025-09-03 00:12:59 +08:00
|
|
|
const result = value.not(8); // 11111010
|
|
|
|
|
expect(result.valueOf()).toBe(250);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
it('移位运算', () => {
|
|
|
|
|
const value = BigIntFactory.create(5);
|
|
|
|
|
const left = value.shiftLeft(1);
|
|
|
|
|
const right = value.shiftRight(1);
|
2025-07-30 11:11:46 +08:00
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
expect(left.valueOf()).toBe(10);
|
|
|
|
|
expect(right.valueOf()).toBe(2);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
describe('字符串解析', () => {
|
|
|
|
|
it('二进制字符串', () => {
|
2025-07-30 11:11:46 +08:00
|
|
|
const value = BigIntFactory.fromBinaryString('10101');
|
2025-09-03 00:12:59 +08:00
|
|
|
expect(value.valueOf()).toBe(21);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
it('十六进制字符串', () => {
|
|
|
|
|
const value = BigIntFactory.fromHexString('0xFF');
|
|
|
|
|
expect(value.valueOf()).toBe(255);
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
describe('ECS位掩码操作', () => {
|
|
|
|
|
it('组件掩码操作', () => {
|
2025-07-30 11:11:46 +08:00
|
|
|
const componentMasks: IBigIntLike[] = [];
|
2025-09-03 00:12:59 +08:00
|
|
|
for (let i = 0; i < 10; i++) {
|
2025-07-30 11:11:46 +08:00
|
|
|
componentMasks.push(BigIntFactory.one().shiftLeft(i));
|
|
|
|
|
}
|
2025-09-03 00:12:59 +08:00
|
|
|
|
2025-07-30 11:11:46 +08:00
|
|
|
let combinedMask = BigIntFactory.zero();
|
2025-09-03 00:12:59 +08:00
|
|
|
for (const mask of componentMasks) {
|
|
|
|
|
combinedMask = combinedMask.or(mask);
|
2025-07-30 11:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-03 00:12:59 +08:00
|
|
|
expect(combinedMask.valueOf()).toBe(1023); // 2^10 - 1
|
2025-07-30 11:11:46 +08:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|