Files
renjue f1502ed08c
CI / docker (push) Successful in 11m42s
初始化 ToolBox 开发者工具箱。
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-25 11:15:38 +08:00

78 lines
2.2 KiB
JavaScript

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)
})
})
})