#!/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