Skip to content

Commit 3ade055

Browse files
committed
Added string-sorting support for relaxed-versions
1 parent ffc4442 commit 3ade055

File tree

2 files changed

+94
-32
lines changed

2 files changed

+94
-32
lines changed

relaxed_version.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,18 @@ func (v *RelaxedVersion) CompatibleWith(u *RelaxedVersion) bool {
103103
}
104104
return v.Equal(u)
105105
}
106+
107+
// SortableString returns the version encoded as a string that when compared
108+
// with alphanumeric ordering it respects the original semver ordering:
109+
//
110+
// (v1.SortableString() < v2.SortableString()) == v1.LessThan(v2)
111+
// cmp.Compare[string](v1.SortableString(), v2.SortableString()) == v1.CompareTo(v2)
112+
//
113+
// This may turn out useful when the version is saved in a database or is
114+
// introduced in a system that doesn't support semver ordering.
115+
func (v *RelaxedVersion) SortableString() string {
116+
if v.version != nil {
117+
return ";" + v.version.SortableString()
118+
}
119+
return ":" + string(v.customversion)
120+
}

relaxed_version_test.go

Lines changed: 79 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package semver
88

99
import (
10+
"cmp"
1011
"fmt"
1112
"testing"
1213

@@ -17,47 +18,93 @@ func TestRelaxedVersionComparator(t *testing.T) {
1718
sign := map[int]string{1: ">", 0: "=", -1: "<"}
1819
ascending := func(list ...*RelaxedVersion) {
1920
for i := range list[0 : len(list)-1] {
20-
a := list[i]
21-
b := list[i+1]
22-
comp := a.CompareTo(b)
23-
fmt.Printf("%s %s %s\n", a, sign[comp], b)
24-
require.Equal(t, comp, -1)
25-
require.True(t, a.LessThan(b))
26-
require.True(t, a.LessThanOrEqual(b))
27-
require.False(t, a.Equal(b))
28-
require.False(t, a.GreaterThanOrEqual(b))
29-
require.False(t, a.GreaterThan(b))
30-
31-
comp = b.CompareTo(a)
32-
fmt.Printf("%s %s %s\n", b, sign[comp], a)
33-
require.Equal(t, comp, 1)
34-
require.False(t, b.LessThan(a))
35-
require.False(t, b.LessThanOrEqual(a))
36-
require.False(t, b.Equal(a))
37-
require.True(t, b.GreaterThanOrEqual(a))
38-
require.True(t, b.GreaterThan(a))
39-
}
40-
}
41-
equal := func(list ...*RelaxedVersion) {
42-
for _, a := range list {
43-
for _, b := range list {
21+
{
22+
a := list[i]
23+
b := list[i+1]
4424
comp := a.CompareTo(b)
4525
fmt.Printf("%s %s %s\n", a, sign[comp], b)
46-
require.Equal(t, comp, 0)
47-
require.False(t, a.LessThan(b))
26+
require.Equal(t, comp, -1)
27+
require.True(t, a.LessThan(b))
4828
require.True(t, a.LessThanOrEqual(b))
49-
require.True(t, a.Equal(b))
50-
require.True(t, a.GreaterThanOrEqual(b))
29+
require.False(t, a.Equal(b))
30+
require.False(t, a.GreaterThanOrEqual(b))
5131
require.False(t, a.GreaterThan(b))
5232

5333
comp = b.CompareTo(a)
5434
fmt.Printf("%s %s %s\n", b, sign[comp], a)
55-
require.Equal(t, comp, 0)
35+
require.Equal(t, comp, 1)
5636
require.False(t, b.LessThan(a))
57-
require.True(t, b.LessThanOrEqual(a))
58-
require.True(t, b.Equal(a))
37+
require.False(t, b.LessThanOrEqual(a))
38+
require.False(t, b.Equal(a))
5939
require.True(t, b.GreaterThanOrEqual(a))
60-
require.False(t, b.GreaterThan(a))
40+
require.True(t, b.GreaterThan(a))
41+
}
42+
{
43+
a := list[i].SortableString()
44+
b := list[i+1].SortableString()
45+
comp := cmp.Compare(a, b)
46+
fmt.Printf("%s %s %s\n", a, sign[comp], b)
47+
require.Equal(t, comp, -1)
48+
require.True(t, a < b)
49+
require.True(t, a <= b)
50+
require.False(t, a == b)
51+
require.False(t, a >= b)
52+
require.False(t, a > b)
53+
54+
comp = cmp.Compare(b, a)
55+
fmt.Printf("%s %s %s\n", b, sign[comp], a)
56+
require.Equal(t, comp, 1)
57+
require.False(t, b < a)
58+
require.False(t, b <= a)
59+
require.False(t, b == a)
60+
require.True(t, b >= a)
61+
require.True(t, b > a)
62+
}
63+
}
64+
}
65+
equal := func(list ...*RelaxedVersion) {
66+
for _, a := range list {
67+
for _, b := range list {
68+
{
69+
comp := a.CompareTo(b)
70+
fmt.Printf("%s %s %s\n", a, sign[comp], b)
71+
require.Equal(t, comp, 0)
72+
require.False(t, a.LessThan(b))
73+
require.True(t, a.LessThanOrEqual(b))
74+
require.True(t, a.Equal(b))
75+
require.True(t, a.GreaterThanOrEqual(b))
76+
require.False(t, a.GreaterThan(b))
77+
78+
comp = b.CompareTo(a)
79+
fmt.Printf("%s %s %s\n", b, sign[comp], a)
80+
require.Equal(t, comp, 0)
81+
require.False(t, b.LessThan(a))
82+
require.True(t, b.LessThanOrEqual(a))
83+
require.True(t, b.Equal(a))
84+
require.True(t, b.GreaterThanOrEqual(a))
85+
require.False(t, b.GreaterThan(a))
86+
}
87+
{
88+
a := a.SortableString()
89+
b := b.SortableString()
90+
comp := cmp.Compare(a, b)
91+
fmt.Printf("%s %s %s\n", a, sign[comp], b)
92+
require.Equal(t, comp, 0)
93+
require.False(t, a < b)
94+
require.True(t, a <= b)
95+
require.True(t, a == b)
96+
require.True(t, a >= b)
97+
require.False(t, a > b)
98+
99+
comp = cmp.Compare(b, a)
100+
fmt.Printf("%s %s %s\n", b, sign[comp], a)
101+
require.Equal(t, comp, 0)
102+
require.False(t, b < a)
103+
require.True(t, b <= a)
104+
require.True(t, b == a)
105+
require.True(t, b >= a)
106+
require.False(t, b > a)
107+
}
61108
}
62109
}
63110
}

0 commit comments

Comments
 (0)