Files
notarius/internal/modules/dnd/shared/source_ref_order_test.go

82 lines
2.9 KiB
Go

package shared
import (
"reflect"
"testing"
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
)
func TestSourceRefOrderUsesDocumentOrderAndLiteralFallbacks(t *testing.T) {
doc := unitRefSourceDocument(30, 10, 20)
order := NewSourceRefOrder(doc)
refs := []source.SourceRef{
{SourceID: doc.ID, StartUnitID: 10, EndUnitID: 10},
{SourceID: doc.ID, StartUnitID: 999, EndUnitID: 999},
{SourceID: doc.ID, StartUnitID: 30, EndUnitID: 30},
{SourceID: "other", StartUnitID: 30, EndUnitID: 1},
{SourceID: "other", StartUnitID: 10, EndUnitID: 2},
}
got := order.Canonicalize(refs)
want := []source.SourceRef{
{SourceID: "other", StartUnitID: 10, EndUnitID: 2},
{SourceID: "other", StartUnitID: 30, EndUnitID: 1},
{SourceID: doc.ID, StartUnitID: 30, EndUnitID: 30},
{SourceID: doc.ID, StartUnitID: 10, EndUnitID: 10},
{SourceID: doc.ID, StartUnitID: 999, EndUnitID: 999},
}
if !reflect.DeepEqual(got, want) {
t.Fatalf("Canonicalize() = %#v, want %#v", got, want)
}
if order.Less(want[0], want[0]) {
t.Fatal("Less(ref, ref) = true, want false")
}
}
func TestSourceRefOrderCanonicalizePreservesRepresentationAndOwnership(t *testing.T) {
order := NewSourceRefOrder(unitRefSourceDocument(3, 1, 2))
if got := order.Canonicalize(nil); got != nil {
t.Fatalf("Canonicalize(nil) = %#v, want nil", got)
}
empty := []source.SourceRef{}
if got := order.Canonicalize(empty); got == nil || len(got) != 0 {
t.Fatalf("Canonicalize(empty) = %#v, want owned empty slice", got)
}
input := []source.SourceRef{
{SourceID: "session-alpha", StartUnitID: 1, EndUnitID: 2},
{SourceID: "session-alpha", StartUnitID: 1, EndUnitID: 2},
{SourceID: "session-alpha", StartUnitID: 1, EndUnitID: 3},
}
got := order.Canonicalize(input)
if len(got) != 2 || got[0] == got[1] {
t.Fatalf("Canonicalize() = %#v, want exact duplicate removed but distinct range retained", got)
}
got[0].StartUnitID = 99
if input[0].StartUnitID == 99 {
t.Fatal("Canonicalize() output aliases input")
}
}
func TestSourceRefOrderSnapshotAndEarliestValid(t *testing.T) {
doc := unitRefSourceDocument(30, 10, 20)
order := NewSourceRefOrder(doc)
doc.Units[0].ID, doc.Units[1].ID = 10, 30
refs := []source.SourceRef{
{SourceID: doc.ID, StartUnitID: 20, EndUnitID: 20},
{SourceID: doc.ID, StartUnitID: 10, EndUnitID: 10},
{SourceID: "other", StartUnitID: 1, EndUnitID: 1},
{SourceID: doc.ID, StartUnitID: 999, EndUnitID: 999},
{SourceID: doc.ID, StartUnitID: 20, EndUnitID: 30},
}
if position, ok := order.EarliestValid(refs); !ok || position != 1 {
t.Fatalf("EarliestValid() = %d, %t, want 1, true", position, ok)
}
if position, ok := order.EarliestValid([]source.SourceRef{{SourceID: doc.ID, StartUnitID: 20, EndUnitID: 30}}); ok || position != 0 {
t.Fatalf("EarliestValid(invalid) = %d, %t, want 0, false", position, ok)
}
if position, ok := (SourceRefOrder{}).EarliestValid(refs); ok || position != 0 {
t.Fatalf("zero EarliestValid() = %d, %t, want 0, false", position, ok)
}
}