diff options
| author | 2026-06-07 12:12:39 +0000 | |
|---|---|---|
| committer | 2026-06-07 12:17:59 +0000 | |
| commit | 58698a0e70c61c7447ec9a7b938fc63a94151db1 (patch) | |
| tree | 808873c6e9ea3a38bcd054ac34eca09bec34703f /object/tree/insert_test.go | |
| parent | object/tree: Reject duplicates (diff) | |
object/tree: Add tests
Diffstat (limited to 'object/tree/insert_test.go')
| -rw-r--r-- | object/tree/insert_test.go | 102 |
1 files changed, 102 insertions, 0 deletions
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") + } +} |
