@@ -402,3 +402,90 @@ def test_setters_invalid_values():
402402 v .prerelease = "invalid@prerelease"
403403 with pytest .raises (ValueError ):
404404 v .metadata = "invalid@meta"
405+
406+
407+ @pytest .mark .parametrize (
408+ "input_str,expected_major,expected_minor,expected_patch,expected_prerelease, expected_metadata" ,
409+ [
410+ # Happy path
411+ ("1.2.3.4" , 1 , 2 , 3 , "4" , None ),
412+ ("12.0.456.7" , 12 , 0 , 456 , "7" , None ),
413+ ("0.0.0.0" , 0 , 0 , 0 , "0" , None ),
414+ ("999.888.777.666" , 999 , 888 , 777 , "666" , None ),
415+ ("10.20.30.alpha" , 10 , 20 , 30 , "alpha" , None ),
416+ ("1.2.3.4+patch" , 1 , 2 , 3 , "4" , "patch" ),
417+
418+ ("1.2.3.4.5" , 1 , 2 , 3 , "4.5" , None ),
419+ ("1.2.3.4.5.6" , 1 , 2 , 3 , "4.5.6" , None ),
420+ ],
421+ ids = [
422+ "simple-numeric" ,
423+ "zero-minor" ,
424+ "all-zeros" ,
425+ "large-numbers" ,
426+ "prerelease-string" ,
427+ "simple-numeric-metadata" ,
428+
429+ "too-many-parts" ,
430+ "way-too-many-parts" ,
431+ ]
432+ )
433+ def test_from_4_digits_happy_path (input_str , expected_major , expected_minor , expected_patch , expected_prerelease , expected_metadata ):
434+
435+ # Act
436+ result = Version .from_4_digits (input_str )
437+
438+ # Assert
439+ assert isinstance (result , Version )
440+ assert result .major == expected_major
441+ assert result .minor == expected_minor
442+ assert result .patch == expected_patch
443+ assert result .prerelease == expected_prerelease
444+ assert result .metadata == expected_metadata
445+
446+
447+ @pytest .mark .parametrize (
448+ "input_str" ,
449+ [
450+ "1.2.3" , # Too few parts
451+ "1.2" , # Way too few
452+ "" , # Empty string
453+ "1.2.3." ,
454+ ".2.3.4" ,
455+ "1..3.4" ,
456+ "1.2..4" ,
457+ ],
458+ ids = [
459+ "too-few-parts" ,
460+ "way-too-few" ,
461+ "empty-string" ,
462+ "trailing-dot-empty-prerelease" ,
463+ "leading-dot-empty-major" ,
464+ "empty-minor" ,
465+ "empty-patch" ,
466+ ]
467+ )
468+ def test_from_4_digits_invalid_parts_count (input_str ):
469+
470+ # Act & Assert
471+ with pytest .raises (ValueError ) as excinfo :
472+ print (Version .from_4_digits (input_str ))
473+ assert f"Invalid version string: { input_str } " in str (excinfo .value )
474+
475+
476+ # test Version.from_string with 4 digits
477+ def test_from_string_4_digits ():
478+ version = Version .from_string ("1.2.3.4" )
479+ assert version .major == 1
480+ assert version .minor == 2
481+ assert version .patch == 3
482+ assert version .prerelease == "4"
483+ assert version .metadata is None
484+
485+ def test_from_string_4_digits_with_metadata ():
486+ version = Version .from_string ("1.2.3.4+build.1" )
487+ assert version .major == 1
488+ assert version .minor == 2
489+ assert version .patch == 3
490+ assert version .prerelease == "4"
491+ assert version .metadata == "build.1"
0 commit comments