@@ -32,20 +32,35 @@ def write_final_values(self):
32
32
self .model .datacollector .add_table_row ("Final_Values" , row )
33
33
34
34
35
+ class DifferentMockAgent (MockAgent ):
36
+ # We define a different MockAgent to test for attributes that are present
37
+ # only in 1 type of agent, but not the other.
38
+ def __init__ (self , unique_id , model , val = 0 ):
39
+ super ().__init__ (unique_id , model , val = val )
40
+ self .val3 = val + 42
41
+
42
+
35
43
class MockModel (Model ):
36
44
"""
37
45
Minimalistic model for testing purposes.
38
46
"""
39
47
40
48
schedule = BaseScheduler (None )
41
49
42
- def __init__ (self ):
50
+ def __init__ (self , test_exclude_none_values = False ):
43
51
self .schedule = BaseScheduler (self )
44
52
self .model_val = 100
45
53
46
- for i in range (10 ):
47
- a = MockAgent (i , self , val = i )
48
- self .schedule .add (a )
54
+ self .n = 10
55
+ for i in range (self .n ):
56
+ self .schedule .add (MockAgent (i , self , val = i ))
57
+ if test_exclude_none_values :
58
+ self .schedule .add (DifferentMockAgent (self .n + i , self , val = i ))
59
+ if test_exclude_none_values :
60
+ # Only DifferentMockAgent has val3.
61
+ agent_reporters = {"value" : lambda a : a .val , "value3" : "val3" }
62
+ else :
63
+ agent_reporters = {"value" : lambda a : a .val , "value2" : "val2" }
49
64
self .initialize_data_collector (
50
65
{
51
66
"total_agents" : lambda m : m .schedule .get_agent_count (),
@@ -54,8 +69,9 @@ def __init__(self):
54
69
"model_calc_comp" : [self .test_model_calc_comp , [3 , 4 ]],
55
70
"model_calc_fail" : [self .test_model_calc_comp , [12 , 0 ]],
56
71
},
57
- { "value" : lambda a : a . val , "value2" : "val2" } ,
72
+ agent_reporters ,
58
73
{"Final_Values" : ["agent_id" , "final_value" ]},
74
+ exclude_none_values = test_exclude_none_values ,
59
75
)
60
76
61
77
def test_model_calc_comp (self , input1 , input2 ):
@@ -195,5 +211,44 @@ def test_initialize_before_agents_added_to_scheduler(self):
195
211
)
196
212
197
213
214
+ class TestDataCollectorExcludeNone (unittest .TestCase ):
215
+ def setUp (self ):
216
+ """
217
+ Create the model and run it a set number of steps.
218
+ """
219
+ self .model = MockModel (test_exclude_none_values = True )
220
+ for i in range (7 ):
221
+ if i == 4 :
222
+ self .model .schedule .remove (self .model .schedule ._agents [3 ])
223
+ self .model .step ()
224
+
225
+ def test_agent_records (self ):
226
+ """
227
+ Test agent-level variable collection.
228
+ """
229
+ data_collector = self .model .datacollector
230
+ agent_table = data_collector .get_agent_vars_dataframe ()
231
+
232
+ assert len (data_collector ._agent_records ) == 8
233
+ for step , records in data_collector ._agent_records .items ():
234
+ if step < 5 :
235
+ assert len (records ) == 20
236
+ else :
237
+ assert len (records ) == 19
238
+
239
+ for values in records :
240
+ agent_id = values [1 ]
241
+ if agent_id < self .model .n :
242
+ assert len (values ) == 3
243
+ else :
244
+ # Agents with agent_id >= self.model.n are
245
+ # DifferentMockAgent, which additionally contains val3.
246
+ assert len (values ) == 4
247
+
248
+ assert "value" in list (agent_table .columns )
249
+ assert "value2" not in list (agent_table .columns )
250
+ assert "value3" in list (agent_table .columns )
251
+
252
+
198
253
if __name__ == "__main__" :
199
254
unittest .main ()
0 commit comments