mosc/middleout/mosc_test.go
2025-06-08 02:18:05 -04:00

96 lines
3.2 KiB
Go

package middleout
import (
"bytes"
"strings"
"testing"
)
func TestMOSC(t *testing.T) {
tests := []struct {
name string
data []byte
spiralFactor float64
clusterSize int
maxFractal int
}{
{
name: "Repetitive",
data: []byte(strings.Repeat("abcd", 6)), // 24 bytes
spiralFactor: 0.1,
clusterSize: 8,
maxFractal: 3,
},
{
name: "Random",
data: []byte("abcdefghijklmnopqrstuvwxyz"), // 26 bytes
spiralFactor: 0.1,
clusterSize: 8,
maxFractal: 3,
},
{
name: "Large",
data: []byte(strings.Repeat("abc", 100)), // 300 bytes
spiralFactor: 0.1,
clusterSize: 8,
maxFractal: 3,
},
{
name: "Short",
data: []byte("abc"), // 3 bytes
spiralFactor: 0.1,
clusterSize: 8,
maxFractal: 3,
},
{
name: "VeryLarge",
data: []byte(strings.Repeat("abcd", 1000)), // 4000 bytes
spiralFactor: 0.1,
clusterSize: 8,
maxFractal: 0, // Disable fractal to isolate issue
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
compressor := NewMOSCCompressor(tt.spiralFactor, tt.clusterSize, tt.maxFractal)
compressed, err := compressor.Compress(tt.data)
if err != nil {
t.Fatalf("Compression error: %v", err)
}
t.Logf("Original size: %d bytes, Compressed size: %d bytes, Ratio: %.2f%%",
len(tt.data), len(compressed), (float64(len(compressed))/float64(len(tt.data))*100))
decompressed, err := compressor.Decompress(compressed)
if err != nil {
t.Fatalf("Decompression error: %v", err)
}
if !bytes.Equal(decompressed, tt.data) {
t.Errorf("Decompressed data does not match original")
logLen := len(decompressed)
if logLen > 100 {
logLen = 100
}
t.Logf("Decompressed first %d bytes: %v", logLen, decompressed[:logLen])
for i := 0; i < len(decompressed) && i < len(tt.data); i++ {
if decompressed[i] != tt.data[i] {
start := i - 5
if start < 0 {
start = 0
}
end := i + 5
if end > len(decompressed) {
end = len(decompressed)
}
if end > len(tt.data) {
end = len(tt.data)
}
t.Errorf("First mismatch at position %d: got %d, want %d; surrounding got %v, want %v",
i, decompressed[i], tt.data[i], decompressed[start:end], tt.data[start:end])
break
}
}
}
})
}
}