@zhanghongping/json-sage-workflow-cli
Version:
An intelligent JSON processing workflow system with improved error handling and configuration
133 lines (132 loc) • 4.48 kB
JavaScript
const {
JsonCompressor
} = require('../core/compression');
describe('JsonCompressor', () => {
let compressor;
beforeEach(() => {
compressor = new JsonCompressor({
threshold: 100,
// 设置较小的阈值以便测试
level: 6,
memoryLimit: 100
});
});
describe('Compression Tests', () => {
it('should not compress small data below threshold', () => {
const smallData = {
test: 'small'
};
const result = compressor.compress(smallData);
expect(typeof result).toBe('string');
expect(JSON.parse(result)).toEqual(smallData);
});
it('should compress large data above threshold', () => {
const largeData = {
text: 'test'.repeat(100),
array: Array(100).fill('test')
};
const result = compressor.compress(largeData);
expect(result instanceof Uint8Array).toBe(true);
});
it('should handle special characters correctly', () => {
const specialData = {
unicode: '你好,世界!',
symbols: '!@#$%^&*()',
emoji: '😀🌍🌞'
};
const result = compressor.compress(specialData);
const decompressed = compressor.decompress(result);
expect(decompressed).toEqual(specialData);
});
it('should handle nested objects', () => {
const nestedData = {
level1: {
level2: {
level3: {
data: 'test'.repeat(50)
}
}
}
};
const result = compressor.compress(nestedData);
const decompressed = compressor.decompress(result);
expect(decompressed).toEqual(nestedData);
});
});
describe('Decompression Tests', () => {
it('should decompress compressed data correctly', () => {
const originalData = {
test: 'data'.repeat(100)
};
const compressed = compressor.compress(originalData);
const decompressed = compressor.decompress(compressed);
expect(decompressed).toEqual(originalData);
});
it('should handle regular JSON strings', () => {
const jsonString = '{"test":"value"}';
const result = compressor.decompress(jsonString);
expect(result).toEqual({
test: 'value'
});
});
it('should throw error for invalid compressed data', () => {
const invalidData = new Uint8Array([1, 2, 3]);
expect(() => compressor.decompress(invalidData)).toThrow();
});
});
describe('Performance Analysis', () => {
it('should provide compression analysis', () => {
const testData = {
array: Array(1000).fill('test'),
text: 'sample'.repeat(1000)
};
const analysis = compressor.analyzeCompression(testData);
expect(analysis).toHaveProperty('originalSize');
expect(analysis).toHaveProperty('compressedSize');
expect(analysis).toHaveProperty('compressionRatio');
expect(analysis).toHaveProperty('compressionSavings');
expect(analysis.compressionSavings).toBeGreaterThan(0);
});
it('should handle different compression levels', () => {
const testData = {
text: 'test'.repeat(1000)
};
const lowCompressor = new JsonCompressor({
level: 1
});
const highCompressor = new JsonCompressor({
level: 9
});
const lowAnalysis = lowCompressor.analyzeCompression(testData);
const highAnalysis = highCompressor.analyzeCompression(testData);
// 高压缩级别应该产生更小的压缩大小
expect(highAnalysis.compressedSize).toBeLessThanOrEqual(lowAnalysis.compressedSize);
});
});
describe('Edge Cases', () => {
it('should handle empty objects', () => {
const emptyData = {};
const result = compressor.compress(emptyData);
const decompressed = compressor.decompress(result);
expect(decompressed).toEqual(emptyData);
});
it('should handle null values', () => {
const nullData = {
test: null
};
const result = compressor.compress(nullData);
const decompressed = compressor.decompress(result);
expect(decompressed).toEqual(nullData);
});
it('should handle arrays with mixed types', () => {
const mixedData = {
array: [1, 'string', null, {
nested: true
}, [1, 2, 3]]
};
const result = compressor.compress(mixedData);
const decompressed = compressor.decompress(result);
expect(decompressed).toEqual(mixedData);
});
});
});