/** * AriaEngine CRC32 单元测试 */ import { crc32, crc32Continue } from '../../src/engine/aria/crc32'; const enc = new TextEncoder(); function bytes(s: string): Uint8Array { return enc.encode(s); } describe('CRC32', () => { test('标准测试向量:空串 = 0', () => { expect(crc32(new Uint8Array(0))).toBe(0x00000000); }); test('标准测试向量:123456789 = 0xCBF43926(IEEE 802.3 参考值)', () => { expect(crc32(bytes('123456789'))).toBe(0xcbf43926); }); test('标准测试向量:The quick brown fox... = 0x414FA339', () => { expect(crc32(bytes('The quick brown fox jumps over the lazy dog'))).toBe(0x414fa339); }); test('确定性:相同输入多次计算一致', () => { const data = bytes('metona-sqlark aria engine'); const a = crc32(data); const b = crc32(data); expect(a).toBe(b); }); test('区分性:不同输入不同校验和', () => { expect(crc32(bytes('hello'))).not.toBe(crc32(bytes('hellp'))); expect(crc32(bytes('abc'))).not.toBe(crc32(bytes('abd'))); }); test('单字节翻转可被检测', () => { const original = bytes('metona-sqlark aria engine'); const flipped = new Uint8Array(original); flipped[10] ^= 0xff; expect(crc32(original)).not.toBe(crc32(flipped)); }); test('分段计算与一次性计算一致(crc32Continue)', () => { const data = bytes('The quick brown fox jumps over the lazy dog'); const whole = crc32(data); // 按 1 字节分段 let seg = 0; for (let i = 0; i < data.length; i++) { seg = crc32Continue(seg, data.subarray(i, i + 1)); } expect(seg).toBe(whole); // 按 5 字节分段 let seg2 = 0; for (let i = 0; i < data.length; i += 5) { seg2 = crc32Continue(seg2, data.subarray(i, i + 5)); } expect(seg2).toBe(whole); }); test('seed 参数与 crc32Continue 等价', () => { const data = bytes('metona-sqlark aria engine'); const head = data.subarray(0, 7); const tail = data.subarray(7); const whole = crc32(data); const split = crc32(tail, crc32(head)); expect(split).toBe(whole); }); test('中文 UTF-8 字节正确参与计算', () => { const data = bytes('玥玥的测试数据:大段中文内容'); expect(crc32(data)).toBe(crc32(new Uint8Array(data))); }); test('大缓冲区(1MB 随机字节)稳定计算', () => { const data = new Uint8Array(1024 * 1024); let x = 12345; for (let i = 0; i < data.length; i++) { x = (x * 1103515245 + 12345) & 0x7fffffff; data[i] = x & 0xff; } const a = crc32(data); const b = crc32(data); expect(a).toBe(b); expect(a).not.toBe(0); }); });