@@ -73,6 +73,10 @@ def test_string_on_boolean_flag_is_type_mismatch(fake_client):
7373 ("resolve_integer_details" , "3" , 3 ),
7474 ("resolve_float_details" , "3.5" , 3.5 ),
7575 ("resolve_float_details" , "3" , 3.0 ),
76+ ("resolve_integer_details" , 42 , 42 ),
77+ ("resolve_integer_details" , 3.5 , 3 ),
78+ ("resolve_float_details" , 42 , 42.0 ),
79+ ("resolve_float_details" , 3.5 , 3.5 ),
7680 ],
7781)
7882def test_number_variant_parse (fake_client , resolver , variant , expected ):
@@ -100,6 +104,63 @@ def test_number_variant_parse_failure(fake_client, resolver, variant):
100104 getattr (_provider (fake_client ), resolver )("n" , 0 , EvaluationContext ("u" ))
101105
102106
107+ @pytest .mark .parametrize (
108+ "resolver" , ["resolve_integer_details" , "resolve_float_details" ]
109+ )
110+ @pytest .mark .parametrize (
111+ ("variant" , "expected" ),
112+ [("0x10" , 16 ), ("0Xff" , 255 ), (" 0xA0 " , 160 ), ("0x0" , 0 ), ("042" , 42 )],
113+ )
114+ def test_hex_number_variant (fake_client , resolver , variant , expected ):
115+ fake_client .get_feature_flag_result .return_value = make_result (variant = variant )
116+ details = getattr (_provider (fake_client ), resolver )("n" , 0 , EvaluationContext ("u" ))
117+ assert details .value == expected
118+ assert type (details .value ) is (
119+ int if resolver == "resolve_integer_details" else float
120+ )
121+ assert details .variant == variant
122+
123+
124+ @pytest .mark .parametrize (
125+ "resolver" , ["resolve_integer_details" , "resolve_float_details" ]
126+ )
127+ @pytest .mark .parametrize (
128+ "variant" , ["0x" , "0xgg" , "0x1.5" , "0x_10" , "0x1_0" , "-0x10" , "+0x10" ]
129+ )
130+ def test_invalid_hex_number_variant (fake_client , resolver , variant ):
131+ fake_client .get_feature_flag_result .return_value = make_result (variant = variant )
132+ with pytest .raises (TypeMismatchError ):
133+ getattr (_provider (fake_client ), resolver )("n" , 0 , EvaluationContext ("u" ))
134+
135+
136+ def test_hex_integer_beyond_decimal_string_limit (fake_client ):
137+ variant = "0x" + "f" * 4000
138+ fake_client .get_feature_flag_result .return_value = make_result (variant = variant )
139+ details = _provider (fake_client ).resolve_integer_details (
140+ "n" , 0 , EvaluationContext ("u" )
141+ )
142+ assert details .value == (1 << 16000 ) - 1
143+ assert details .variant == variant
144+
145+
146+ def test_large_representable_hex_float (fake_client ):
147+ variant = "0x" + "f" * 255
148+ fake_client .get_feature_flag_result .return_value = make_result (variant = variant )
149+ details = _provider (fake_client ).resolve_float_details (
150+ "n" , 0.0 , EvaluationContext ("u" )
151+ )
152+ assert details .value == float (int (variant , 16 ))
153+ assert isinstance (details .value , float )
154+
155+
156+ def test_hex_float_overflow_is_type_mismatch (fake_client ):
157+ fake_client .get_feature_flag_result .return_value = make_result (
158+ variant = "0x" + "f" * 4000
159+ )
160+ with pytest .raises (TypeMismatchError ):
161+ _provider (fake_client ).resolve_float_details ("n" , 0.0 , EvaluationContext ("u" ))
162+
163+
103164def test_object_payload (fake_client ):
104165 fake_client .get_feature_flag_result .return_value = make_result (
105166 enabled = True , variant = "v1" , payload = {"color" : "blue" }
0 commit comments