package zitcli
import (
"bufio"
"strings"
"testing"
)
func TestParseCrosslink(t *testing.T) {
stream := "crosslink 1\n" +
"checkin aa11 890923558000\n" +
"comment 22\ninitial empty check-in\n" +
"tag *branch * trunk\n" +
"tag *sym-trunk *\n" +
"end\n" +
"checkin bb22 893869787000 aa11\n" +
"user first\\slast\n" +
"comment 10\nmulti\nne\\s\n" + // raw bytes, newline inside
"file M src/main.c\n" +
"file D old\\sname.txt\n" +
"end\n" +
"checkin cc33 900000000000 bb22\n" +
"comment 0\n\n" +
"cherrypick +aa11\n" +
"cherrypick -bb22\n" +
"files unknown\n" +
"end\n"
var got []CrosslinkRecord
if err := parseCrosslink(bufio.NewReader(strings.NewReader(stream)),
func(r CrosslinkRecord) error { got = append(got, r); return nil }); err != nil {
t.Fatal(err)
}
if len(got) != 3 {
t.Fatalf("records = %d", len(got))
}
a, b, c := got[0], got[1], got[2]
if a.User != "anonymous" || a.Comment != "initial empty check-in" ||
len(a.Tags) != 2 || a.Tags[0].Value != "trunk" || !a.FilesKnown {
t.Fatalf("record a: %+v", a)
}
if b.User != "first last" || b.Comment != "multi\nne\\s" ||
len(b.Changes) != 2 || b.Changes[1] != "old name.txt" ||
b.Parents[0] != "aa11" {
t.Fatalf("record b: %+v", b)
}
if c.FilesKnown || c.Comment != "" || len(c.Cherrypicks) != 2 ||
c.Cherrypicks[0].Sign != '+' || c.Cherrypicks[0].Hash != "aa11" ||
c.Cherrypicks[1].Sign != '-' || c.Cherrypicks[1].Hash != "bb22" {
t.Fatalf("record c: %+v", c)
}
if len(a.Cherrypicks)+len(b.Cherrypicks) != 0 {
t.Fatalf("cherry-picks on records without Q cards: %+v %+v", a.Cherrypicks, b.Cherrypicks)
}
bad := "crosslink 1\ncheckin dd44 900000000000\ncomment 0\n\ncherrypick aa11\nend\n"
if err := parseCrosslink(bufio.NewReader(strings.NewReader(bad)), func(CrosslinkRecord) error { return nil }); err == nil {
t.Fatal("a cherrypick line with no sign was accepted")
}
}
func TestFileHistoryToleratesWeekday(t *testing.T) {
lines := []string{
"checkin aa11 2026-06-30T15:44:13.893 jan Version bump here",
"checkin bb22 Thu 2026-08-21T02:31:43.000 dan weekday annotated line",
}
for _, line := range lines {
rest, _ := strings.CutPrefix(line, "checkin ")
f := strings.SplitN(rest, " ", 5)
if len(f) >= 2 && weekdayToken[f[1]] {
f = append(f[:1], f[2:]...)
} else if len(f) == 5 {
f[3] = f[3] + " " + f[4]
f = f[:4]
}
if len(f) < 4 || !strings.HasPrefix(f[1], "2026-") {
t.Fatalf("parse of %q gave %v", line, f)
}
}
}