aboutsummaryrefslogtreecommitdiff
path: root/object/tree/serialize_test.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-25 14:49:17 +0000
committerGravatar Runxi Yu2026-03-25 15:02:22 +0000
commit7847657e0820af98120031f719b8ede635ad8c07 (patch)
tree8c4439c78f72f1382edc809b49be33115847b6e7 /object/tree/serialize_test.go
parentobject: Remove type.go (diff)
signatureNo signature
object: Split each object type into its own package v0.1.108
Diffstat (limited to 'object/tree/serialize_test.go')
-rw-r--r--object/tree/serialize_test.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/object/tree/serialize_test.go b/object/tree/serialize_test.go
new file mode 100644
index 00000000..9c9a2f1c
--- /dev/null
+++ b/object/tree/serialize_test.go
@@ -0,0 +1,73 @@
+package tree_test
+
+import (
+ "testing"
+
+ "codeberg.org/lindenii/furgit/internal/testgit"
+ objectid "codeberg.org/lindenii/furgit/object/id"
+ "codeberg.org/lindenii/furgit/object/tree"
+)
+
+func TestTreeSerialize(t *testing.T) {
+ t.Parallel()
+ testgit.ForEachAlgorithm(t, func(t *testing.T, algo objectid.Algorithm) { //nolint:thelper
+ testRepo := testgit.NewRepo(t, testgit.RepoOptions{ObjectFormat: algo, Bare: true})
+ entries := adversarialRootEntries(t, testRepo)
+ obj := &tree.Tree{}
+
+ for i := len(entries) - 1; i >= 0; i-- {
+ err := obj.InsertEntry(entries[i])
+ if err != nil {
+ t.Fatalf("InsertEntry(%q): %v", entries[i].Name, err)
+ }
+ }
+
+ if len(obj.Entries) < 32 {
+ t.Fatalf("expected at least 32 entries, got %d", len(obj.Entries))
+ }
+
+ dup := obj.Entries[0]
+
+ err := obj.InsertEntry(dup)
+ if err == nil {
+ t.Fatalf("duplicate InsertEntry should fail")
+ }
+
+ removed := obj.Entries[len(obj.Entries)/2]
+
+ err = obj.RemoveEntry(removed.Name)
+ if err != nil {
+ t.Fatalf("RemoveEntry(%q): %v", removed.Name, err)
+ }
+
+ if obj.Entry(removed.Name) != nil {
+ t.Fatalf("Entry(%q) should be nil after remove", removed.Name)
+ }
+
+ err = obj.RemoveEntry([]byte("no-such-entry"))
+ if err == nil {
+ t.Fatalf("RemoveEntry missing entry should fail")
+ }
+
+ err = obj.InsertEntry(removed)
+ if err != nil {
+ t.Fatalf("re-InsertEntry(%q): %v", removed.Name, err)
+ }
+
+ if obj.Entry(removed.Name) == nil {
+ t.Fatalf("Entry(%q) should exist after reinsert", removed.Name)
+ }
+
+ wantTreeID := testRepo.Mktree(t, buildGitMktreeInput(obj.Entries))
+
+ rawObj, err := obj.SerializeWithHeader()
+ if err != nil {
+ t.Fatalf("SerializeWithHeader: %v", err)
+ }
+
+ gotTreeID := algo.Sum(rawObj)
+ if gotTreeID != wantTreeID {
+ t.Fatalf("tree id mismatch: got %s want %s", gotTreeID, wantTreeID)
+ }
+ })
+}