1+ from version import Version
2+ import pytest
3+
4+ def test_version_initialization ():
5+ version = Version (1 , 0 , 0 )
6+ assert version .major == 1
7+ assert version .minor == 0
8+ assert version .patch == 0
9+ assert version .prerelease is None
10+ assert version .metadata is None
11+
12+ def test_version_initialization_from_string ():
13+ version = Version ("1" , "2" , "3" , "alpha" , "meta" )
14+ assert version .major == 1
15+ assert version .minor == 2
16+ assert version .patch == 3
17+ assert version .prerelease == "alpha"
18+ assert version .metadata == "meta"
19+
20+ def test_version_from_string ():
21+ version = Version .from_string ("1.2.3-alpha+meta" )
22+ assert version .major == 1
23+ assert version .minor == 2
24+ assert version .patch == 3
25+ assert version .prerelease == "alpha"
26+ assert version .metadata == "meta"
27+
28+ def test_version_from_string_invalid ():
29+ with pytest .raises (ValueError ):
30+ Version .from_string ("invalid.version.string" )
31+
32+ @pytest .mark .parametrize (
33+ "major, minor, patch, prerelease, metadata, expected_str" ,
34+ [
35+ (1 , 0 , 0 , None , None , "1.0.0" ),
36+ (1 , 0 , 0 , "alpha" , None , "1.0.0-alpha" ),
37+ (1 , 0 , 0 , None , "meta" , "1.0.0+meta" ),
38+ (1 , 0 , 0 , "alpha" , "meta" , "1.0.0-alpha+meta" ),
39+ (1 , 2 , 3 , "beta.1" , "build.123" , "1.2.3-beta.1+build.123" ),
40+ ],
41+ ids = [
42+ "no_prerelease_no_metadata" ,
43+ "prerelease_no_metadata" ,
44+ "no_prerelease_metadata" ,
45+ "prerelease_metadata" ,
46+ "prerelease_with_build" ,
47+ ]
48+ )
49+ def test_version_to_string (major , minor , patch , prerelease , metadata , expected_str ):
50+ version = Version (major , minor , patch , prerelease , metadata )
51+ assert str (version ) == expected_str
52+
53+ @pytest .mark .parametrize (
54+ "major, minor, patch, prerelease, metadata, expected_repr" ,
55+ [
56+ (1 , 0 , 0 , None , None , "Version(major=1, minor=0, patch=0, prerelease=None, metadata=None)" ),
57+ (1 , 0 , 0 , "alpha" , None , "Version(major=1, minor=0, patch=0, prerelease=alpha, metadata=None)" ),
58+ (1 , 0 , 0 , None , "meta" , "Version(major=1, minor=0, patch=0, prerelease=None, metadata=meta)" ),
59+ (1 , 0 , 0 , "alpha" , "meta" , "Version(major=1, minor=0, patch=0, prerelease=alpha, metadata=meta)" ),
60+ (1 , 2 , 3 , "beta.1" , "build.123" , "Version(major=1, minor=2, patch=3, prerelease=beta.1, metadata=build.123)" )
61+ ],
62+ ids = [
63+ "no_prerelease_no_metadata" ,
64+ "prerelease_no_metadata" ,
65+ "no_prerelease_metadata" ,
66+ "prerelease_metadata" ,
67+ "prerelease_with_build" ,
68+ ]
69+ )
70+ def test_version_repr (major , minor , patch , prerelease , metadata , expected_repr ):
71+ version = Version (major , minor , patch , prerelease , metadata )
72+ assert repr (version ) == expected_repr
73+
74+ @pytest .mark .parametrize (
75+ "major, minor, patch, prerelease, metadata" ,
76+ [
77+ (1 , 0 , 0 , None , None ),
78+ (1 , 0 , 0 , "alpha" , None ),
79+ (1 , 0 , 0 , None , "meta" ),
80+ (1 , 0 , 0 , "alpha" , "meta" ),
81+ (1 , 2 , 3 , "beta.1" , "build.123" ),
82+ ],
83+ ids = [
84+ "no_prerelease_no_metadata" ,
85+ "prerelease_no_metadata" ,
86+ "no_prerelease_metadata" ,
87+ "prerelease_metadata" ,
88+ "prerelease_with_build" ,
89+ ]
90+ )
91+ def test_hash (major , minor , patch , prerelease , metadata ):
92+ version = Version (major , minor , patch , prerelease , metadata )
93+ assert hash (version ) == hash ((major , minor , patch , prerelease , metadata ))
94+
95+ @pytest .mark .parametrize (
96+ "major, minor, patch, prerelease, metadata" ,
97+ [
98+ (1 , 0 , 0 , None , None ),
99+ (1 , 0 , 0 , "alpha" , None ),
100+ (1 , 0 , 0 , None , "meta" ),
101+ (1 , 0 , 0 , "alpha" , "meta" ),
102+ (1 , 2 , 3 , "beta.1" , "build.123" ),
103+ ],
104+ ids = [
105+ "no_prerelease_no_metadata" ,
106+ "prerelease_no_metadata" ,
107+ "no_prerelease_metadata" ,
108+ "prerelease_metadata" ,
109+ "prerelease_with_build" ,
110+ ]
111+ )
112+ def test_version_equality_equals (major , minor , patch , prerelease , metadata ):
113+ version1 = Version (major , minor , patch , prerelease , metadata )
114+ version2 = Version (major , minor , patch , prerelease , metadata )
115+ assert version1 == version2
116+ assert version1 is not version2 # Different instances should not be the same object
117+
118+ @pytest .mark .parametrize (
119+ "major, minor, patch, prerelease, metadata" ,
120+ [
121+ (1 , 0 , 0 , None , None ),
122+ (1 , 0 , 0 , "alpha" , None ),
123+ (1 , 0 , 0 , None , "meta" ),
124+ (1 , 0 , 0 , "alpha" , "meta" ),
125+ (1 , 2 , 3 , "beta.1" , "build.123" ),
126+ ],
127+ ids = [
128+ "no_prerelease_no_metadata" ,
129+ "prerelease_no_metadata" ,
130+ "no_prerelease_metadata" ,
131+ "prerelease_metadata" ,
132+ "prerelease_with_build" ,
133+ ]
134+ )
135+ def test_version_equality_not_equals (major , minor , patch , prerelease , metadata ):
136+ version1 = Version (major , minor , patch , prerelease , metadata )
137+ version2 = Version (major + 1 , minor , patch , prerelease , metadata )
138+ assert version1 != version2
139+
140+ def test_version_equality_different_metadata ():
141+ version1 = Version (1 , 0 , 0 , metadata = "meta1" )
142+ version2 = Version (1 , 0 , 0 , metadata = "meta2" )
143+ assert version1 == version2 # Different metadata should not affect equality
144+
145+ def test_version_equality_different_types ():
146+ version = Version (1 , 0 , 0 )
147+ assert version != "1.0.0" # Different types should not be equal
148+ assert version != 1.0 # Different types should not be equal
149+
150+ @pytest .mark .parametrize (
151+ "version1, version2" ,
152+ [
153+ (Version (1 , 0 , 0 ), Version (1 , 0 , 1 )), # Same major and minor, different patch
154+ (Version (1 , 0 , 0 ), Version (1 , 1 , 0 )), # Same major, different minor
155+ (Version (1 , 0 , 0 ), Version (2 , 0 , 0 )), # Different major
156+ (Version (1 , 0 , 0 , "alpha" ), Version (1 , 0 , 0 , "beta" )), # Same major and minor, different prerelease
157+ (Version (1 , 0 , 0 , "alpha" ), Version (1 , 0 , 0 )), # Same major and minor, with and without prerelease
158+ (Version (1 , 0 , 0 , "alpha" ), Version (1 , 0 , 0 , "alpha.1" )), # Same major and minor, different prerelease (sub version)
159+ (Version (1 , 0 , 0 , "alpha" ), Version (1 , 0 , 0 , "beta.1" )), # Same major and minor, different prerelease (main version)
160+ (Version (1 , 0 , 0 , "0" ), Version (1 , 0 , 0 , "1" )), # Same major and minor, different prerelease (numbers)
161+ (Version (1 , 0 , 0 , "0.1" ), Version (1 , 0 , 0 , "0.2" )), # Same major and minor, different prerelease (numbers, sub version)
162+ ],
163+ ids = [
164+ "same_major_minor_different_patch" ,
165+ "same_major_different_minor" ,
166+ "different_major" ,
167+ "same_major_minor_different_prerelease" ,
168+ "Same major and minor, with and without prerelease" ,
169+ "same_major_minor_different_prerelease (sub version)" ,
170+ "same_major_minor_different_prerelease (main version)" ,
171+ "same_major_minor_different_prerelease (numbers)" ,
172+ "Same major and minor, different prerelease (numbers, sub version)"
173+ ]
174+ )
175+ def test_version_lower_than_good (version1 , version2 ):
176+ assert version1 < version2
177+
178+ @pytest .mark .parametrize (
179+ "version1, version2" ,
180+ [
181+ (Version (1 , 0 , 0 ), Version (1 , 0 , 0 )), # Same version
182+ (Version (1 , 0 , 0 ), Version (1 , 0 , 0 , "alpha" )), # Same major and minor, with and without prerelease
183+ (Version (1 , 0 , 0 , "alpha.1.0" ), Version (1 , 0 , 0 , "alpha.1.0" )), # Same major and minor, different prerelease
184+ (Version (1 , 0 , 0 , "alpha.1.1" ), Version (1 , 0 , 0 , "alpha.1.0" )), # Same major and minor, different prerelease (sub version)
185+ ],
186+ ids = [
187+ "same_version" ,
188+ "same_major_minor_with_prerelease" ,
189+ "same_major_minor_different_prerelease" ,
190+ "same_major_minor_different_prerelease (sub version)" ,
191+ ]
192+ )
193+ def test_version_lower_than_bad (version1 , version2 ):
194+ assert not version1 < version2 # Should not be less than or equal to
195+
196+
197+ def test_version_greater_than ():
198+ version1 = Version (1 , 0 , 1 )
199+ version2 = Version (1 , 0 , 0 )
200+ assert version1 > version2 # Should be greater than
201+
202+ def test_version_greater_or_equal ():
203+ version1 = Version (1 , 0 , 0 )
204+ version2 = Version (1 , 0 , 0 )
205+ version3 = Version (1 , 0 , 1 )
206+ assert version1 >= version2 # Should be greater than or equal to
207+ assert version3 >= version1 # Should be greater than or equal to
208+
209+ def test_version_less_or_equal ():
210+ version1 = Version (1 , 0 , 0 )
211+ version2 = Version (1 , 0 , 1 )
212+ version3 = Version (1 , 0 , 0 )
213+ assert version1 <= version2 # Should be less than or equal to
214+ assert version3 <= version1 # Should be less than or equal to
215+
216+
217+ def test_version_increment_major ():
218+ version = Version (1 , 2 , 3 )
219+ version .major_increment ()
220+ assert version .major == 2
221+ assert version .minor == 0
222+ assert version .patch == 0
223+
224+ def test_version_increment_minor ():
225+ version = Version (1 , 2 , 3 )
226+ version .minor_increment ()
227+ assert version .major == 1
228+ assert version .minor == 3
229+ assert version .patch == 0
230+
231+ def test_version_increment_patch ():
232+ version = Version (1 , 2 , 3 )
233+ version .patch_increment ()
234+ assert version .major == 1
235+ assert version .minor == 2
236+ assert version .patch == 4
237+
238+ def test_version_prerelease_increment ():
239+ version = Version (1 , 2 , 3 , "alpha.1" )
240+ version .prerelease_increment ()
241+ assert version .prerelease == "alpha.2"
242+
243+ def test_version_prerelease_increment_no_subversion ():
244+ version = Version (1 , 2 , 3 )
245+ with pytest .raises (ValueError ):
246+ version .prerelease_increment ()
247+
248+ def test_version_metadata_increment ():
249+ version = Version (1 , 2 , 3 , metadata = "1.2" )
250+ version .metadata_increment ()
251+ assert version .metadata == "1.3"
252+
253+ def test_version_metadata_increment_no_metadata ():
254+ version = Version (1 , 2 , 3 )
255+ with pytest .raises (ValueError ):
256+ version .metadata_increment ()
257+
258+ def test_version_is_prerelease ():
259+ version = Version (1 , 2 , 3 , "alpha" )
260+ assert version .is_prerelease () is True
261+
262+ def test_version_has_metadata ():
263+ version = Version (1 , 2 , 3 , metadata = "meta" )
264+ assert version .has_metadata () is True
265+
266+ @pytest .mark .parametrize (
267+ "major, minor, patch, prerelease, metadata" ,
268+ [
269+ ("a" , 0 , 0 , None , None ),
270+ (1 , "b" , 0 , None , None ),
271+ (1 , 0 , "c" , None , None ),
272+ ],
273+ ids = [
274+ "invalid_major" ,
275+ "invalid_minor" ,
276+ "invalid_patch" ,
277+ ]
278+ )
279+ def test_version_invalid_initialization (major , minor , patch , prerelease , metadata ):
280+ with pytest .raises (ValueError ):
281+ Version (major , minor , patch , prerelease , metadata )
282+
283+ def test_version_invalid_prerelease ():
284+ with pytest .raises (ValueError ):
285+ Version (1 , 0 , 0 , prerelease = "invalid@prerelease" )
286+
287+ def test_version_invalid_metadata ():
288+ with pytest .raises (ValueError ):
289+ Version (1 , 0 , 0 , metadata = "invalid@metadata" )
290+
291+
292+ def test_version_major_decrement ():
293+ version = Version (1 , 2 , 3 )
294+ version .major_decrement ()
295+ assert version .major == 0
296+ assert version .minor == 0
297+ assert version .patch == 0
298+
299+ def test_version_major_decrement_0 ():
300+ version = Version (0 , 0 , 0 )
301+ with pytest .raises (ValueError ):
302+ version .major_decrement ()
303+
304+ def test_version_minor_decrement ():
305+ version = Version (1 , 2 , 3 )
306+ version .minor_decrement ()
307+ assert version .major == 1
308+ assert version .minor == 1
309+ assert version .patch == 0
310+
311+ def test_version_minor_decrement_0 ():
312+ version = Version (1 , 0 , 0 )
313+ with pytest .raises (ValueError ):
314+ version .minor_decrement ()
315+
316+ def test_version_patch_decrement ():
317+ version = Version (1 , 2 , 3 )
318+ version .patch_decrement ()
319+ assert version .major == 1
320+ assert version .minor == 2
321+ assert version .patch == 2
322+
323+ def test_version_patch_decrement_0 ():
324+ version = Version (1 , 2 , 0 )
325+ with pytest .raises (ValueError ):
326+ version .patch_decrement ()
327+
328+
329+ def test_version_prerelease_decrement ():
330+ version = Version (1 , 2 , 3 , "alpha.2" )
331+ version .prerelease_decrement ()
332+ assert version .prerelease == "alpha.1"
333+
334+ def test_version_prerelease_decrement_no_subversion ():
335+ version = Version (1 , 2 , 3 , "alpha" )
336+ with pytest .raises (ValueError ):
337+ version .prerelease_decrement ()
338+
339+ def test_version_prerelease_decrement_no_prerelease ():
340+ version = Version (1 , 2 , 3 )
341+ with pytest .raises (ValueError ):
342+ version .prerelease_decrement ()
343+
344+
345+ # if __name__ == "__main__":
346+ # assert Version.from_string("1.0.0-alpha") < Version.from_string("1.0.0-alpha.1")
347+ # assert Version.from_string("1.0.0-alpha.1") < Version.from_string("1.0.0-alpha.beta")
348+ # assert Version.from_string("1.0.0-alpha.beta") < Version.from_string("1.0.0-beta")
349+ # assert Version.from_string("1.0.0-beta") < Version.from_string("1.0.0-beta.2")
350+ # assert Version.from_string("1.0.0-beta.2") < Version.from_string("1.0.0-beta.11")
351+ # assert Version.from_string("1.0.0-beta.11") < Version.from_string("1.0.0-rc.1")
352+ # assert Version.from_string("1.0.0-rc.1") < Version.from_string("1.0.0")
353+
354+ @pytest .mark .parametrize (
355+ "version1, version2" ,
356+ [
357+ (Version (1 , 0 , 0 , "alpha" ), Version (1 , 0 , 0 , "alpha.1" )),
358+ (Version (1 , 0 , 0 , "alpha.1" ), Version (1 , 0 , 0 , "alpha.beta" )),
359+ (Version (1 , 0 , 0 , "alpha.beta" ), Version (1 , 0 , 0 , "beta" )),
360+ (Version (1 , 0 , 0 , "beta" ), Version (1 , 0 , 0 , "beta.2" )),
361+ (Version (1 , 0 , 0 , "beta.2" ), Version (1 , 0 , 0 , "beta.11" )),
362+ (Version (1 , 0 , 0 , "beta.11" ), Version (1 , 0 , 0 , "rc.1" )),
363+ (Version (1 , 0 , 0 , "rc.1" ), Version (1 , 0 , 0 , "rc.2" )),
364+ (Version (1 , 0 , 0 , "rc.2" ), Version (1 , 0 , 0 )),
365+ ],
366+ ids = [
367+ "alpha < alpha.1" ,
368+ "alpha.1 < alpha.beta" ,
369+ "alpha.beta < beta" ,
370+ "beta < beta.2" ,
371+ "beta.2 < beta.11" ,
372+ "beta.11 < rc.1" ,
373+ "rc.1 < rc.2" ,
374+ "rc.2 < 1.0.0" ,
375+ ]
376+ )
377+ def test_version_semver_example (version1 , version2 ):
378+ assert version1 < version2
0 commit comments