Skip to content
quarry Artifact [ff52d25c08]
Login

Artifact [ff52d25c08]

Artifact ff52d25c086af8cd9df0db6edd2474ce1be33a1879ac0773b7576c648e69d687:


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)
		}
	}
}