11import pytest
2+ from random import randint
23from io import StringIO
34from snowfakery import generate_data
5+ from snowfakery .data_gen_exceptions import DataGenError
46
57REPS = 1
68
79
8- @pytest .mark .parametrize ("_ " , range (REPS ))
10+ @pytest .mark .parametrize ("seed " , [ randint ( 0 , 2 ** 32 ) for r in range (REPS )] )
911class TestSummation :
10- def test_example (self , generated_rows , _ ):
11- generate_data ("examples/math_partition_simple.recipe.yml" )
12+ def test_example (self , generated_rows , seed ):
13+ generate_data ("examples/math_partition_simple.recipe.yml" , seed = seed )
1214 parents = generated_rows .table_values ("ParentObject__c" )
1315 children = generated_rows .table_values ("ChildObject__c" )
1416 assert sum (p ["TotalAmount__c" ] for p in parents ) == sum (
1517 c ["Amount__c" ] for c in children
1618 ), (parents , children )
1719
18- def test_example_pennies (self , generated_rows , _ ):
19- generate_data ("examples/sum_pennies.yml" )
20+ def test_example_pennies (self , generated_rows , seed ):
21+ generate_data ("examples/sum_pennies.yml" , seed = seed )
2022 objs = generated_rows .table_values ("Values" )
2123 assert round (sum (p ["Amount" ] for p in objs )) == 100 , sum (
2224 p ["Amount" ] for p in objs
2325 )
2426
2527 @pytest .mark .parametrize ("step" , [0.01 , 0.5 , 0.1 , 0.20 , 0.25 , 0.50 ])
26- def test_example_pennies_param (self , generated_rows , _ , step : int ):
27- generate_data ("examples/sum_pennies_param.yml" , user_options = {"step" : step })
28+ def test_example_pennies_param (self , generated_rows , seed , step : int ):
29+ generate_data (
30+ "examples/sum_pennies_param.yml" , user_options = {"step" : step }, seed = 1
31+ )
2832 objs = generated_rows .table_values ("Values" )
2933 assert round (sum (p ["Amount" ] for p in objs )) == 100 , sum (
3034 p ["Amount" ] for p in objs
3135 )
3236
33- def test_step (self , generated_rows , _ ):
37+ def test_step (self , generated_rows , seed ):
3438 yaml = """
3539 - plugin: snowfakery.standard_plugins.Math
3640 - object: Obj
@@ -43,14 +47,14 @@ def test_step(self, generated_rows, _):
4347 fields:
4448 Amount: ${{child_value}}
4549 """
46- generate_data (StringIO (yaml ))
50+ generate_data (StringIO (yaml ), seed = seed )
4751 values = generated_rows .table_values ("Obj" )
4852 assert 1 <= len (values ) <= 6
4953 amounts = [r ["Amount" ] for r in values ]
5054 assert sum (amounts ) == 60 , amounts
5155 assert sum ([r % 10 for r in amounts ]) == 0 , amounts
5256
53- def test_min (self , generated_rows , _ ):
57+ def test_min (self , generated_rows , seed ):
5458 yaml = """
5559 - plugin: snowfakery.standard_plugins.Math
5660 - object: Obj
@@ -63,13 +67,13 @@ def test_min(self, generated_rows, _):
6367 fields:
6468 Amount: ${{child_value}}
6569 """
66- generate_data (StringIO (yaml ))
70+ generate_data (StringIO (yaml ), seed = seed )
6771 values = generated_rows .table_values ("Obj" )
6872 results = [r ["Amount" ] for r in values ]
6973 assert sum (results ) == 60 , results
7074 assert not [r for r in results if r < 5 ], results
7175
72- def test_min_not_factor_of_total (self , generated_rows , _ ):
76+ def test_min_not_factor_of_total (self , generated_rows , seed ):
7377 yaml = """
7478 - plugin: snowfakery.standard_plugins.Math
7579 - object: Obj
@@ -82,13 +86,13 @@ def test_min_not_factor_of_total(self, generated_rows, _):
8286 fields:
8387 Amount: ${{child_value}}
8488 """
85- generate_data (StringIO (yaml ))
89+ generate_data (StringIO (yaml ), seed = seed )
8690 values = generated_rows .table_values ("Obj" )
8791 results = [r ["Amount" ] for r in values ]
8892 assert sum (results ) == 63
8993 assert not [r for r in results if r < 5 ], results
9094
91- def test_step_not_factor_of_total (self , generated_rows , _ ):
95+ def test_step_not_factor_of_total (self , generated_rows , seed ):
9296 yaml = """
9397 - plugin: snowfakery.standard_plugins.Math
9498 - object: Obj
@@ -101,13 +105,13 @@ def test_step_not_factor_of_total(self, generated_rows, _):
101105 fields:
102106 Amount: ${{child_value}}
103107 """
104- generate_data (StringIO (yaml ))
108+ generate_data (StringIO (yaml ), seed = seed )
105109 values = generated_rows .table_values ("Obj" )
106110 results = [r ["Amount" ] for r in values ]
107111 assert sum (results ) == 63 , results
108112 assert len ([r for r in results if r < 5 ]) <= 1 , results
109113
110- def test_max (self , generated_rows , _ ):
114+ def test_max (self , generated_rows , seed ):
111115 yaml = """
112116 - plugin: snowfakery.standard_plugins.Math
113117 - object: Obj
@@ -121,9 +125,25 @@ def test_max(self, generated_rows, _):
121125 fields:
122126 Amount: ${{child_value}}
123127 """
124- generate_data (StringIO (yaml ))
128+ generate_data (StringIO (yaml ), seed = seed )
125129 values = generated_rows .table_values ("Obj" )
126130 results = [r ["Amount" ] for r in values ]
127131 assert sum (results ) == 28 , results
128132 assert not [r for r in results if r % 2 ], results
129133 assert not [r for r in results if r > 6 ], results
134+
135+ def test_bad_step (self , generated_rows , seed ):
136+ yaml = """
137+ - plugin: snowfakery.standard_plugins.Math
138+ - object: Obj
139+ for_each:
140+ var: child_value
141+ value:
142+ Math.random_partition:
143+ total: 28
144+ step: 0.3
145+ fields:
146+ Amount: ${{child_value}}
147+ """
148+ with pytest .raises (DataGenError , match = "step.*0.3" ):
149+ generate_data (StringIO (yaml ), seed = seed )
0 commit comments