#!/usr/bin/env bash
set -euo pipefail
cat > semver_test.go <<'GO'
package semver
import "testing"
func TestParse(t *testing.T) {
cases := []struct {
name string
in string
want Version
wantErr bool
}{
{name: "plain", in: "1.2.3", want: Version{1, 2, 3}},
{name: "v prefix", in: "v0.1.0", want: Version{0, 1, 0}},
{name: "spaces", in: " 2.0.0 ", want: Version{2, 0, 0}},
{name: "too few parts", in: "1.2", wantErr: true},
{name: "too many parts", in: "1.2.3.4", wantErr: true},
{name: "not a number", in: "1.x.3", wantErr: true},
{name: "negative", in: "1.-2.3", wantErr: true},
{name: "empty", in: "", wantErr: true},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
got, err := Parse(tc.in)
if tc.wantErr {
if err == nil {
t.Fatalf("Parse(%q) = %v, want an error", tc.in, got)
}
return
}
if err != nil {
t.Fatalf("Parse(%q): %v", tc.in, err)
}
if got != tc.want {
t.Errorf("Parse(%q) = %v, want %v", tc.in, got, tc.want)
}
})
}
}
func TestCompare(t *testing.T) {
cases := []struct {
name string
a, b Version
want int
}{
{name: "equal", a: Version{1, 2, 3}, b: Version{1, 2, 3}, want: 0},
{name: "major lower", a: Version{1, 9, 9}, b: Version{2, 0, 0}, want: -1},
{name: "major higher", a: Version{2, 0, 0}, b: Version{1, 9, 9}, want: 1},
{name: "minor", a: Version{1, 1, 0}, b: Version{1, 2, 0}, want: -1},
{name: "patch", a: Version{1, 1, 2}, b: Version{1, 1, 1}, want: 1},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
if got := Compare(tc.a, tc.b); got != tc.want {
t.Errorf("Compare(%v, %v) = %d, want %d", tc.a, tc.b, got, tc.want)
}
})
}
}
func TestString(t *testing.T) {
if got := (Version{1, 2, 3}).String(); got != "1.2.3" {
t.Errorf("String() = %q", got)
}
}
GO