@@ -4495,7 +4495,7 @@ def test_match_properties_semver_with_prerelease(self):
44954495 self .assertFalse (match_property (prop_pre , {"version" : "1.2.2" }))
44964496
44974497 def test_match_properties_semver_edge_cases (self ):
4498- """Test semver parsing handles v-prefix, whitespace, leading zeros, and other common formats."""
4498+ """Test semver parsing handles v-prefix, whitespace, and other common formats."""
44994499 prop = self .property (key = "version" , value = "1.2.3" , operator = "semver_eq" )
45004500
45014501 # v-prefix: "v1.2.3" -> extracts "1.2.3"
@@ -4507,9 +4507,6 @@ def test_match_properties_semver_edge_cases(self):
45074507 # Trailing space: "1.2.3 " -> extracts "1.2.3"
45084508 self .assertTrue (match_property (prop , {"version" : "1.2.3 " }))
45094509
4510- # Leading zeros: "01.02.03" -> int("01")=1, int("02")=2, int("03")=3
4511- self .assertTrue (match_property (prop , {"version" : "01.02.03" }))
4512-
45134510 # Flag value with v-prefix
45144511 prop_v = self .property (key = "version" , value = "v1.2.3" , operator = "semver_eq" )
45154512 self .assertTrue (match_property (prop_v , {"version" : "1.2.3" }))
@@ -4570,6 +4567,50 @@ def test_match_properties_semver_invalid_values(self):
45704567 with self .assertRaises (InconclusiveMatchError ):
45714568 match_property (prop_bad , {"version" : "1.2.3" })
45724569
4570+ # Semver 2.0.0 §2: numeric identifiers MUST NOT include leading zeros.
4571+ @parameterized .expand (
4572+ [
4573+ ("major" , "01.2.3" ),
4574+ ("minor" , "1.02.3" ),
4575+ ("patch" , "1.2.03" ),
4576+ ("all_components" , "01.02.03" ),
4577+ ("two_digit_minor" , "1.07.3" ),
4578+ ("triple_zero_major" , "001.2.3" ),
4579+ ]
4580+ )
4581+ def test_match_properties_semver_rejects_leading_zero_override_value (
4582+ self , _name , bad_value
4583+ ):
4584+ prop = self .property (key = "version" , value = "1.2.3" , operator = "semver_eq" )
4585+ with self .assertRaises (InconclusiveMatchError ):
4586+ match_property (prop , {"version" : bad_value })
4587+
4588+ @parameterized .expand (
4589+ [
4590+ ("zero_major" , "0.1.0" ),
4591+ ("zero_patch" , "1.0.0" ),
4592+ ("all_zero" , "0.0.0" ),
4593+ ]
4594+ )
4595+ def test_match_properties_semver_literal_zero_components_match (self , _name , value ):
4596+ prop = self .property (key = "version" , value = value , operator = "semver_eq" )
4597+ self .assertTrue (match_property (prop , {"version" : value }))
4598+
4599+ @parameterized .expand (
4600+ [
4601+ ("semver_gt" , "01.2.3" ),
4602+ ("semver_caret" , "1.07.0" ),
4603+ ("semver_tilde" , "1.07.0" ),
4604+ ("semver_wildcard" , "01.*" ),
4605+ ]
4606+ )
4607+ def test_match_properties_semver_rejects_leading_zero_flag_value (
4608+ self , operator , flag_value
4609+ ):
4610+ prop = self .property (key = "version" , value = flag_value , operator = operator )
4611+ with self .assertRaises (InconclusiveMatchError ):
4612+ match_property (prop , {"version" : "1.2.0" })
4613+
45734614 def test_unknown_operator (self ):
45744615 property_a = self .property (key = "key" , value = "2022-05-01" , operator = "is_unknown" )
45754616 with self .assertRaises (InconclusiveMatchError ) as exception_context :
0 commit comments