shithub: furgit

Download patch

ref: e46ff2047d01de13206a116181df510ceb9535c8
parent: 95d8ceb9b612c776b3f6dce3c7a2236c17bd5313
author: Runxi Yu <me@runxiyu.org>
date: Wed Mar 4 09:11:50 EST 2026

objectid: Make more tests iterate algorithms

--- a/objectid/objectid_test.go
+++ b/objectid/objectid_test.go
@@ -2,6 +2,7 @@
 
 import (
 	"bytes"
+	"strings"
 	"testing"
 
 	"codeberg.org/lindenii/furgit/objectid"
@@ -28,52 +29,37 @@
 func TestParseHexRoundtrip(t *testing.T) {
 	t.Parallel()
 
-	tests := []struct {
-		name string
-		algo objectid.Algorithm
-		hex  string
-	}{
-		{
-			name: "sha1",
-			algo: objectid.AlgorithmSHA1,
-			hex:  "0123456789abcdef0123456789abcdef01234567",
-		},
-		{
-			name: "sha256",
-			algo: objectid.AlgorithmSHA256,
-			hex:  "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
-		},
-	}
-
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
+	for _, algo := range objectid.SupportedAlgorithms() {
+		t.Run(algo.String(), func(t *testing.T) {
 			t.Parallel()
 
-			id, err := objectid.ParseHex(tt.algo, tt.hex)
+			hex := strings.Repeat("01", algo.Size())
+
+			id, err := objectid.ParseHex(algo, hex)
 			if err != nil {
 				t.Fatalf("ParseHex failed: %v", err)
 			}
 
-			if got := id.String(); got != tt.hex {
-				t.Fatalf("String() = %q, want %q", got, tt.hex)
+			if got := id.String(); got != hex {
+				t.Fatalf("String() = %q, want %q", got, hex)
 			}
 
-			if got := id.Size(); got != tt.algo.Size() {
-				t.Fatalf("Size() = %d, want %d", got, tt.algo.Size())
+			if got := id.Size(); got != algo.Size() {
+				t.Fatalf("Size() = %d, want %d", got, algo.Size())
 			}
 
 			raw := id.Bytes()
-			if len(raw) != tt.algo.Size() {
-				t.Fatalf("Bytes len = %d, want %d", len(raw), tt.algo.Size())
+			if len(raw) != algo.Size() {
+				t.Fatalf("Bytes len = %d, want %d", len(raw), algo.Size())
 			}
 
-			id2, err := objectid.FromBytes(tt.algo, raw)
+			id2, err := objectid.FromBytes(algo, raw)
 			if err != nil {
 				t.Fatalf("FromBytes failed: %v", err)
 			}
 
-			if id2.String() != tt.hex {
-				t.Fatalf("FromBytes roundtrip = %q, want %q", id2.String(), tt.hex)
+			if id2.String() != hex {
+				t.Fatalf("FromBytes roundtrip = %q, want %q", id2.String(), hex)
 			}
 		})
 	}
@@ -82,25 +68,33 @@
 func TestParseHexErrors(t *testing.T) {
 	t.Parallel()
 
-	tests := []struct {
-		name string
-		algo objectid.Algorithm
-		hex  string
-	}{
-		{"unknown algo", objectid.AlgorithmUnknown, "00"},
-		{"odd len", objectid.AlgorithmSHA1, "0"},
-		{"wrong len", objectid.AlgorithmSHA1, "0123"},
-		{"invalid hex", objectid.AlgorithmSHA1, "zz23456789abcdef0123456789abcdef01234567"},
-	}
+	t.Run("unknown algo", func(t *testing.T) {
+		t.Parallel()
 
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
+		_, err := objectid.ParseHex(objectid.AlgorithmUnknown, "00")
+		if err == nil {
+			t.Fatalf("expected ParseHex error")
+		}
+	})
+
+	for _, algo := range objectid.SupportedAlgorithms() {
+		t.Run(algo.String(), func(t *testing.T) {
 			t.Parallel()
 
-			_, err := objectid.ParseHex(tt.algo, tt.hex)
+			_, err := objectid.ParseHex(algo, strings.Repeat("0", algo.HexLen()-1))
 			if err == nil {
-				t.Fatalf("expected ParseHex error")
+				t.Fatalf("expected ParseHex odd-len error")
 			}
+
+			_, err = objectid.ParseHex(algo, strings.Repeat("0", algo.HexLen()-2))
+			if err == nil {
+				t.Fatalf("expected ParseHex wrong-len error")
+			}
+
+			_, err = objectid.ParseHex(algo, "z"+strings.Repeat("0", algo.HexLen()-1))
+			if err == nil {
+				t.Fatalf("expected ParseHex invalid-hex error")
+			}
 		})
 	}
 }
@@ -113,9 +107,11 @@
 		t.Fatalf("expected FromBytes unknown algo error")
 	}
 
-	_, err = objectid.FromBytes(objectid.AlgorithmSHA1, []byte{1, 2})
-	if err == nil {
-		t.Fatalf("expected FromBytes wrong size error")
+	for _, algo := range objectid.SupportedAlgorithms() {
+		_, err = objectid.FromBytes(algo, []byte{1, 2})
+		if err == nil {
+			t.Fatalf("expected FromBytes wrong size error")
+		}
 	}
 }
 
@@ -122,21 +118,23 @@
 func TestBytesReturnsCopy(t *testing.T) {
 	t.Parallel()
 
-	id, err := objectid.ParseHex(objectid.AlgorithmSHA1, "0123456789abcdef0123456789abcdef01234567")
-	if err != nil {
-		t.Fatalf("ParseHex failed: %v", err)
-	}
+	for _, algo := range objectid.SupportedAlgorithms() {
+		id, err := objectid.ParseHex(algo, strings.Repeat("01", algo.Size()))
+		if err != nil {
+			t.Fatalf("ParseHex failed: %v", err)
+		}
 
-	b1 := id.Bytes()
+		b1 := id.Bytes()
 
-	b2 := id.Bytes()
-	if !bytes.Equal(b1, b2) {
-		t.Fatalf("Bytes mismatch")
-	}
+		b2 := id.Bytes()
+		if !bytes.Equal(b1, b2) {
+			t.Fatalf("Bytes mismatch")
+		}
 
-	b1[0] ^= 0xff
-	if bytes.Equal(b1, b2) {
-		t.Fatalf("Bytes should return independent copies")
+		b1[0] ^= 0xff
+		if bytes.Equal(b1, b2) {
+			t.Fatalf("Bytes should return independent copies")
+		}
 	}
 }
 
@@ -143,25 +141,27 @@
 func TestRawBytesAliasesStorage(t *testing.T) {
 	t.Parallel()
 
-	id, err := objectid.ParseHex(objectid.AlgorithmSHA1, "0123456789abcdef0123456789abcdef01234567")
-	if err != nil {
-		t.Fatalf("ParseHex failed: %v", err)
-	}
+	for _, algo := range objectid.SupportedAlgorithms() {
+		id, err := objectid.ParseHex(algo, strings.Repeat("01", algo.Size()))
+		if err != nil {
+			t.Fatalf("ParseHex failed: %v", err)
+		}
 
-	b := id.RawBytes()
-	if len(b) != id.Size() {
-		t.Fatalf("RawBytes len = %d, want %d", len(b), id.Size())
-	}
+		b := id.RawBytes()
+		if len(b) != id.Size() {
+			t.Fatalf("RawBytes len = %d, want %d", len(b), id.Size())
+		}
 
-	if cap(b) != len(b) {
-		t.Fatalf("RawBytes cap = %d, want %d", cap(b), len(b))
-	}
+		if cap(b) != len(b) {
+			t.Fatalf("RawBytes cap = %d, want %d", cap(b), len(b))
+		}
 
-	orig := id.String()
-	b[0] ^= 0xff
+		orig := id.String()
+		b[0] ^= 0xff
 
-	if id.String() == orig {
-		t.Fatalf("RawBytes should alias object ID storage")
+		if id.String() == orig {
+			t.Fatalf("RawBytes should alias object ID storage")
+		}
 	}
 }
 
--