82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
|
import unittest
|
||
|
import random
|
||
|
import time
|
||
|
|
||
|
from threading import Event
|
||
|
|
||
|
from pypot.creatures import PoppyErgoJr
|
||
|
from pypot.primitive import LoopPrimitive
|
||
|
|
||
|
|
||
|
class TestPrimLifeCycle(unittest.TestCase):
|
||
|
def setUp(self):
|
||
|
self.jr = PoppyErgoJr(simulator='dummy')
|
||
|
|
||
|
def tearDown(self):
|
||
|
self.jr.close()
|
||
|
|
||
|
def test_teardown(self):
|
||
|
self.jr.dance.start()
|
||
|
time.sleep(random.random() * 5)
|
||
|
self.jr.dance.stop()
|
||
|
|
||
|
self.assertEqual({m.led for m in self.jr.motors}, {'off'})
|
||
|
self.assertEqual({m.led for m in self.jr.dance.robot.motors}, {'off'})
|
||
|
|
||
|
def test_set_once(self):
|
||
|
class Switcher(LoopPrimitive):
|
||
|
def setup(self):
|
||
|
self.current_state = False
|
||
|
self.old_state = self.current_state
|
||
|
|
||
|
self.switched = Event()
|
||
|
|
||
|
def update(self):
|
||
|
if self.current_state != self.old_state:
|
||
|
for m in self.robot.motors:
|
||
|
self.affect_once(m, 'led',
|
||
|
'red' if self.current_state else 'off')
|
||
|
|
||
|
self.old_state = self.current_state
|
||
|
|
||
|
self.switched.set()
|
||
|
|
||
|
p = Switcher(self.jr, 10)
|
||
|
p.start()
|
||
|
|
||
|
for m in self.jr.motors:
|
||
|
m.led = 'off'
|
||
|
|
||
|
self.jr.m3.led = 'pink'
|
||
|
|
||
|
self.assertEqual([m.led for m in self.jr.motors],
|
||
|
['off', 'off', 'pink', 'off', 'off', 'off'])
|
||
|
|
||
|
p.switched.clear()
|
||
|
p.current_state = not p.current_state
|
||
|
p.switched.wait()
|
||
|
|
||
|
self.assertEqual([m.led for m in self.jr.motors],
|
||
|
['red', 'red', 'red', 'red', 'red', 'red'])
|
||
|
|
||
|
self.jr.m3.led = 'blue'
|
||
|
self.assertEqual([m.led for m in self.jr.motors],
|
||
|
['red', 'red', 'blue', 'red', 'red', 'red'])
|
||
|
|
||
|
p.stop()
|
||
|
|
||
|
def test_start_pause_stop(self):
|
||
|
self.jr.dance.start()
|
||
|
self.jr.dance.pause()
|
||
|
self.jr.dance.stop()
|
||
|
|
||
|
def test_start_stop_pause_resume_random_order(self):
|
||
|
cmd = ['start', 'stop', 'pause', 'resume']
|
||
|
|
||
|
for _ in range(10):
|
||
|
getattr(self.jr.dance, random.choice(cmd))()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
unittest.main()
|