import { describe, it, expect } from 'vitest' import { encodeBase64, decodeBase64, encodeUrl, decodeUrl, encodeUnicode, decodeUnicode, bytesToBase64, base64ToBytes, } from '../../src/utils/encoder.js' import { zlibSync, decompressSync } from 'fflate' describe('encoder', () => { describe('base64', () => { it('encodes and decodes ASCII text', () => { expect(decodeBase64(encodeBase64('hello'))).toBe('hello') }) it('encodes and decodes unicode text', () => { const text = '你好世界' expect(decodeBase64(encodeBase64(text))).toBe(text) }) }) describe('url', () => { it('encodes and decodes URL components', () => { expect(decodeUrl(encodeUrl('a b&c=1'))).toBe('a b&c=1') }) }) describe('unicode escape', () => { it('encodes BMP characters', () => { expect(encodeUnicode('A')).toBe('\\u0041') }) it('roundtrips BMP text', () => { expect(decodeUnicode('\\u0048\\u0065\\u006C\\u006C\\u006F')).toBe('Hello') }) it('encodes and decodes emoji (surrogate pair)', () => { const emoji = '😀' const encoded = encodeUnicode(emoji) expect(decodeUnicode(encoded)).toBe(emoji) }) it('decodes \\UXXXXXXXX format', () => { expect(decodeUnicode('\\U0001F600')).toBe('😀') }) it('throws on invalid unicode code point', () => { expect(() => decodeUnicode('\\U00110000')).toThrow('Unicode 解码失败') }) }) describe('binary helpers', () => { it('roundtrips bytes through base64', () => { const bytes = new Uint8Array([1, 2, 3, 255]) expect([...base64ToBytes(bytesToBase64(bytes))]).toEqual([...bytes]) }) it('strips whitespace when decoding base64', () => { const bytes = new Uint8Array([72, 101, 108, 108, 111]) expect(new TextDecoder().decode(base64ToBytes('SGVs\nbG8='))).toBe('Hello') }) }) describe('zlib roundtrip', () => { it('compresses and decompresses text', () => { const text = 'hello zlib compression test' const compressed = zlibSync(new TextEncoder().encode(text)) const b64 = bytesToBase64(compressed) const decompressed = new TextDecoder().decode(decompressSync(base64ToBytes(b64))) expect(decompressed).toBe(text) }) }) })