package main
import (
"runtime/debug"
"testing"
)
func TestResolveVersionTriesStampThenModuleThenDefault(t *testing.T) {
info := func(v string) func() (*debug.BuildInfo, bool) {
return func() (*debug.BuildInfo, bool) {
return &debug.BuildInfo{Main: debug.Module{Path: "github.com/johannSo/codey", Version: v}}, true
}
}
none := func() (*debug.BuildInfo, bool) { return nil, false }
cases := []struct {
name string
stamped string
info func() (*debug.BuildInfo, bool)
want string
}{
{"goreleaser stamp, which has no v", "0.7.0", info("v0.7.0"), "v0.7.0"},
{"a stamp wins over the module", "v0.8.0", info("v0.7.0"), "v0.8.0"},
{"snapshot stamp", "0.7.1-SNAPSHOT-abc1234", none, "v0.7.1-SNAPSHOT-abc1234"},
{"go install at a tag", "", info("v0.7.0"), "v0.7.0"},
{"go install at a pre-release tag", "", info("v0.7.0-rc.1"), "v0.7.0-rc.1"},
{"go build with no vcs info", "", info("(devel)"), defaultVersion},
{"go build with no tag in reach", "", info("v0.0.0-20261002101500-219352e3b1c4"), defaultVersion},
{"go build past a tag", "", info("v0.7.1-0.20261002101500-219352e3b1c4"), defaultVersion},
{"go build with local changes", "", info("v0.7.0+dirty"), defaultVersion},
{"no build info at all", "", none, defaultVersion},
}
for _, c := range cases {
if got := resolveVersion(c.stamped, c.info); got != c.want {
t.Errorf("%s: resolveVersion(%q) = %q, want %q", c.name, c.stamped, got, c.want)
}
}
}
// Every answer resolveVersion can give still has to satisfy the client's
// pattern, or a release would read to T3 Code as a broken install.
func TestEveryVersionShapeMatchesWhatTheClientLooksFor(t *testing.T) {
for _, v := range []string{defaultVersion, "v0.7.0", "v0.7.0-rc.1", "v0.7.1-SNAPSHOT-abc1234"} {
if !t3VersionPattern.MatchString("codey " + v) {
t.Errorf("%q does not match %s", v, t3VersionPattern)
}
}
}