78 lines
2.2 KiB
JavaScript
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)
|
|
})
|
|
})
|
|
})
|