• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package gover
6
7import (
8	"reflect"
9	"testing"
10)
11
12func TestCompare(t *testing.T) { test2(t, compareTests, "Compare", Compare) }
13
14var compareTests = []testCase2[string, string, int]{
15	{"", "", 0},
16	{"x", "x", 0},
17	{"", "x", 0},
18	{"1", "1.1", -1},
19	{"1.5", "1.6", -1},
20	{"1.5", "1.10", -1},
21	{"1.6", "1.6.1", -1},
22	{"1.19", "1.19.0", 0},
23	{"1.19rc1", "1.19", -1},
24	{"1.20", "1.20.0", 0},
25	{"1.20rc1", "1.20", -1},
26	{"1.21", "1.21.0", -1},
27	{"1.21", "1.21rc1", -1},
28	{"1.21rc1", "1.21.0", -1},
29	{"1.6", "1.19", -1},
30	{"1.19", "1.19.1", -1},
31	{"1.19rc1", "1.19", -1},
32	{"1.19rc1", "1.19.1", -1},
33	{"1.19rc1", "1.19rc2", -1},
34	{"1.19.0", "1.19.1", -1},
35	{"1.19rc1", "1.19.0", -1},
36	{"1.19alpha3", "1.19beta2", -1},
37	{"1.19beta2", "1.19rc1", -1},
38	{"1.1", "1.99999999999999998", -1},
39	{"1.99999999999999998", "1.99999999999999999", -1},
40}
41
42func TestLang(t *testing.T) { test1(t, langTests, "Lang", Lang) }
43
44var langTests = []testCase1[string, string]{
45	{"1.2rc3", "1.2"},
46	{"1.2.3", "1.2"},
47	{"1.2", "1.2"},
48	{"1", "1"},
49	{"1.999testmod", "1.999"},
50}
51
52func TestIsLang(t *testing.T) { test1(t, isLangTests, "IsLang", IsLang) }
53
54var isLangTests = []testCase1[string, bool]{
55	{"1.2rc3", false},
56	{"1.2.3", false},
57	{"1.999testmod", false},
58	{"1.22", true},
59	{"1.21", true},
60	{"1.20", false}, // == 1.20.0
61	{"1.19", false}, // == 1.20.0
62	{"1.3", false},  // == 1.3.0
63	{"1.2", false},  // == 1.2.0
64	{"1", false},    // == 1.0.0
65}
66
67func TestPrev(t *testing.T) { test1(t, prevTests, "Prev", Prev) }
68
69var prevTests = []testCase1[string, string]{
70	{"", ""},
71	{"0", "0"},
72	{"1.3rc4", "1.2"},
73	{"1.3.5", "1.2"},
74	{"1.3", "1.2"},
75	{"1", "1"},
76	{"1.99999999999999999", "1.99999999999999998"},
77	{"1.40000000000000000", "1.39999999999999999"},
78}
79
80func TestIsValid(t *testing.T) { test1(t, isValidTests, "IsValid", IsValid) }
81
82var isValidTests = []testCase1[string, bool]{
83	{"1.2rc3", true},
84	{"1.2.3", true},
85	{"1.999testmod", true},
86	{"1.600+auto", false},
87	{"1.22", true},
88	{"1.21.0", true},
89	{"1.21rc2", true},
90	{"1.21", true},
91	{"1.20.0", true},
92	{"1.20", true},
93	{"1.19", true},
94	{"1.3", true},
95	{"1.2", true},
96	{"1", true},
97}
98
99type testCase1[In, Out any] struct {
100	in  In
101	out Out
102}
103
104type testCase2[In1, In2, Out any] struct {
105	in1 In1
106	in2 In2
107	out Out
108}
109
110type testCase3[In1, In2, In3, Out any] struct {
111	in1 In1
112	in2 In2
113	in3 In3
114	out Out
115}
116
117func test1[In, Out any](t *testing.T, tests []testCase1[In, Out], name string, f func(In) Out) {
118	t.Helper()
119	for _, tt := range tests {
120		if out := f(tt.in); !reflect.DeepEqual(out, tt.out) {
121			t.Errorf("%s(%v) = %v, want %v", name, tt.in, out, tt.out)
122		}
123	}
124}
125
126func test2[In1, In2, Out any](t *testing.T, tests []testCase2[In1, In2, Out], name string, f func(In1, In2) Out) {
127	t.Helper()
128	for _, tt := range tests {
129		if out := f(tt.in1, tt.in2); !reflect.DeepEqual(out, tt.out) {
130			t.Errorf("%s(%+v, %+v) = %+v, want %+v", name, tt.in1, tt.in2, out, tt.out)
131		}
132	}
133}
134
135func test3[In1, In2, In3, Out any](t *testing.T, tests []testCase3[In1, In2, In3, Out], name string, f func(In1, In2, In3) Out) {
136	t.Helper()
137	for _, tt := range tests {
138		if out := f(tt.in1, tt.in2, tt.in3); !reflect.DeepEqual(out, tt.out) {
139			t.Errorf("%s(%+v, %+v, %+v) = %+v, want %+v", name, tt.in1, tt.in2, tt.in3, out, tt.out)
140		}
141	}
142}
143