88 lines
2.7 KiB
Go
88 lines
2.7 KiB
Go
package shared
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/notarius/internal/core/source"
|
|
)
|
|
|
|
func TestCitedText(t *testing.T) {
|
|
doc := citationDocument()
|
|
tests := []struct {
|
|
name string
|
|
refs []source.SourceRef
|
|
want string
|
|
wantErr bool
|
|
}{
|
|
{name: "empty references", refs: nil, want: ""},
|
|
{name: "invalid source id", refs: []source.SourceRef{{SourceID: "other", StartUnitID: 10, EndUnitID: 10}}, wantErr: true},
|
|
{name: "unknown start unit", refs: []source.SourceRef{{SourceID: "session", StartUnitID: 99, EndUnitID: 10}}, wantErr: true},
|
|
{name: "unknown end unit", refs: []source.SourceRef{{SourceID: "session", StartUnitID: 10, EndUnitID: 99}}, wantErr: true},
|
|
{name: "reversed document range", refs: []source.SourceRef{{SourceID: "session", StartUnitID: 30, EndUnitID: 10}}, wantErr: true},
|
|
{
|
|
name: "disjoint ranges supplied out of order",
|
|
refs: []source.SourceRef{
|
|
{SourceID: "session", StartUnitID: 30, EndUnitID: 30},
|
|
{SourceID: "session", StartUnitID: 10, EndUnitID: 10},
|
|
},
|
|
want: "alpha\ngamma",
|
|
},
|
|
{
|
|
name: "adjacent ranges",
|
|
refs: []source.SourceRef{
|
|
{SourceID: "session", StartUnitID: 10, EndUnitID: 20},
|
|
{SourceID: "session", StartUnitID: 30, EndUnitID: 40},
|
|
},
|
|
want: "alpha\nbeta\ngamma\ndelta",
|
|
},
|
|
{
|
|
name: "overlapping and duplicate ranges",
|
|
refs: []source.SourceRef{
|
|
{SourceID: "session", StartUnitID: 10, EndUnitID: 30},
|
|
{SourceID: "session", StartUnitID: 20, EndUnitID: 40},
|
|
{SourceID: "session", StartUnitID: 10, EndUnitID: 30},
|
|
},
|
|
want: "alpha\nbeta\ngamma\ndelta",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
beforeUnits := append([]source.SourceUnit(nil), doc.Units...)
|
|
refs := append([]source.SourceRef(nil), test.refs...)
|
|
got, err := CitedText(doc, refs)
|
|
if (err != nil) != test.wantErr {
|
|
t.Fatalf("CitedText() error = %v, want error = %t", err, test.wantErr)
|
|
}
|
|
if err == nil && got != test.want {
|
|
t.Fatalf("CitedText() = %q, want %q", got, test.want)
|
|
}
|
|
if !reflect.DeepEqual(doc.Units, beforeUnits) || !reflect.DeepEqual(refs, test.refs) {
|
|
t.Fatalf("CitedText() mutated document or references")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestCitedTextRejectsNilDocument(t *testing.T) {
|
|
if _, err := CitedText(nil, nil); err == nil {
|
|
t.Fatal("CitedText() error = nil, want nil-document error")
|
|
}
|
|
}
|
|
|
|
func citationDocument() *source.SourceDocument {
|
|
return &source.SourceDocument{
|
|
ID: "session",
|
|
Kind: "transcript",
|
|
Format: "application/json",
|
|
Digest: "sha256:session",
|
|
Units: []source.SourceUnit{
|
|
{ID: 10, Kind: "message", Text: "alpha"},
|
|
{ID: 20, Kind: "message", Text: "beta"},
|
|
{ID: 30, Kind: "message", Text: "gamma"},
|
|
{ID: 40, Kind: "message", Text: "delta"},
|
|
},
|
|
}
|
|
}
|