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: []byte(""), ID: zero}},
{name: "slash-name", entry: tree.Entry{Mode: mode.Regular, Name: []byte("a/b"), ID: zero}},
{name: "nul-name", entry: tree.Entry{Mode: mode.Regular, Name: []byte("a\x00b"), ID: zero}},
{name: "invalid-mode", entry: tree.Entry{Mode: mode.Mode(0o100640), Name: []byte("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: []byte("file"), ID: zero},
second: tree.Entry{Mode: mode.Regular, Name: []byte("file"), ID: zero},
},
{
name: "blob-then-tree",
first: tree.Entry{Mode: mode.Regular, Name: []byte("name"), ID: zero},
second: tree.Entry{Mode: mode.Directory, Name: []byte("name"), ID: zero},
},
{
name: "tree-then-blob",
first: tree.Entry{Mode: mode.Directory, Name: []byte("name"), ID: zero},
second: tree.Entry{Mode: mode.Regular, Name: []byte("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)
}
})
}
}