Skip to content

Commit 796e194

Browse files
committed
Port nuget tests to Univers
Signed-off-by: Philippe Ombredanne <pombredanne@nexb.com>
1 parent 943cea1 commit 796e194

7 files changed

Lines changed: 586 additions & 619 deletions

src/univers/nuget.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,21 @@ class Version:
152152
def __init__(self, base_semver, revision=0):
153153
self._base_semver = base_semver
154154
if self._base_semver.prerelease:
155+
# TODO: why lowercasing this and not the build and why here and now?
155156
self._base_semver = self._base_semver.replace(prerelease=base_semver.prerelease.lower())
156157
self._revision = revision or 0
157158
self._original_version = None
158159

159160
def __eq__(self, other):
160-
return self._base_semver == other._base_semver and self._revision == other._revision
161+
return (
162+
isinstance(other, Version)
163+
and self._base_semver == other._base_semver
164+
and self._revision == other._revision
165+
)
161166

162167
def __lt__(self, other):
168+
if not isinstance(other, Version):
169+
return NotImplemented
163170
if self._base_semver.replace(prerelease="") == other._base_semver.replace(prerelease=""):
164171
# If the first three components are the same, compare the revision.
165172
if self._revision != other._revision:

tests/nuget/test_semver_201_spec.py

Lines changed: 91 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -6,96 +6,104 @@
66
import pytest
77

88
from univers.utils import cmp
9-
from univers.versions import SemverVersion as SemanticVersion
9+
from univers import nuget
1010

1111

1212
# A normal version number MUST take the form X.Y.Z
1313
@pytest.mark.parametrize(
1414
["version", "expected"],
1515
[
16-
("1", False),
17-
("1.2", False),
18-
("1.2.3", True),
19-
("10.2.3", True),
20-
("13234.223.32222", True),
21-
("1.2.3.4", False),
22-
("1.2. 3", False),
23-
("1. 2.3", False),
24-
("X.2.3", False),
25-
("1.2.Z", False),
26-
("X.Y.Z", False),
16+
("1", "1.0.0"),
17+
("1.2", "1.2.0"),
18+
("1.2.3", "1.2.3"),
19+
("10.2.3", "10.2.3"),
20+
("13234.223.32222", "13234.223.32222"),
21+
("1.2.3.4", "1.2.3.4"),
2722
],
2823
)
2924
def test_SemVerVersionMustBe3Parts(version, expected):
30-
semVer = None
31-
valid = SemanticVersion(version, semVer)
32-
assert valid == expected
25+
version = nuget.Version.from_string(version)
26+
assert str(version) == expected
27+
28+
29+
@pytest.mark.parametrize(
30+
"version",
31+
[
32+
"1.2. 3",
33+
"1. 2.3",
34+
"X.2.3",
35+
"1.2.Z",
36+
"X.Y.Z",
37+
],
38+
)
39+
def test_SemVerVersionMustBeValid(version):
40+
with pytest.raises(Exception):
41+
nuget.Version.from_string(version)
3342

3443

3544
# X, Y, and Z are non-negative integers
3645
@pytest.mark.parametrize(
37-
["versionString"],
46+
"version",
3847
[
39-
("-1.2.3",),
40-
("1.-2.3",),
41-
("1.2.-3",),
48+
"-1.2.3",
49+
"1.-2.3",
50+
"1.2.-3",
4251
],
4352
)
44-
def test_SemVerVersionNegativeNumbers(versionString):
45-
semVer = None
46-
valid = SemanticVersion(versionString, semVer)
47-
assert not valid
53+
def test_SemVerVersionNegativeNumbers(version):
54+
with pytest.raises(Exception):
55+
nuget.Version.from_string(version)
4856

4957

50-
# X, Y, and Z MUST NOT contain leading zeroes
58+
# X, Y, and Z leading zeroes are normalized
5159
@pytest.mark.parametrize(
52-
"versionString",
60+
("version", "expected"),
5361
[
54-
("01.2.3",),
55-
("1.02.3",),
56-
("1.2.03",),
57-
("00.2.3",),
58-
("1.2.0030",),
62+
("01.2.3", "1.2.3"),
63+
("1.02.3", "1.2.3"),
64+
("1.2.03", "1.2.3"),
65+
("00.2.3", "0.2.3"),
66+
("1.2.0030", "1.2.30"),
5967
],
6068
)
61-
def test_SemVerVersionLeadingZeros(versionString):
62-
semVer = None
63-
valid = SemanticVersion(versionString, semVer)
64-
assert not valid
69+
def test_SemVerVersionAcceptsLeadingZeros(version, expected):
70+
version = nuget.Version.from_string(version)
71+
assert str(version) == expected
6572

6673

6774
# Major version zero (0.y.z) is for initial development
6875
@pytest.mark.parametrize(
69-
"versionString",
76+
"version",
7077
[
71-
("0.1.2",),
72-
("1.0.0",),
73-
("0.0.0",),
78+
"0.1.2",
79+
"1.0.0",
80+
"0.0.0",
7481
],
7582
)
76-
def test_SemVerVersionValidZeros(versionString):
77-
semVer = None
78-
valid = SemanticVersion(versionString, semVer)
79-
assert valid
83+
def test_SemVerVersionValidZeros(version):
84+
valid = nuget.Version.from_string(version)
85+
assert str(valid) == version
8086

8187

8288
# valid release labels
8389
@pytest.mark.parametrize(
84-
"versionString",
90+
("version", "prerelease"),
8591
[
86-
("0.1.2-Alpha",),
87-
("0.1.2-Alpha.2.34.5.453.345.345.345.345.A.B.bbbbbbb.Csdfdfdf",),
88-
("0.1.2-Alpha-2-5Bdd",),
89-
("0.1.2--",),
90-
("0.1.2--B-C-",),
91-
("0.1.2--B2.-.C.-A0-",),
92-
("0.1.2+NoReleaseLabel",),
92+
("0.1.2-Alpha", "Alpha"),
93+
(
94+
"0.1.2-Alpha.2.34.5.453.345.345.345.345.A.B.bbbbbbb.Csdfdfdf",
95+
"Alpha.2.34.5.453.345.345.345.345.A.B.bbbbbbb.Csdfdfdf",
96+
),
97+
("0.1.2-Alpha-2-5Bdd", "Alpha-2-5Bdd"),
98+
("0.1.2--", "-"),
99+
("0.1.2--B-C-", "-B-C-"),
100+
("0.1.2--B2.-.C.-A0-", "-B2.-.C.-A0-"),
101+
("0.1.2+NoReleaseLabel", ""),
93102
],
94103
)
95-
def test_SemVerVersionValidReleaseLabels(versionString):
96-
semVer = None
97-
valid = SemanticVersion(versionString, semVer)
98-
assert valid
104+
def test_SemVerVersionValidReleaseLabels(version, prerelease):
105+
version = nuget.Version.from_string(version)
106+
assert version.prerelease == prerelease.lower()
99107

100108

101109
# Release label identifiers MUST NOT be empty
@@ -109,9 +117,8 @@ def test_SemVerVersionValidReleaseLabels(versionString):
109117
],
110118
)
111119
def test_SemVerVersionInvalidReleaseId(versionString):
112-
semVer = None
113-
valid = SemanticVersion(versionString, semVer)
114-
assert not valid
120+
with pytest.raises(Exception):
121+
nuget.Version.from_string(versionString)
115122

116123

117124
# Identifiers MUST comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]
@@ -125,9 +132,8 @@ def test_SemVerVersionInvalidReleaseId(versionString):
125132
],
126133
)
127134
def test_SemVerVersionInvalidReleaseLabelChars(versionString):
128-
semVer = None
129-
valid = SemanticVersion(versionString, semVer)
130-
assert not valid
135+
with pytest.raises(Exception):
136+
nuget.Version.from_string(versionString)
131137

132138

133139
# Numeric identifiers MUST NOT include leading zeroes
@@ -141,9 +147,8 @@ def test_SemVerVersionInvalidReleaseLabelChars(versionString):
141147
],
142148
)
143149
def test_SemVerVersionReleaseLabelZeros(versionString):
144-
semVer = None
145-
valid = SemanticVersion(versionString, semVer)
146-
assert not valid
150+
with pytest.raises(Exception):
151+
nuget.Version.from_string(versionString)
147152

148153

149154
# Numeric identifiers MUST NOT include leading zeroes
@@ -157,8 +162,7 @@ def test_SemVerVersionReleaseLabelZeros(versionString):
157162
],
158163
)
159164
def test_SemVerVersionReleaseLabelValidZeros(versionString):
160-
semVer = None
161-
valid = SemanticVersion(versionString, semVer)
165+
valid = nuget.Version.from_string(versionString)
162166
assert valid
163167

164168

@@ -177,8 +181,7 @@ def test_SemVerVersionReleaseLabelValidZeros(versionString):
177181
],
178182
)
179183
def test_SemVerVersionMetadataValidChars(versionString):
180-
semVer = None
181-
valid = SemanticVersion(versionString, semVer)
184+
valid = nuget.Version.from_string(versionString)
182185
assert valid
183186

184187

@@ -192,9 +195,8 @@ def test_SemVerVersionMetadataValidChars(versionString):
192195
],
193196
)
194197
def test_SemVerVersionMetadataInvalidChars(versionString):
195-
semVer = None
196-
valid = SemanticVersion(versionString, semVer)
197-
assert not valid
198+
with pytest.raises(Exception):
199+
nuget.Version.from_string(versionString)
198200

199201

200202
# Identifiers MUST NOT be empty
@@ -207,9 +209,8 @@ def test_SemVerVersionMetadataInvalidChars(versionString):
207209
],
208210
)
209211
def test_SemVerVersionMetadataNonEmptyParts(versionString):
210-
semVer = None
211-
valid = SemanticVersion(versionString, semVer)
212-
assert not valid
212+
with pytest.raises(Exception):
213+
nuget.Version.from_string(versionString)
213214

214215

215216
# Leading zeros are fine for metadata
@@ -223,8 +224,7 @@ def test_SemVerVersionMetadataNonEmptyParts(versionString):
223224
],
224225
)
225226
def test_SemVerVersionMetadataLeadingZeros(versionString):
226-
semVer = None
227-
valid = SemanticVersion(versionString, semVer)
227+
valid = nuget.Version.from_string(versionString)
228228
assert valid
229229

230230

@@ -236,8 +236,8 @@ def test_SemVerVersionMetadataLeadingZeros(versionString):
236236
],
237237
)
238238
def test_SemVerVersionMetadataOrder(versionString):
239-
semver = SemanticVersion(versionString)
240-
assert not semver.IsPrerelease
239+
semver = nuget.Version.from_string(versionString)
240+
assert not semver.prerelease
241241

242242

243243
# Precedence is determined by the first difference when comparing each
@@ -252,8 +252,8 @@ def test_SemVerVersionMetadataOrder(versionString):
252252
],
253253
)
254254
def test_SemVerSortVersion(lower, higher):
255-
lowerSemVer = SemanticVersion(lower)
256-
higherSemVer = SemanticVersion(higher)
255+
lowerSemVer = nuget.Version.from_string(lower)
256+
higherSemVer = nuget.Version.from_string(higher)
257257
assert cmp(lowerSemVer, higherSemVer) < 0
258258

259259

@@ -265,8 +265,8 @@ def test_SemVerSortVersion(lower, higher):
265265
],
266266
)
267267
def test_SemVerSortRelease(lower, higher):
268-
lowerSemVer = SemanticVersion(lower)
269-
higherSemVer = SemanticVersion(higher)
268+
lowerSemVer = nuget.Version.from_string(lower)
269+
higherSemVer = nuget.Version.from_string(higher)
270270
assert cmp(lowerSemVer, higherSemVer) < 0
271271

272272

@@ -279,8 +279,8 @@ def test_SemVerSortRelease(lower, higher):
279279
],
280280
)
281281
def test_SemVerSortReleaseNumeric(lower, higher):
282-
lowerSemVer = SemanticVersion(lower)
283-
higherSemVer = SemanticVersion(higher)
282+
lowerSemVer = nuget.Version.from_string(lower)
283+
higherSemVer = nuget.Version.from_string(higher)
284284
assert cmp(lowerSemVer, higherSemVer) < 0
285285

286286

@@ -293,8 +293,8 @@ def test_SemVerSortReleaseNumeric(lower, higher):
293293
],
294294
)
295295
def test_SemVerSortReleaseAlpha(lower, higher):
296-
lowerSemVer = SemanticVersion(lower)
297-
higherSemVer = SemanticVersion(higher)
296+
lowerSemVer = nuget.Version.from_string(lower)
297+
higherSemVer = nuget.Version.from_string(higher)
298298
assert cmp(lowerSemVer, higherSemVer) < 0
299299

300300

@@ -307,8 +307,8 @@ def test_SemVerSortReleaseAlpha(lower, higher):
307307
],
308308
)
309309
def test_SemVerSortNumericAlpha(lower, higher):
310-
lowerSemVer = SemanticVersion(lower)
311-
higherSemVer = SemanticVersion(higher)
310+
lowerSemVer = nuget.Version.from_string(lower)
311+
higherSemVer = nuget.Version.from_string(higher)
312312
assert cmp(lowerSemVer, higherSemVer) < 0
313313

314314

@@ -321,8 +321,8 @@ def test_SemVerSortNumericAlpha(lower, higher):
321321
],
322322
)
323323
def test_SemVerSortReleaseLabelCount(lower, higher):
324-
lowerSemVer = SemanticVersion(lower)
325-
higherSemVer = SemanticVersion(higher)
324+
lowerSemVer = nuget.Version.from_string(lower)
325+
higherSemVer = nuget.Version.from_string(higher)
326326
assert cmp(lowerSemVer, higherSemVer) < 0
327327

328328

@@ -335,6 +335,6 @@ def test_SemVerSortReleaseLabelCount(lower, higher):
335335
],
336336
)
337337
def test_SemVerSortIgnoreReleaseCasing(a, b):
338-
semVerA = SemanticVersion(a)
339-
semVerB = SemanticVersion(b)
338+
semVerA = nuget.Version.from_string(a)
339+
semVerB = nuget.Version.from_string(b)
340340
assert semVerA == semVerB

tests/nuget/test_version_comparer.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def test_VersionComparisonDefaultEqualWithNuGetVersion(version1, version2):
4545
],
4646
)
4747
def test_VersionComparisonDefaultNotEqualWithNuGetVersion(version1, version2):
48-
assert nuget.Version.from_string(version1) == nuget.Version.from_string(version2)
48+
assert nuget.Version.from_string(version1) != nuget.Version.from_string(version2)
4949

5050

5151
@pytest.mark.parametrize(
@@ -56,9 +56,19 @@ def test_VersionComparisonDefaultNotEqualWithNuGetVersion(version1, version2):
5656
("1.0.1", "1.0.0"),
5757
("1.0.0-BETA", "1.0.0-beta2"),
5858
("1.0.0+AA", "1.0.0-beta+aa"),
59-
("1.0.0-BETA+AA", "1.0.0-beta"),
6059
("1.0.0-BETA.X.y.5.77.0+AA", "1.0.0-beta.x.y.5.79.0+aa"),
6160
],
6261
)
6362
def test_VersionComparisonDefaultNotEqual(version1, version2):
6463
assert nuget.Version.from_string(version1) != nuget.Version.from_string(version2)
64+
65+
66+
# FIXME: Semver considers these two the same, but this one NuGet test treated them as different
67+
@pytest.mark.parametrize(
68+
"version1, version2",
69+
[
70+
("1.0.0-BETA+AA", "1.0.0-beta"),
71+
],
72+
)
73+
def test_VersionComparisonDefaultNotEqual2(version1, version2):
74+
assert nuget.Version.from_string(version1) == nuget.Version.from_string(version2)

0 commit comments

Comments
 (0)