Vectrum
Sign In
69 lines · 1.8 KB · Shell
#!/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