22import pytest
33import numpy as np
44
5- from policyengine .utils .reforms import ParameterChangeDict , ParametricReform
5+ from policyengine .utils .reforms import (
6+ ParameterChangeDict ,
7+ ParametricReform ,
8+ ParameterChangeValue ,
9+ ParameterChangePeriod ,
10+ )
611
712
813class TestParameterChangeDict :
@@ -12,41 +17,82 @@ def test_schema__given_float_inputs__returns_valid_dict(self):
1217 "2024-01-01.2024-12-31" : 0.2 ,
1318 }
1419
20+ expected_output_data = {
21+ ParameterChangePeriod (
22+ root = "2023-01-01.2023-12-31"
23+ ): ParameterChangeValue (root = 0.1 ),
24+ ParameterChangePeriod (
25+ root = "2024-01-01.2024-12-31"
26+ ): ParameterChangeValue (root = 0.2 ),
27+ }
28+
1529 result = ParameterChangeDict (root = input_data )
1630
1731 assert isinstance (result , ParameterChangeDict )
18- assert result .root == input_data
32+ assert result .root == expected_output_data
1933
2034 def test_schema__given_string_inputs__returns_valid_dict (self ):
2135 input_data = {
2236 "2023-01-01.2023-12-31" : "0.1" ,
2337 "2024-01-01.2024-12-31" : "0.2" ,
2438 }
2539
40+ expected_output_data = {
41+ ParameterChangePeriod (
42+ root = "2023-01-01.2023-12-31"
43+ ): ParameterChangeValue (root = "0.1" ),
44+ ParameterChangePeriod (
45+ root = "2024-01-01.2024-12-31"
46+ ): ParameterChangeValue (root = "0.2" ),
47+ }
48+
2649 result = ParameterChangeDict (root = input_data )
2750
2851 assert isinstance (result , ParameterChangeDict )
29- assert result .root == input_data
52+ assert result .root == expected_output_data
3053
3154 def test_schema__given_infinity_string__returns_valid_dict (self ):
3255 input_data = {
3356 "2023-01-01.2023-12-31" : "Infinity" ,
3457 "2024-01-01.2024-12-31" : "-Infinity" ,
3558 }
3659
60+ expected_output_data = {
61+ ParameterChangePeriod (
62+ root = "2023-01-01.2023-12-31"
63+ ): ParameterChangeValue (root = np .inf ),
64+ ParameterChangePeriod (
65+ root = "2024-01-01.2024-12-31"
66+ ): ParameterChangeValue (root = - np .inf ),
67+ }
68+
3769 result = ParameterChangeDict (root = input_data )
3870
3971 assert isinstance (result , ParameterChangeDict )
40- assert result .root == {
41- "2023-01-01.2023-12-31" : np .inf ,
42- "2024-01-01.2024-12-31" : - np .inf ,
72+ assert result .root == expected_output_data
73+
74+ def test_schema__given_yearly_input__returns_valid_dict (self ):
75+ input_data = {
76+ "2023" : 0.1 ,
77+ "2024" : 0.2 ,
78+ }
79+
80+ expected_output_data = {
81+ ParameterChangePeriod (root = "2023" ): ParameterChangeValue (root = 0.1 ),
82+ ParameterChangePeriod (root = "2024" ): ParameterChangeValue (root = 0.2 ),
4383 }
4484
85+ result = ParameterChangeDict (root = input_data )
86+
87+ assert isinstance (result , ParameterChangeDict )
88+ assert result .root == expected_output_data
89+
4590 def test_schema__given_invalid_date_format__raises_validation_error (self ):
4691 input_data = {"2023-01-01.2023-12-31" : 0.1 , "invalid_date_format" : 0.2 }
4792
4893 with pytest .raises (
49- ValidationError , match = "Invalid date format in key"
94+ ValidationError ,
95+ match = r"validation errors? for ParameterChangeDict" ,
5096 ):
5197 ParameterChangeDict (root = input_data )
5298
@@ -59,8 +105,93 @@ def test_schema__given_invalid_key_type__raises_validation_error(self):
59105 ParameterChangeDict (root = input_data )
60106
61107
108+ class TestParameterChangePeriod :
109+ def test_schema__given_valid_year__returns_valid_period (self ):
110+ input_data = "2023"
111+
112+ result = ParameterChangePeriod (root = input_data )
113+
114+ assert isinstance (result , ParameterChangePeriod )
115+ assert result .root == input_data
116+
117+ def test_schema__given_valid_date_range__returns_valid_period (self ):
118+ input_data = "2023-01-01.2023-12-31"
119+
120+ result = ParameterChangePeriod (root = input_data )
121+
122+ assert isinstance (result , ParameterChangePeriod )
123+ assert result .root == input_data
124+
125+ def test_schema__given_invalid_date_format__raises_validation_error (self ):
126+ input_data = "2023.01.01-2024.12.31"
127+
128+ with pytest .raises (
129+ ValidationError ,
130+ match = r"validation errors? for ParameterChangePeriod" ,
131+ ):
132+ ParameterChangePeriod (root = input_data )
133+
134+
135+ class TestParameterChangeValue :
136+ def test_schema__given_float_input__returns_valid_value (self ):
137+ input_data = 0.1
138+
139+ result = ParameterChangeValue (root = input_data )
140+
141+ assert isinstance (result , ParameterChangeValue )
142+ assert result .root == input_data
143+
144+ def test_schema__given_string_input__returns_valid_value (self ):
145+ input_data = "0.1"
146+
147+ result = ParameterChangeValue (root = input_data )
148+
149+ assert isinstance (result , ParameterChangeValue )
150+ assert result .root == input_data
151+
152+ def test_schema__given_bool_input__returns_valid_value (self ):
153+ input_data = True
154+
155+ result = ParameterChangeValue (root = input_data )
156+
157+ assert isinstance (result , ParameterChangeValue )
158+ assert result .root == input_data
159+
160+ def test_schema__given_infinity_string__returns_valid_value (self ):
161+ input_data = "Infinity"
162+
163+ result = ParameterChangeValue (root = input_data )
164+
165+ assert isinstance (result , ParameterChangeValue )
166+ assert result .root == float ("inf" )
167+
168+ def test_schema__given_negative_infinity_string__returns_valid_value (self ):
169+ input_data = "-Infinity"
170+
171+ result = ParameterChangeValue (root = input_data )
172+
173+ assert isinstance (result , ParameterChangeValue )
174+ assert result .root == float ("-inf" )
175+
176+ def test_schema__given_invalid_type__raises_validation_error (self ):
177+ input_data = [0.1 , 0.2 ]
178+
179+ with pytest .raises (
180+ ValidationError , match = "validation error for ParameterChangeValue"
181+ ):
182+ ParameterChangeValue (root = input_data )
183+
184+ def test_schema__given_dict_input__raises_validation_error (self ):
185+ input_data = {"key" : "value" }
186+
187+ with pytest .raises (
188+ ValidationError , match = "validation error for ParameterChangeValue"
189+ ):
190+ ParameterChangeValue (root = input_data )
191+
192+
62193class TestParametricReform :
63- def test_schema__given_valid_dict__returns_valid_reform (self ):
194+ def test_schema__given_full_date_dict__returns_valid_reform (self ):
64195 input_data = {
65196 "parameter1" : {
66197 "2023-01-01.2023-12-31" : 0.1 ,
@@ -92,6 +223,62 @@ def test_schema__given_valid_dict__returns_valid_reform(self):
92223 assert isinstance (result , ParametricReform )
93224 assert result .root == expected_output_data
94225
226+ def test_schema__given_yearly_dict__returns_valid_reform (self ):
227+ input_data = {
228+ "parameter1" : {"2023" : 0.1 , "2024" : 0.2 },
229+ "parameter2" : {"2023" : 0.3 , "2024" : 0.4 },
230+ }
231+
232+ expected_output_data = {
233+ "parameter1" : ParameterChangeDict (root = {"2023" : 0.1 , "2024" : 0.2 }),
234+ "parameter2" : ParameterChangeDict (root = {"2023" : 0.3 , "2024" : 0.4 }),
235+ }
236+
237+ result = ParametricReform (root = input_data )
238+
239+ assert isinstance (result , ParametricReform )
240+ assert result .root == expected_output_data
241+
242+ def test_schema__given_single_value_dict__returns_valid_reform (self ):
243+ input_data = {
244+ "parameter1" : 0.1 ,
245+ "parameter2" : 0.2 ,
246+ }
247+
248+ expected_output_data = {
249+ "parameter1" : ParameterChangeValue (root = 0.1 ),
250+ "parameter2" : ParameterChangeValue (root = 0.2 ),
251+ }
252+
253+ result = ParametricReform (root = input_data )
254+
255+ assert isinstance (result , ParametricReform )
256+ assert result .root == expected_output_data
257+
258+ def test_schema__given_mixed_dict__returns_valid_reform (self ):
259+ input_data = {
260+ "parameter1" : {
261+ "2023-01-01.2023-12-31" : 0.1 ,
262+ "2024-01-01.2024-12-31" : 0.2 ,
263+ },
264+ "parameter2" : 0.3 ,
265+ }
266+
267+ expected_output_data = {
268+ "parameter1" : ParameterChangeDict (
269+ root = {
270+ "2023-01-01.2023-12-31" : 0.1 ,
271+ "2024-01-01.2024-12-31" : 0.2 ,
272+ }
273+ ),
274+ "parameter2" : ParameterChangeValue (root = 0.3 ),
275+ }
276+
277+ result = ParametricReform (root = input_data )
278+
279+ assert isinstance (result , ParametricReform )
280+ assert result .root == expected_output_data
281+
95282 def test_schema__given_invalid_key_type__raises_validation_error (self ):
96283 input_data = {
97284 123 : {"2023-01-01.2023-12-31" : 0.1 , "2024-01-01.2024-12-31" : 0.2 },
@@ -105,11 +292,3 @@ def test_schema__given_invalid_key_type__raises_validation_error(self):
105292 ValidationError , match = r"validation errors? for ParametricReform"
106293 ):
107294 ParametricReform (root = input_data )
108-
109- def test_schema__given_dateless_structure__raises_validation_error (self ):
110- input_data = {"parameter1" : 0.1 , "parameter2" : 0.2 }
111-
112- with pytest .raises (
113- ValidationError , match = r"validation errors? for ParametricReform"
114- ):
115- ParametricReform (root = input_data )
0 commit comments