def setUp(self, extraDeps=None, cfg=None): # Handle case where the timer is still mocked for some reason, we make # sure to un mock it if AITestCase.__timerMocked: self.mockTimer() # Replace the Timer class with the Mock one self.mockTimer() if extraDeps is None: extraDeps = [] if cfg is None: cfg = {} self.eventHub = core.EventHub() self.qeventHub = core.QueuedEventHub(self.eventHub) self.timerManager = timer.TimerManager(deps=[self.eventHub]) self.estimator = MockEstimator(cfg=cfg.get('StateEstimator', {})) self.controller = MockController(eventHub=self.eventHub, estimator=self.estimator) self.vehicle = MockVehicle(cfg=cfg.get('Vehicle', {})) self.visionSystem = MockVisionSystem() aCfg = cfg.get('Ai', {}) self.ai = AI(aCfg) deps = [ self.controller, self.timerManager, self.eventHub, self.qeventHub, self.vehicle, self.visionSystem, self.ai, self.estimator ] mCfg = cfg.get('MotionManager', {}) self.motionManager = motion.basic.MotionManager(mCfg, deps) deps.append(self.motionManager) deps.extend(extraDeps) sCfg = cfg.get('StateMachine', {}) self.machine = state.Machine(cfg=sCfg, deps=deps)
def setUp(self, extraDeps = None, cfg = None): # Handle case where the timer is still mocked for some reason, we make # sure to un mock it if AITestCase.__timerMocked: self.mockTimer() # Replace the Timer class with the Mock one self.mockTimer() if extraDeps is None: extraDeps = [] if cfg is None: cfg = {} self.eventHub = core.EventHub() self.qeventHub = core.QueuedEventHub(self.eventHub) self.timerManager = timer.TimerManager(deps = [self.eventHub]) self.estimator = MockEstimator(cfg = cfg.get('StateEstimator', {})) self.controller = MockController( eventHub = self.eventHub, estimator = self.estimator) self.vehicle = MockVehicle(cfg = cfg.get('Vehicle', {})) self.visionSystem = MockVisionSystem() aCfg = cfg.get('Ai', {}) self.ai = AI(aCfg) deps = [self.controller, self.timerManager, self.eventHub, self.qeventHub, self.vehicle, self.visionSystem, self.ai, self.estimator] mCfg = cfg.get('MotionManager', {}) self.motionManager = motion.basic.MotionManager(mCfg, deps) deps.append(self.motionManager) deps.extend(extraDeps) sCfg = cfg.get('StateMachine', {}) self.machine = state.Machine(cfg = sCfg, deps = deps)
class AITestCase(unittest.TestCase): TIMER_ORIG = timer.Timer __timerMocked = False def mockSleep(self, seconds): self.seconds = seconds def mockTimer(self): if AITestCase.__timerMocked: assert timer.Timer == MockTimer # Put the original timer class back timer.Timer = AITestCase.TIMER_ORIG AITestCase.__timerMocked = False else: assert timer.Timer != MockTimer # Replace Timer with out Mock Timer Class timer.Timer = MockTimer AITestCase.__timerMocked = True def setUp(self, extraDeps=None, cfg=None): # Handle case where the timer is still mocked for some reason, we make # sure to un mock it if AITestCase.__timerMocked: self.mockTimer() # Replace the Timer class with the Mock one self.mockTimer() if extraDeps is None: extraDeps = [] if cfg is None: cfg = {} self.eventHub = core.EventHub() self.qeventHub = core.QueuedEventHub(self.eventHub) self.timerManager = timer.TimerManager(deps=[self.eventHub]) self.controller = MockController(self.eventHub) self.vehicle = MockVehicle(cfg=cfg.get('Vehicle', {})) self.visionSystem = MockVisionSystem() aCfg = cfg.get('Ai', {}) self.ai = AI(aCfg) deps = [ self.controller, self.timerManager, self.eventHub, self.qeventHub, self.vehicle, self.visionSystem, self.ai ] mCfg = cfg.get('MotionManager', {}) self.motionManager = motion.basic.MotionManager(mCfg, deps) deps.append(self.motionManager) deps.extend(extraDeps) sCfg = cfg.get('StateMachine', {}) self.machine = state.Machine(cfg=sCfg, deps=deps) def tearDown(self): # Put back the normal timer class self.ai.unbackground() self.mockTimer() self.machine.stop() def _createEvent(self, etype, eclass=core.Event, *args, **kwargs): """ Sends and event of the desired type and class into the state machine @type etype: str @param etype: The event type to give the event @type eclass: Subclass of ext.core.Event @param eclass: The class of the event object """ if kwargs.has_key('type'): raise ValueError, "Keyword arguments cannot contain 'type'" kwargs['type'] = etype event = eclass(*args) # Set desired class attributes for attr, val in kwargs.iteritems(): setattr(event, attr, val) return event def injectEvent(self, etype, eclass=core.Event, *args, **kwargs): event = self._createEvent(etype, eclass, *args, **kwargs) sendToBranches = False if kwargs.has_key('sendToBranches'): sendToBranches = True del kwargs['sendToBranches'] self.machine.injectEvent(event, _sendToBranches=sendToBranches) def publishQueuedEvent(self, publisher, etype, eclass=core.Event, *args, **kwargs): event = self._createEvent(etype, eclass, *args, **kwargs) self.qeventHub.publish(etype, event) self.qeventHub.publishEvents() def releaseTimer(self, eventType): timer = MockTimer.LOG[eventType] # Make sure the timer has actual been started self.assert_(timer.started) # Release the timer finished event timer.finish() self.qeventHub.publishEvents() # def releaseTimer(self, timer): # """ # Stops a spinning background timer, joins it, then releases its event # """ # assert self.timerBlock, "Must set self.timerBlock to be true" # # # Stops the background loop # self.timerBlock = False # timer.join() # # Releases the event the timer published when the loop stopped # self.qeventHub.publishEvents() def assertCurrentState(self, stateType): """ Compares the type of the current state machine state to the given one """ self.assertEquals(stateType, type(self.machine.currentState())) def assertCurrentBranchState(self, branchState, stateType): """ Compares the type of the current state machine state to the given one """ self.assert_(self.machine.branches.has_key(branchState)) branch = self.machine.branches[branchState] self.assertEquals(stateType, type(branch.currentState())) def assertCurrentMotion(self, motionType): """ Compares the type of the current motion to the given one """ current = self.motionManager.currentMotion currentType = type(self.motionManager.currentMotion) def getType(val): if val is None: return None else: return type(val) if types.TupleType == currentType: currentType = (getType(current[0]), getType(current[1]), getType(current[2])) self.assertEquals(motionType, currentType) def assertCurrentMotionList(self, motionList): """ Compares the type of the current motion queue to the given one. It includes the current motion. """ # Get the current motion list currentList = self.motionManager.currentMotionList # Check if None if motionList is None: return currentList is None # The motionList should be a list if it isn't None if types.ListType != type(motionList): raise Exception('A list must be sent into assertCurrentMotionList') # Check the current motion first current = motionList[0] self.assertCurrentMotion(current) # Parse out the current motion from the motion list currentList = currentList[1:] motionList = motionList[1:] # Make sure there are the same number of motions in both lists if len(currentList) != len(motionList): return False # Iterate through the list and check the types for c, m in zip(currentList, motionList): if type(c) != m: return False # The motion list is the same if it's reached this point in the code return True def assertCurrentBranches(self, branches): for branch in branches: self.assert_(self.machine.branches.has_key(branch)) self.assertEqual(len(branches), len(self.machine.branches)) def assertLessThan(self, a, b): if not (a < b): self.fail(str(a) + " is not less than " + str(b)) def assertGreaterThan(self, a, b): if not (a > b): self.fail(str(a) + " is not greater than " + str(b)) def assertAIDataValue(self, key, value): self.assert_(self.ai.data.has_key(key)) self.assertEqual(value, self.ai.data[key]) def assertDataValue(self, data, key, value): self.assert_(data.has_key(key)) self.assertEqual(value, data[key])
class AITestCase(unittest.TestCase): TIMER_ORIG = timer.Timer __timerMocked = False def mockSleep(self, seconds): self.seconds = seconds def mockTimer(self): if AITestCase.__timerMocked: assert timer.Timer == MockTimer # Put the original timer class back timer.Timer = AITestCase.TIMER_ORIG AITestCase.__timerMocked = False else: assert timer.Timer != MockTimer # Replace Timer with out Mock Timer Class timer.Timer = MockTimer AITestCase.__timerMocked = True def setUp(self, extraDeps = None, cfg = None): # Handle case where the timer is still mocked for some reason, we make # sure to un mock it if AITestCase.__timerMocked: self.mockTimer() # Replace the Timer class with the Mock one self.mockTimer() if extraDeps is None: extraDeps = [] if cfg is None: cfg = {} self.eventHub = core.EventHub() self.qeventHub = core.QueuedEventHub(self.eventHub) self.timerManager = timer.TimerManager(deps = [self.eventHub]) self.estimator = MockEstimator(cfg = cfg.get('StateEstimator', {})) self.controller = MockController( eventHub = self.eventHub, estimator = self.estimator) self.vehicle = MockVehicle(cfg = cfg.get('Vehicle', {})) self.visionSystem = MockVisionSystem() aCfg = cfg.get('Ai', {}) self.ai = AI(aCfg) deps = [self.controller, self.timerManager, self.eventHub, self.qeventHub, self.vehicle, self.visionSystem, self.ai, self.estimator] mCfg = cfg.get('MotionManager', {}) self.motionManager = motion.basic.MotionManager(mCfg, deps) deps.append(self.motionManager) deps.extend(extraDeps) sCfg = cfg.get('StateMachine', {}) self.machine = state.Machine(cfg = sCfg, deps = deps) def tearDown(self): # Put back the normal timer class self.ai.unbackground() self.mockTimer() self.machine.stop() def _createEvent(self, etype, eclass = core.Event, *args, **kwargs): """ Sends and event of the desired type and class into the state machine @type etype: str @param etype: The event type to give the event @type eclass: Subclass of ext.core.Event @param eclass: The class of the event object """ if kwargs.has_key('type'): raise ValueError, "Keyword arguments cannot contain 'type'" kwargs['type'] = etype event = eclass(*args) # Set desired class attributes for attr, val in kwargs.iteritems(): setattr(event, attr, val) return event def injectEvent(self, etype, eclass = core.Event, *args, **kwargs): event = self._createEvent(etype, eclass, *args, **kwargs) sendToBranches = False if kwargs.has_key('sendToBranches'): sendToBranches = True del kwargs['sendToBranches'] self.machine.injectEvent(event, _sendToBranches = sendToBranches) def publishQueuedEvent(self, publisher, etype, eclass = core.Event, *args, **kwargs): event = self._createEvent(etype, eclass, *args, **kwargs) self.qeventHub.publish(etype, event) self.qeventHub.publishEvents() def releaseTimer(self, eventType): print MockTimer.LOG print eventType timer = MockTimer.LOG[eventType] # Make sure the timer has actual been started self.assert_(timer.started) # Release the timer finished event timer.finish() self.qeventHub.publishEvents() # def releaseTimer(self, timer): # """ # Stops a spinning background timer, joins it, then releases its event # """ # assert self.timerBlock, "Must set self.timerBlock to be true" # # # Stops the background loop # self.timerBlock = False # timer.join() # # Releases the event the timer published when the loop stopped # self.qeventHub.publishEvents() def assertCurrentState(self, stateType): """ Compares the type of the current state machine state to the given one """ self.assertEquals(stateType, type(self.machine.currentState())) def assertCurrentBranchState(self, branchState, stateType): """ Compares the type of the current state machine state to the given one """ self.assert_(self.machine.branches.has_key(branchState)) branch = self.machine.branches[branchState] self.assertEquals(stateType, type(branch.currentState())) def assertCurrentMotion(self, motionType): """ Compares the type of the current motion to the given one """ current = self.motionManager.currentMotion currentType = type(self.motionManager.currentMotion) def getType(val): if val is None: return None else: return type(val) if types.TupleType == currentType: currentType = (getType(current[0]), getType(current[1]), getType(current[2])) self.assertEquals(motionType, currentType) def assertCurrentMotionList(self, motionList): """ Compares the type of the current motion queue to the given one. It includes the current motion. """ # Get the current motion list currentList = self.motionManager.currentMotionList # Check if None if motionList is None: return currentList is None # The motionList should be a list if it isn't None if types.ListType != type(motionList): raise Exception('A list must be sent into assertCurrentMotionList') # Check the current motion first current = motionList[0] self.assertCurrentMotion(current) # Parse out the current motion from the motion list currentList = currentList[1:] motionList = motionList[1:] # Make sure there are the same number of motions in both lists if len(currentList) != len(motionList): return False # Iterate through the list and check the types for c, m in zip(currentList, motionList): if type(c) != m: return False # The motion list is the same if it's reached this point in the code return True def assertCurrentBranches(self, branches): for branch in branches: self.assert_(self.machine.branches.has_key(branch)) self.assertEqual(len(branches), len(self.machine.branches)) def assertLessThan(self, a, b): if not (a < b): self.fail(str(a) + " is not less than " + str(b)) def assertGreaterThan(self, a, b): if not (a > b): self.fail(str(a) + " is not greater than " + str(b)) def assertAIDataValue(self, key, value): self.assert_(self.ai.data.has_key(key)) self.assertEqual(value, self.ai.data[key]) def assertDataValue(self, data, key, value): self.assert_(data.has_key(key)) self.assertEqual(value, data[key])