Skip to content

Commit fcf38db

Browse files
authored
Merge pull request #37 from mariuzka/dev
Dev
2 parents 616ef77 + 5255625 commit fcf38db

6 files changed

Lines changed: 178 additions & 10 deletions

File tree

examples/schelling.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
space = mesar.GridSpacePlot(artists=agents)
1313

1414
# line plot
15-
happy_plot = mesar.ModelHistoryPlot(model_attributes=["happy"], labels=["Happy agents"], ylim=[0, None])
15+
happy_plot = mesar.ModelHistoryPlot(
16+
model_attributes=["happy"], labels=["Happy agents"], ylim=[0, None]
17+
)
1618

1719
# value display
1820
happy_value = mesar.ValueDisplay(model_attribute="happy", label="Happy agents")

src/mesarcade/history_plot.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ def __init__(
6666
self.title = title
6767
self.from_datacollector = from_datacollector
6868
self.colors = None
69-
69+
7070
self.padding = 10
71-
71+
7272
self.validate_input()
7373

7474
if colors is not None:
@@ -153,7 +153,9 @@ def create_plot_area(self):
153153

154154
def create_axis_ticks(self):
155155
min_y_tick_y_pos = self.plot_area_y + self.padding
156-
mid_y_tick_y_pos = self.plot_area_y + self.padding + (self.plot_area_height - self.padding * 2) / 2
156+
mid_y_tick_y_pos = (
157+
self.plot_area_y + self.padding + (self.plot_area_height - self.padding * 2) / 2
158+
)
157159
max_y_tick_y_pos = self.plot_area_y + self.plot_area_height - self.padding
158160

159161
self.min_y_label = arcade.Text(
@@ -191,10 +193,8 @@ def create_axis_ticks(self):
191193
width=3,
192194
height=3,
193195
color=arcade.color.BLACK,
194-
))
195-
196-
197-
196+
)
197+
)
198198

199199
def create_legend(self):
200200
label_x = self.figure.x + self.width * 0.1
@@ -306,7 +306,7 @@ def update(self):
306306
self.min_y_label.x = (
307307
self.plot_area_x - (len(str_min_y_label) + 2) * self.font_size / 1.5
308308
)
309-
309+
310310
# update medium y_label
311311
str_mid_y_label = str(round((self.min_y + self.max_y) / 2, 3))
312312
if self.mid_y_label.text != str_mid_y_label:

src/mesarcade/renderer.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ def setup_value_displays(self) -> None:
187187
value_display.setup(i=i + 3, renderer=self)
188188

189189
def add_default_buttons(self):
190-
DefaultButtons(renderer=self).add_to_anchor()
190+
self.default_buttons = DefaultButtons(renderer=self)
191+
self.default_buttons.add_to_anchor()
191192

192193
def add_rendering_step_buttons(self):
193194
self.rendering_step_buttons = NumController(

tests/test_gui.py renamed to tests/test_gui/test_complete_simulations.py

File renamed without changes.
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from mesa.examples.basic.schelling.model import Schelling
2+
import mesarcade as mesar
3+
4+
5+
def test_play_button():
6+
canvas = mesar.Canvas(
7+
model_class=Schelling,
8+
_visible=False,
9+
)
10+
canvas._setup()
11+
12+
for _ in range(10):
13+
canvas.renderer.on_update(None)
14+
15+
assert canvas.renderer.play == False
16+
assert canvas.renderer.tick == 0
17+
18+
canvas.renderer.default_buttons.play_button.on_click(None)
19+
20+
for _ in range(10):
21+
canvas.renderer.on_update(None)
22+
23+
assert canvas.renderer.play == True
24+
assert canvas.renderer.tick == 10
25+
26+
canvas.renderer.default_buttons.play_button.on_click(None)
27+
28+
assert canvas.renderer.play == False
29+
assert canvas.renderer.tick == 10
30+
31+
canvas.window.close()
32+
33+
34+
def test_reset_button():
35+
canvas = mesar.Canvas(
36+
model_class=Schelling,
37+
_visible=False,
38+
)
39+
canvas._setup()
40+
canvas.renderer.play = True
41+
42+
assert canvas.renderer.tick == 0
43+
44+
for _ in range(10):
45+
canvas.renderer.on_update(None)
46+
47+
assert canvas.renderer.tick == 10
48+
49+
canvas.renderer.default_buttons.reset_button.on_click(None)
50+
51+
assert canvas.renderer.tick == 0
52+
53+
canvas.window.close()
54+
55+
56+
def test_step_button():
57+
canvas = mesar.Canvas(
58+
model_class=Schelling,
59+
_visible=False,
60+
)
61+
canvas._setup()
62+
63+
assert canvas.renderer.tick == 0
64+
65+
for _ in range(15):
66+
canvas.renderer.default_buttons.step_button.on_click(None)
67+
68+
assert canvas.renderer.tick == 15
69+
70+
canvas.window.close()
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
from mesa.examples.basic.boid_flockers.model import BoidFlockers
2+
import mesarcade as mesar
3+
from dataclasses import dataclass
4+
5+
6+
@dataclass
7+
class Event:
8+
new_value: float
9+
10+
11+
def create_canvas():
12+
population_size_controller = mesar.NumController(
13+
"population_size",
14+
100,
15+
25,
16+
1000,
17+
25,
18+
"n birds",
19+
)
20+
canvas = mesar.Canvas(
21+
model_class=BoidFlockers,
22+
controllers=[population_size_controller],
23+
_visible=False,
24+
)
25+
canvas._setup()
26+
return canvas
27+
28+
29+
def test_num_controller_buttons():
30+
canvas = create_canvas()
31+
32+
controller = canvas.renderer.controllers[0]
33+
34+
# test basic setup
35+
assert controller.parameter_name == "population_size"
36+
assert controller.label == "n birds"
37+
assert controller.parameter_value == 100
38+
39+
# test increase
40+
controller.buttons.increase_button.on_click(None)
41+
assert controller.parameter_value == 125
42+
assert canvas.renderer.parameter_dict["population_size"] == 125
43+
44+
# test decrease
45+
controller.buttons.decrease_button.on_click(None)
46+
assert controller.parameter_value == 100
47+
assert canvas.renderer.parameter_dict["population_size"] == 100
48+
49+
# test maximum
50+
for _ in range(500):
51+
controller.buttons.increase_button.on_click(None)
52+
53+
assert controller.parameter_value == 1000
54+
assert canvas.renderer.parameter_dict["population_size"] == 1000
55+
56+
# test minimum
57+
for _ in range(500):
58+
controller.buttons.decrease_button.on_click(None)
59+
60+
assert controller.parameter_value == 25
61+
assert canvas.renderer.parameter_dict["population_size"] == 25
62+
63+
canvas.window.close()
64+
65+
66+
def test_num_controller_slider():
67+
canvas = create_canvas()
68+
69+
controller = canvas.renderer.controllers[0]
70+
71+
assert controller.parameter_value == 100
72+
73+
controller.buttons.slider.on_change(Event(new_value=200))
74+
75+
assert controller.parameter_value == 200
76+
77+
canvas.window.close()
78+
79+
80+
def test_increase_and_reset():
81+
canvas = create_canvas()
82+
83+
controller = canvas.renderer.controllers[0]
84+
85+
assert len(canvas.renderer.model.agents) == 100
86+
87+
# increase by 25
88+
controller.buttons.increase_button.on_click(None)
89+
90+
# restart model
91+
canvas.renderer.default_buttons.reset_button.on_click(None)
92+
93+
assert len(canvas.renderer.model.agents) == 125
94+
95+
canvas.window.close()

0 commit comments

Comments
 (0)