Skip to content

Commit 33c04d4

Browse files
committed
add "may_trigger" decorator and tests
1 parent 2fee317 commit 33c04d4

File tree

5 files changed

+65
-9
lines changed

5 files changed

+65
-9
lines changed

tests/test_async.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -464,8 +464,11 @@ def test_may_transition_with_auto_transitions(self):
464464

465465
async def run():
466466
assert await d.may_to_A()
467+
assert await d.may_trigger("to_A")
467468
assert await d.may_to_B()
469+
assert await d.may_trigger("to_B")
468470
assert await d.may_to_C()
471+
assert await d.may_trigger("to_C")
469472

470473
asyncio.run(run())
471474

@@ -478,12 +481,18 @@ def test_machine_may_transitions(self):
478481

479482
async def run():
480483
assert not await m.may_walk()
484+
assert not await m.may_trigger("walk")
481485
assert not await m.may_stop()
486+
assert not await m.may_trigger("stop")
482487
assert await m.may_run()
488+
assert await m.may_trigger("run")
483489
await m.run()
484490
assert not await m.may_run()
491+
assert not await m.may_trigger("run")
485492
assert not await m.may_stop()
493+
assert not await m.may_trigger("stop")
486494
assert not await m.may_walk()
495+
assert not await m.may_trigger("walk")
487496

488497
asyncio.run(run())
489498

@@ -495,6 +504,7 @@ def test_may_transition_with_invalid_state(self):
495504

496505
async def run():
497506
assert not await d.may_walk()
507+
assert not await d.may_trigger("walk")
498508

499509
asyncio.run(run())
500510

@@ -506,10 +516,14 @@ def test_may_transition_internal(self):
506516

507517
async def run():
508518
assert await d.may_go()
519+
assert await d.may_trigger("go")
509520
assert not await d.may_wait()
521+
assert not await d.may_trigger("wait")
510522
await d.go()
511523
assert not await d.may_go()
524+
assert not await d.may_trigger("go")
512525
assert await d.may_wait()
526+
assert await d.may_trigger("wait")
513527

514528
asyncio.run(run())
515529

@@ -529,17 +543,23 @@ def process_exception(event_data):
529543
async def run():
530544
with self.assertRaises(RuntimeError):
531545
await stuff.may_raises()
546+
with self.assertRaises(RuntimeError):
547+
await stuff.may_trigger("raises")
532548
assert stuff.is_A()
533549
assert await stuff.may_works()
550+
assert await stuff.may_trigger("works")
534551
assert await stuff.works()
535552
with self.assertRaises(ValueError):
536553
await stuff.may_raises()
554+
with self.assertRaises(ValueError):
555+
await stuff.may_trigger("raises")
537556
assert stuff.is_B()
538557
stuff.machine.on_exception.append(process_exception)
539558
assert not await stuff.may_raises()
559+
assert not await stuff.may_trigger("raises")
540560
assert await stuff.to_A()
541561
assert not await stuff.may_raises()
542-
562+
assert not await stuff.may_trigger("raises")
543563
asyncio.run(run())
544564

545565
def test_on_final(self):

tests/test_core.py

+24-8
Original file line numberDiff line numberDiff line change
@@ -1233,22 +1233,31 @@ def test_may_transition(self):
12331233
m.add_transition('stop', 'B', 'C')
12341234
m.add_transition('wait', 'B', None)
12351235
assert d.may_walk()
1236+
assert d.may_trigger("walk")
12361237
assert not d.may_stop()
1238+
assert not d.may_trigger("stop")
12371239
assert not d.may_wait()
1240+
assert not d.may_trigger("wait")
12381241

12391242
d.walk()
12401243
assert not d.may_walk()
1244+
assert not d.may_trigger("walk")
12411245
assert d.may_stop()
1246+
assert d.may_trigger("stop")
12421247
assert d.may_wait()
1248+
assert d.may_trigger("wait")
12431249

12441250
def test_may_transition_for_autogenerated_triggers(self):
12451251
states = ['A', 'B', 'C']
12461252
m = Machine(states=states, initial='A')
12471253
assert m.may_to_A()
1254+
assert m.may_trigger("to_A")
12481255
m.to_A()
12491256
assert m.to_B()
1257+
assert m.may_trigger("to_B")
12501258
m.to_B()
12511259
assert m.may_to_C()
1260+
assert m.may_trigger("to_C")
12521261
m.to_C()
12531262

12541263
def test_may_transition_with_conditions(self):
@@ -1259,18 +1268,14 @@ def test_may_transition_with_conditions(self):
12591268
m.add_transition('stop', 'B', 'C')
12601269
m.add_transition('run', 'A', 'C')
12611270
assert not d.may_walk()
1271+
assert not d.may_trigger("walk")
12621272
assert not d.may_stop()
1273+
assert not d.may_trigger("stop")
12631274
assert d.may_run()
1275+
assert d.may_trigger("run")
12641276
d.run()
12651277
assert not d.may_run()
1266-
1267-
def test_may_transition_with_auto_transitions(self):
1268-
states = ['A', 'B', 'C']
1269-
d = DummyModel()
1270-
self.machine_cls(model=d, states=states, initial='A')
1271-
assert d.may_to_A()
1272-
assert d.may_to_B()
1273-
assert d.may_to_C()
1278+
assert not d.may_trigger("run")
12741279

12751280
def test_machine_may_transitions(self):
12761281
states = ['A', 'B', 'C']
@@ -1281,19 +1286,26 @@ def test_machine_may_transitions(self):
12811286
m.add_transition('reset', 'C', 'A')
12821287

12831288
assert not m.may_walk()
1289+
assert not m.may_trigger("walk")
12841290
assert not m.may_stop()
1291+
assert not m.may_trigger("stop")
12851292
assert m.may_run()
1293+
assert m.may_trigger("run")
12861294
m.run()
12871295
assert not m.may_run()
1296+
assert not m.may_trigger("run")
12881297
assert not m.may_stop()
1298+
assert not m.may_trigger("stop")
12891299
assert not m.may_walk()
1300+
assert not m.may_trigger("walk")
12901301

12911302
def test_may_transition_with_invalid_state(self):
12921303
states = ['A', 'B', 'C']
12931304
d = DummyModel()
12941305
m = self.machine_cls(model=d, states=states, initial='A', auto_transitions=False)
12951306
m.add_transition('walk', 'A', 'UNKNOWN')
12961307
assert not d.may_walk()
1308+
assert not d.may_trigger("walk")
12971309

12981310
def test_may_transition_with_exception(self):
12991311
stuff = Stuff(machine_cls=self.machine_cls, extra_kwargs={"send_event": True})
@@ -1314,11 +1326,15 @@ def process_exception(event_data):
13141326
assert stuff.works()
13151327
with self.assertRaises(ValueError):
13161328
stuff.may_raises()
1329+
with self.assertRaises(ValueError):
1330+
stuff.may_trigger("raises")
13171331
assert stuff.is_B()
13181332
stuff.machine.on_exception.append(process_exception)
13191333
assert not stuff.may_raises()
1334+
assert not stuff.may_trigger("raises")
13201335
assert stuff.to_A()
13211336
assert not stuff.may_raises()
1337+
assert not stuff.may_trigger("raises")
13221338

13231339
def test_on_final(self):
13241340
final_mock = MagicMock()

tests/test_enum.py

+2
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,9 @@ class TrafficLight(object):
171171
m.add_transition('go', self.States.RED, self.States.GREEN)
172172
m.add_transition('stop', self.States.YELLOW, self.States.RED)
173173
assert t.may_go()
174+
assert t.may_trigger("go")
174175
assert not t.may_stop()
176+
assert not t.may_trigger("stop")
175177

176178

177179
@skipIf(enum is None, "enum is not available")

tests/test_nesting.py

+17
Original file line numberDiff line numberDiff line change
@@ -639,14 +639,19 @@ def test_machine_may_transitions_for_generated_triggers(self):
639639
states = ['A', 'B', {'name': 'C', 'children': ['1', '2', '3']}, 'D']
640640
m = self.stuff.machine_cls(states=states, initial='A')
641641
assert m.may_to_A()
642+
assert m.may_trigger("to_A")
642643
m.to_A()
643644
assert m.may_to_B()
645+
assert m.may_trigger("to_B")
644646
m.to_B()
645647
assert m.may_to_C()
648+
assert m.may_trigger("to_C")
646649
m.to_C()
647650
assert m.may_to_C_1()
651+
assert m.may_trigger("to_C_1")
648652
m.to_C_1()
649653
assert m.may_to_D()
654+
assert m.may_trigger("to_D")
650655
m.to_D()
651656

652657
def test_get_nested_triggers(self):
@@ -957,20 +962,32 @@ def test_machine_may_transitions(self):
957962
states=states, transitions=transitions, initial='A', auto_transitions=False
958963
)
959964
assert m.may_walk()
965+
assert m.may_trigger("walk")
960966
assert not m.may_run()
967+
assert not m.may_trigger("run")
961968
assert not m.may_run_fast()
969+
assert not m.may_trigger("run_fast")
962970
assert not m.may_sprint()
971+
assert not m.may_trigger("sprint")
963972
assert not m.may_wait()
973+
assert not m.may_trigger("wait")
964974

965975
m.walk()
966976
assert not m.may_walk()
977+
assert not m.may_trigger("walk")
967978
assert m.may_run()
979+
assert m.may_trigger("run")
968980
assert not m.may_run_fast()
981+
assert not m.may_trigger("run_fast")
969982
assert m.may_wait()
983+
assert m.may_trigger("wait")
970984

971985
m.run()
972986
assert m.may_run_fast()
987+
assert m.may_trigger("run_fast")
973988
assert m.may_sprint()
989+
assert m.may_trigger("sprint")
990+
974991
m.run_fast()
975992

976993
def test_remove_nested_transition(self):

transitions/core.py

+1
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ def add_model(self, model, initial=None):
625625
mod = self if mod is self.self_literal else mod
626626
if mod not in self.models:
627627
self._checked_assignment(mod, 'trigger', partial(self._get_trigger, mod))
628+
self._checked_assignment(mod, 'may_trigger', partial(self._can_trigger, mod))
628629

629630
for trigger in self.events:
630631
self._add_trigger_to_model(trigger, mod)

0 commit comments

Comments
 (0)