1// Copyright 2017 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 gps
6
7import "testing"
8
9func TestVersionSorts(t *testing.T) {
10	rev := Revision("flooboofoobooo")
11	v1 := NewBranch("master").Pair(rev)
12	v2 := NewBranch("test").Pair(rev)
13	v3 := NewVersion("1.0.0").Pair(rev)
14	v4 := NewVersion("1.0.1").Pair(rev)
15	v5 := NewVersion("v2.0.5").Pair(rev)
16	v6 := NewVersion("2.0.5.2").Pair(rev)
17	v7 := newDefaultBranch("unwrapped").Pair(rev)
18	v8 := NewVersion("20.0.5.2").Pair(rev)
19	v9 := NewVersion("v1.5.5-beta.4").Pair(rev)
20	v10 := NewVersion("v3.0.1-alpha.1").Pair(rev)
21
22	start := []Version{
23		v1,
24		v2,
25		v3,
26		v4,
27		v5,
28		v6,
29		v7,
30		v8,
31		v9,
32		v10,
33		rev,
34	}
35
36	down := make([]Version, len(start))
37	copy(down, start)
38	up := make([]Version, len(start))
39	copy(up, start)
40
41	edown := []Version{
42		v3, v4, v5, // semvers
43		v9, v10, // prerelease semver
44		v7, v1, v2, // floating/branches
45		v6, v8, // plain versions
46		rev, // revs
47	}
48
49	eup := []Version{
50		v5, v4, v3, // semvers
51		v10, v9, // prerelease semver
52		v7, v1, v2, // floating/branches
53		v6, v8, // plain versions
54		rev, // revs
55	}
56
57	SortForUpgrade(up)
58	var wrong []int
59	for k, v := range up {
60		if eup[k] != v {
61			wrong = append(wrong, k)
62			t.Errorf("Expected version %s in position %v on upgrade sort, but got %s", eup[k], k, v)
63		}
64	}
65	if len(wrong) > 0 {
66		// Just helps with readability a bit
67		t.Errorf("Upgrade sort positions with wrong versions: %v", wrong)
68	}
69
70	SortForDowngrade(down)
71	wrong = wrong[:0]
72	for k, v := range down {
73		if edown[k] != v {
74			wrong = append(wrong, k)
75			t.Errorf("Expected version %s in position %v on downgrade sort, but got %s", edown[k], k, v)
76		}
77	}
78	if len(wrong) > 0 {
79		// Just helps with readability a bit
80		t.Errorf("Downgrade sort positions with wrong versions: %v", wrong)
81	}
82
83	// Now make sure we sort back the other way correctly...just because
84	SortForUpgrade(down)
85	wrong = wrong[:0]
86	for k, v := range down {
87		if eup[k] != v {
88			wrong = append(wrong, k)
89			t.Errorf("Expected version %s in position %v on down-then-upgrade sort, but got %s", eup[k], k, v)
90		}
91	}
92	if len(wrong) > 0 {
93		// Just helps with readability a bit
94		t.Errorf("Down-then-upgrade sort positions with wrong versions: %v", wrong)
95	}
96
97	// Now make sure we sort back the other way correctly...just because
98	SortForDowngrade(up)
99	wrong = wrong[:0]
100	for k, v := range up {
101		if edown[k] != v {
102			wrong = append(wrong, k)
103			t.Errorf("Expected version %s in position %v on up-then-downgrade sort, but got %s", edown[k], k, v)
104		}
105	}
106	if len(wrong) > 0 {
107		// Just helps with readability a bit
108		t.Fatalf("Up-then-downgrade sort positions with wrong versions: %v", wrong)
109	}
110
111	///////////
112	// Repeat for PairedVersion slices & sorts
113
114	pdown, pup := make([]PairedVersion, 0, len(start)), make([]PairedVersion, 0, len(start))
115	for _, v := range start {
116		if _, ok := v.(Revision); ok {
117			continue
118		}
119		pdown = append(pdown, v.(PairedVersion))
120		pup = append(pup, v.(PairedVersion))
121	}
122
123	pedown, peup := make([]PairedVersion, 0, len(edown)), make([]PairedVersion, 0, len(eup))
124	for _, v := range edown {
125		if _, ok := v.(Revision); ok {
126			continue
127		}
128		pedown = append(pedown, v.(PairedVersion))
129	}
130	for _, v := range eup {
131		if _, ok := v.(Revision); ok {
132			continue
133		}
134		peup = append(peup, v.(PairedVersion))
135	}
136
137	SortPairedForUpgrade(pup)
138	for k, v := range pup {
139		if peup[k] != v {
140			wrong = append(wrong, k)
141			t.Errorf("Expected version %s in position %v on upgrade sort, but got %s", peup[k], k, v)
142		}
143	}
144	if len(wrong) > 0 {
145		// Just helps with readability a bit
146		t.Errorf("Upgrade sort positions with wrong versions: %v", wrong)
147	}
148
149	SortPairedForDowngrade(pdown)
150	wrong = wrong[:0]
151	for k, v := range pdown {
152		if pedown[k] != v {
153			wrong = append(wrong, k)
154			t.Errorf("Expected version %s in position %v on downgrade sort, but got %s", pedown[k], k, v)
155		}
156	}
157	if len(wrong) > 0 {
158		// Just helps with readability a bit
159		t.Errorf("Downgrade sort positions with wrong versions: %v", wrong)
160	}
161
162	// Now make sure we sort back the other way correctly...just because
163	SortPairedForUpgrade(pdown)
164	wrong = wrong[:0]
165	for k, v := range pdown {
166		if peup[k] != v {
167			wrong = append(wrong, k)
168			t.Errorf("Expected version %s in position %v on down-then-upgrade sort, but got %s", peup[k], k, v)
169		}
170	}
171	if len(wrong) > 0 {
172		// Just helps with readability a bit
173		t.Errorf("Down-then-upgrade sort positions with wrong versions: %v", wrong)
174	}
175
176	// Now make sure we sort back the other way correctly...just because
177	SortPairedForDowngrade(pup)
178	wrong = wrong[:0]
179	for k, v := range pup {
180		if pedown[k] != v {
181			wrong = append(wrong, k)
182			t.Errorf("Expected version %s in position %v on up-then-downgrade sort, but got %s", pedown[k], k, v)
183		}
184	}
185	if len(wrong) > 0 {
186		// Just helps with readability a bit
187		t.Errorf("Up-then-downgrade sort positions with wrong versions: %v", wrong)
188	}
189}
190