From 58698a0e70c61c7447ec9a7b938fc63a94151db1 Mon Sep 17 00:00:00 2001 From: Runxi Yu Date: Sun, 7 Jun 2026 12:12:39 +0000 Subject: object/tree: Add tests --- object/tree/insert_test.go | 102 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 object/tree/insert_test.go (limited to 'object/tree/insert_test.go') diff --git a/object/tree/insert_test.go b/object/tree/insert_test.go new file mode 100644 index 00000000..fbf65b84 --- /dev/null +++ b/object/tree/insert_test.go @@ -0,0 +1,102 @@ +package tree_test + +import ( + "errors" + "testing" + + "lindenii.org/go/furgit/object/id" + "lindenii.org/go/furgit/object/tree" + "lindenii.org/go/furgit/object/tree/mode" +) + +func TestInsertRejects(t *testing.T) { + t.Parallel() + + zero := id.SupportedObjectFormats()[0].Zero() + + for _, tc := range []struct { + name string + entry tree.Entry + }{ + {name: "empty-name", entry: tree.Entry{Mode: mode.Regular, Name: "", ID: zero}}, + {name: "slash-name", entry: tree.Entry{Mode: mode.Regular, Name: "a/b", ID: zero}}, + {name: "nul-name", entry: tree.Entry{Mode: mode.Regular, Name: "a\x00b", ID: zero}}, + {name: "invalid-mode", entry: tree.Entry{Mode: mode.Mode(0o100640), Name: "file", ID: zero}}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var tr tree.Tree + + err := tr.Insert(tc.entry) + if !errors.Is(err, tree.ErrInvalidTree) { + t.Fatalf("Insert error = %v, want ErrInvalidTree", err) + } + }) + } +} + +func TestInsertRejectsConflict(t *testing.T) { + t.Parallel() + + zero := id.SupportedObjectFormats()[0].Zero() + + for _, tc := range []struct { + name string + first tree.Entry + second tree.Entry + }{ + { + name: "same-mode", + first: tree.Entry{Mode: mode.Regular, Name: "file", ID: zero}, + second: tree.Entry{Mode: mode.Regular, Name: "file", ID: zero}, + }, + { + name: "blob-then-tree", + first: tree.Entry{Mode: mode.Regular, Name: "name", ID: zero}, + second: tree.Entry{Mode: mode.Directory, Name: "name", ID: zero}, + }, + { + name: "tree-then-blob", + first: tree.Entry{Mode: mode.Directory, Name: "name", ID: zero}, + second: tree.Entry{Mode: mode.Regular, Name: "name", ID: zero}, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + var tr tree.Tree + + err := tr.Insert(tc.first) + if err != nil { + t.Fatalf("Insert(first): %v", err) + } + + err = tr.Insert(tc.second) + if !errors.Is(err, tree.ErrInvalidTree) { + t.Fatalf("Insert(second) error = %v, want ErrInvalidTree", err) + } + }) + } +} + +func TestEntriesIsCopy(t *testing.T) { + t.Parallel() + + zero := id.SupportedObjectFormats()[0].Zero() + + var tr tree.Tree + + err := tr.Insert(tree.Entry{Mode: mode.Regular, Name: "file", ID: zero}) + if err != nil { + t.Fatalf("Insert: %v", err) + } + + entries := tr.Entries() + entries[0].Name = "mutated" + + again := tr.Entries() + if again[0].Name != "file" { + t.Fatalf("Entries()[0].Name = %q, want %q", again[0].Name, "file") + } +} -- cgit v1.3.1-10-gc9f91