| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package module |
| |
| import ( |
| "testing" |
| "time" |
| ) |
| |
| var pseudoTests = []struct { |
| major string |
| older string |
| version string |
| }{ |
| {"", "", "v0.0.0-20060102150405-hash"}, |
| {"v0", "", "v0.0.0-20060102150405-hash"}, |
| {"v1", "", "v1.0.0-20060102150405-hash"}, |
| {"v2", "", "v2.0.0-20060102150405-hash"}, |
| {"unused", "v0.0.0", "v0.0.1-0.20060102150405-hash"}, |
| {"unused", "v1.2.3", "v1.2.4-0.20060102150405-hash"}, |
| {"unused", "v1.2.99999999999999999", "v1.2.100000000000000000-0.20060102150405-hash"}, |
| {"unused", "v1.2.3-pre", "v1.2.3-pre.0.20060102150405-hash"}, |
| {"unused", "v1.3.0-pre", "v1.3.0-pre.0.20060102150405-hash"}, |
| {"unused", "v0.0.0--", "v0.0.0--.0.20060102150405-hash"}, |
| {"unused", "v1.0.0+metadata", "v1.0.1-0.20060102150405-hash+metadata"}, |
| {"unused", "v2.0.0+incompatible", "v2.0.1-0.20060102150405-hash+incompatible"}, |
| {"unused", "v2.3.0-pre+incompatible", "v2.3.0-pre.0.20060102150405-hash+incompatible"}, |
| } |
| |
| var pseudoTime = time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC) |
| |
| func TestPseudoVersion(t *testing.T) { |
| for _, tt := range pseudoTests { |
| v := PseudoVersion(tt.major, tt.older, pseudoTime, "hash") |
| if v != tt.version { |
| t.Errorf("PseudoVersion(%q, %q, ...) = %v, want %v", tt.major, tt.older, v, tt.version) |
| } |
| } |
| } |
| |
| func TestIsPseudoVersion(t *testing.T) { |
| for _, tt := range pseudoTests { |
| if !IsPseudoVersion(tt.version) { |
| t.Errorf("IsPseudoVersion(%q) = false, want true", tt.version) |
| } |
| if IsPseudoVersion(tt.older) { |
| t.Errorf("IsPseudoVersion(%q) = true, want false", tt.older) |
| } |
| } |
| } |
| |
| func TestPseudoVersionTime(t *testing.T) { |
| for _, tt := range pseudoTests { |
| tm, err := PseudoVersionTime(tt.version) |
| if tm != pseudoTime || err != nil { |
| t.Errorf("PseudoVersionTime(%q) = %v, %v, want %v, nil", tt.version, tm.Format(time.RFC3339), err, pseudoTime.Format(time.RFC3339)) |
| } |
| tm, err = PseudoVersionTime(tt.older) |
| if tm != (time.Time{}) || err == nil { |
| t.Errorf("PseudoVersionTime(%q) = %v, %v, want %v, error", tt.older, tm.Format(time.RFC3339), err, time.Time{}.Format(time.RFC3339)) |
| } |
| } |
| } |
| |
| func TestInvalidPseudoVersionTime(t *testing.T) { |
| const v = "---" |
| if _, err := PseudoVersionTime(v); err == nil { |
| t.Error("expected error, got nil instead") |
| } |
| } |
| |
| func TestPseudoVersionRev(t *testing.T) { |
| for _, tt := range pseudoTests { |
| rev, err := PseudoVersionRev(tt.version) |
| if rev != "hash" || err != nil { |
| t.Errorf("PseudoVersionRev(%q) = %q, %v, want %q, nil", tt.older, rev, err, "hash") |
| } |
| rev, err = PseudoVersionRev(tt.older) |
| if rev != "" || err == nil { |
| t.Errorf("PseudoVersionRev(%q) = %q, %v, want %q, error", tt.older, rev, err, "") |
| } |
| } |
| } |
| |
| func TestPseudoVersionBase(t *testing.T) { |
| for _, tt := range pseudoTests { |
| base, err := PseudoVersionBase(tt.version) |
| if err != nil { |
| t.Errorf("PseudoVersionBase(%q): %v", tt.version, err) |
| } else if base != tt.older { |
| t.Errorf("PseudoVersionBase(%q) = %q; want %q", tt.version, base, tt.older) |
| } |
| } |
| } |
| |
| func TestInvalidPseudoVersionBase(t *testing.T) { |
| for _, in := range []string{ |
| "v0.0.0", |
| "v0.0.0-", // malformed: empty prerelease |
| "v0.0.0-0.20060102150405-hash", // Z+1 == 0 |
| "v0.1.0-0.20060102150405-hash", // Z+1 == 0 |
| "v1.0.0-0.20060102150405-hash", // Z+1 == 0 |
| "v0.0.0-20060102150405-hash+incompatible", // "+incompatible without base version |
| "v0.0.0-20060102150405-hash+metadata", // other metadata without base version |
| } { |
| base, err := PseudoVersionBase(in) |
| if err == nil || base != "" { |
| t.Errorf(`PseudoVersionBase(%q) = %q, %v; want "", error`, in, base, err) |
| } |
| } |
| } |
| |
| func TestIncDecimal(t *testing.T) { |
| cases := []struct { |
| in, want string |
| }{ |
| {"0", "1"}, |
| {"1", "2"}, |
| {"99", "100"}, |
| {"100", "101"}, |
| {"101", "102"}, |
| } |
| |
| for _, tc := range cases { |
| got := incDecimal(tc.in) |
| if got != tc.want { |
| t.Fatalf("incDecimal(%q) = %q; want %q", tc.in, tc.want, got) |
| } |
| } |
| } |
| |
| func TestDecDecimal(t *testing.T) { |
| cases := []struct { |
| in, want string |
| }{ |
| {"", ""}, |
| {"0", ""}, |
| {"00", ""}, |
| {"1", "0"}, |
| {"2", "1"}, |
| {"99", "98"}, |
| {"100", "99"}, |
| {"101", "100"}, |
| } |
| |
| for _, tc := range cases { |
| got := decDecimal(tc.in) |
| if got != tc.want { |
| t.Fatalf("decDecimal(%q) = %q; want %q", tc.in, tc.want, got) |
| } |
| } |
| } |