package index
import (
"database/sql"
"errors"
"testing"
)
// TipOf answers what its single OR query answered (the newest check-in on
// the branch or wearing its name), without walking every check-in. Each
// name is checked against that query on a history built to tell them
// apart.
func TestTipOfAnswersWhatTheWholeQueryDid(t *testing.T) {
ix := openIndex(t)
ci(t, ix, "t1", "trunk", "2026-01-01T00:00:00", "base")
ci(t, ix, "t2", "trunk", "2026-01-02T00:00:00", "next", "t1")
ci(t, ix, "f1", "feat", "2026-01-03T00:00:00", "feature", "t2")
ci(t, ix, "f2", "feat", "2026-01-04T00:00:00", "feature more", "f1")
ci(t, ix, "x1", "other", "2026-01-05T00:00:00", "wears trunk's name", "t2")
ci(t, ix, "z1", "feat", "2026-01-04T00:00:00", "same second as f2", "f1")
sym := func(c, name string) {
if _, err := ix.db.Exec(`INSERT INTO checkin_sym (checkin, name) VALUES (?, ?)`, c, name); err != nil {
t.Fatal(err)
}
}
sym("t1", "trunk")
sym("t2", "trunk")
sym("x1", "trunk") // newer than trunk's own tip
sym("t1", "v1.0") // a tag on no branch of its name
sym("f2", "feat")
old := func(name string) (string, bool) {
var h string
err := ix.db.QueryRow(`SELECT c.hash FROM checkin c
WHERE c.branch = ?1 OR EXISTS (SELECT 1 FROM checkin_sym s WHERE s.checkin = c.hash AND s.name = ?1)
ORDER BY c.date DESC, c.hash DESC LIMIT 1`, name).Scan(&h)
if errors.Is(err, sql.ErrNoRows) {
return "", false
}
if err != nil {
t.Fatal(err)
}
return h, true
}
for _, name := range []string{"trunk", "feat", "other", "v1.0", "nothing"} {
want, wantOK := old(name)
got, ok, err := ix.TipOf(name)
if err != nil {
t.Fatal(err)
}
if ok != wantOK || got.Tip != want || (ok && got.Name != name) {
t.Errorf("FAIL: TipOf(%q) = %q,%v; the whole query says %q,%v", name, got.Tip, ok, want, wantOK)
}
}
}