mirror of
https://github.com/gsi-upm/soil
synced 2024-11-14 15:32:29 +00:00
a1262edd2a
Treating time and conditions as the same entity was getting confusing, and it added a lot of unnecessary abstraction in a critical part (the scheduler). The scheduling queue now has the time as a floating number (faster), the agent id (for ties) and the condition, as well as the agent. The first three elements (time, id, condition) can be considered as the "key" for the event. To allow for agent execution to be "randomized" within every step, a new parameter has been added to the scheduler, which makes it add a random number to the key in order to change the ordering. `EventedAgent.received` now checks the messages before returning control to the user by default.
58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
from unittest import TestCase
|
|
import os
|
|
from os.path import join
|
|
|
|
from soil import serialization, simulation, config
|
|
|
|
ROOT = os.path.abspath(os.path.dirname(__file__))
|
|
EXAMPLES = join(ROOT, "..", "examples")
|
|
|
|
FORCE_TESTS = os.environ.get("FORCE_TESTS", "")
|
|
|
|
|
|
class TestExamples(TestCase):
|
|
pass
|
|
|
|
|
|
def make_example_test(path, cfg):
|
|
def wrapped(self):
|
|
root = os.getcwd()
|
|
for s in simulation.iter_from_config(cfg):
|
|
iterations = s.max_steps * s.num_trials
|
|
if iterations < 0 or iterations > 1000:
|
|
s.max_steps = 100
|
|
s.num_trials = 1
|
|
assert isinstance(cfg, config.Config)
|
|
if getattr(cfg, "skip_test", False) and not FORCE_TESTS:
|
|
self.skipTest("Example ignored.")
|
|
envs = s.run_simulation(dry_run=True)
|
|
assert envs
|
|
for env in envs:
|
|
assert env
|
|
try:
|
|
n = cfg.model_params["network_params"]["n"]
|
|
assert len(list(env.network_agents)) == n
|
|
except KeyError:
|
|
pass
|
|
assert env.schedule.steps > 0 # It has run
|
|
assert env.schedule.steps <= s.max_steps # But not further than allowed
|
|
|
|
return wrapped
|
|
|
|
|
|
def add_example_tests():
|
|
for cfg, path in serialization.load_files(
|
|
join(EXAMPLES, "**", "*.yml"),
|
|
):
|
|
if 'soil_output' in path:
|
|
continue
|
|
p = make_example_test(path=path, cfg=config.Config.from_raw(cfg))
|
|
fname = os.path.basename(path)
|
|
p.__name__ = "test_example_file_%s" % fname
|
|
p.__doc__ = "%s should be a valid configuration" % fname
|
|
setattr(TestExamples, p.__name__, p)
|
|
del p
|
|
|
|
|
|
add_example_tests()
|