package blendfile import ( "bytes" "compress/gzip" "testing" ) func makeBlendHeader(major, minor int) []byte { header := make([]byte, 12) copy(header[:7], "BLENDER") header[7] = '-' header[8] = 'v' header[9] = byte('0' + major) header[10] = byte('0' + minor/10) header[11] = byte('0' + minor%10) return header } func TestParseVersionFromReader_Uncompressed(t *testing.T) { tests := []struct { name string major int minor int wantMajor int wantMinor int }{ {"Blender 4.02", 4, 2, 4, 2}, {"Blender 3.06", 3, 6, 3, 6}, {"Blender 2.79", 2, 79, 2, 79}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { header := makeBlendHeader(tt.major, tt.minor) r := bytes.NewReader(header) major, minor, err := ParseVersionFromReader(r) if err != nil { t.Fatalf("ParseVersionFromReader: %v", err) } if major != tt.wantMajor || minor != tt.wantMinor { t.Errorf("got %d.%d, want %d.%d", major, minor, tt.wantMajor, tt.wantMinor) } }) } } func TestParseVersionFromReader_GzipCompressed(t *testing.T) { header := makeBlendHeader(4, 2) // Pad to ensure gzip has enough data for a full read data := make([]byte, 128) copy(data, header) var buf bytes.Buffer gz := gzip.NewWriter(&buf) gz.Write(data) gz.Close() r := bytes.NewReader(buf.Bytes()) major, minor, err := ParseVersionFromReader(r) if err != nil { t.Fatalf("ParseVersionFromReader (gzip): %v", err) } if major != 4 || minor != 2 { t.Errorf("got %d.%d, want 4.2", major, minor) } } func TestParseVersionFromReader_InvalidMagic(t *testing.T) { data := []byte("NOT_BLEND_DATA_HERE") r := bytes.NewReader(data) _, _, err := ParseVersionFromReader(r) if err == nil { t.Fatal("expected error for invalid magic, got nil") } } func TestParseVersionFromReader_TooShort(t *testing.T) { data := []byte("SHORT") r := bytes.NewReader(data) _, _, err := ParseVersionFromReader(r) if err == nil { t.Fatal("expected error for short data, got nil") } } func TestVersionString(t *testing.T) { got := VersionString(4, 2) want := "4.2" if got != want { t.Errorf("VersionString(4, 2) = %q, want %q", got, want) } }