def test_ai_calibrate_nodes(self): intf = MockInterface(1) node = intf.nodes[0] node.ai_calibrate = True node.first_cross_flag = True node.enter_at_level = 12 node.exit_at_level = 12 rssis = [2, 2, 3, 4, 2, 4, 20, 22, 18, 2, 3, 4, 2] node.history.set(list(range(len(rssis))), rssis) new_enter_at_level = None new_exit_at_level = None def new_enter_callback(node, enter_level): nonlocal new_enter_at_level new_enter_at_level = enter_level def new_exit_callback(node, exit_level): nonlocal new_exit_at_level new_exit_at_level = exit_level intf.listener.on_enter_trigger_changed = new_enter_callback intf.listener.on_exit_trigger_changed = new_exit_callback intf.ai_calibrate_nodes() self.assertEqual(new_enter_at_level, 11) self.assertEqual(new_exit_at_level, 9)
def test_calibrate_nodes(self): intf = MockInterface(1) node = intf.nodes[0] node.ai_calibrate = True history_values = [2, 2, 3, 4, 2, 4, 20, 22, 18, 2, 3, 4, 2] history_times = list(range(len(history_values))) new_enter_at_level = None new_exit_at_level = None def new_enter_callback(node, enter_level): nonlocal new_enter_at_level new_enter_at_level = enter_level def new_exit_callback(node, exit_level): nonlocal new_exit_at_level new_exit_at_level = exit_level intf.listener.on_enter_trigger_changed = new_enter_callback intf.listener.on_exit_trigger_changed = new_exit_callback intf.calibrate_nodes( 0, { 0: ([{ 'lap_time_stamp': 7000, 'deleted': False }], history_times, history_values) }) self.assertEqual(new_enter_at_level, 11) self.assertEqual(new_exit_at_level, 6)
def check_mqtt_pass(self, mqtt_lap_source, expected_lap_source): hw = MockInterface(1) ann_topic = '/ann' timer_id = 'local' new_lap_ts = None new_lap_source = None def pass_record_callback(node, lap_ts, lap_source): nonlocal new_lap_ts nonlocal new_lap_source new_lap_ts = lap_ts new_lap_source = lap_source api = MqttAPI(StubMqttClient(), ann_topic, timer_id, hw, None, pass_record_callback, None, None, None, None) intf = MqttInterface(StubMqttClient(), hw) intf.ann_topic = ann_topic intf.timer_id = timer_id msg = { 'topic': intf._mqtt_create_node_topic(ann_topic, hw.nodes[0], 'pass'), 'payload': json.dumps({ 'source': mqtt_lap_source, 'timestamp': 11 }) } api.pass_handler(api.client, None, StubMqttMessage(**msg)) self.assertEqual(new_lap_ts, 11) self.assertEqual(new_lap_source, expected_lap_source)
def test(self): mock_intf = MockInterface() started = False race_stopped = False laps = 0 def on_start(): nonlocal started started = True def on_stop_race(): nonlocal race_stopped race_stopped = True def on_reset_race(): pass def on_pass(node, lap_ts, source, rssi): nonlocal laps laps += 1 api = ChorusAPI(None, mock_intf, stub_sensor.discover(), on_start, on_stop_race, on_reset_race) api_io = ChorusTest.DummySerial( lambda data: api._process_message(data)) intf = ChorusInterface(api_io) api.serial_io = ChorusTest.DummySerial( lambda data: intf._process_message(intf.node_managers[0], data)) intf.listener.on_pass = on_pass self.assertTrue(started) for sensor in intf.sensors: sensor.update() intf._update() self.assertGreater(len(sensor.getReadings()), 0) intf.set_frequency(2, 5885) self.assertEqual(mock_intf.nodes[2].frequency, 5885) intf.set_enter_at_level(4, 33) self.assertEqual(mock_intf.nodes[4].enter_at_level, 33) self.assertEqual(mock_intf.nodes[4].exit_at_level, 33) intf.set_exit_at_level(5, 34) self.assertEqual(mock_intf.nodes[4].enter_at_level, 33) self.assertEqual(mock_intf.nodes[4].exit_at_level, 33) self.assertEqual(mock_intf.nodes[5].enter_at_level, 34) self.assertEqual(mock_intf.nodes[5].exit_at_level, 34) api.emit_pass_record(mock_intf.nodes[0], 1, 98) gevent.sleep(0) self.assertEqual(laps, 1) intf.start() mock_intf.nodes[0].current_rssi = 66 mock_intf.nodes[3].current_rssi = 67 api.emit_rssi('*') gevent.sleep(0.5) intf.stop() self.assertEqual(intf.nodes[0].current_rssi, 66) self.assertEqual(intf.nodes[3].current_rssi, 67)
def test_peak_nadir_history_peak_before_nadir(self): intf = MockInterface(1) node = intf.nodes[0] now = 100 pn = PeakNadirHistory(node, now) pn.peakRssi = 10 pn.nadirRssi = 1 pn.peakFirstTime = pn.peakLastTime = 8000 pn.nadirFirstTime = pn.nadirLastTime = 5000 history = RssiHistory() pn.addTo(history) history_times, history_values = history.get() self.assertListEqual(history_times, [92, 95]) self.assertListEqual(history_values, [10, 1])
def test_mqtt_frequency(self): hw = MockInterface(1) intf = MqttInterface(StubMqttClient(), hw) intf.ann_topic = '/ann' intf.ctrl_topic = '/ctrl' intf.timer_id = 'local' msg = { 'topic': intf._mqtt_create_node_topic('system', hw.nodes[0], "frequency"), 'payload': '5675' } intf._mqtt_set_frequency(hw.node_managers[0], None, None, StubMqttMessage(**msg)) self.assertEqual(hw.nodes[0].frequency, 5675)
def run_effects(self, module): strip = MockPixel(36) race = RHRace() race.result_fn = lambda race: { 'by_race_time': [{ 'starts': 1, 'node': 0, 'position': 1 }] } test_args = { 'RACE': race, 'iterations': 3, 'time': 0, 'lap': { 'lap_number': 5, 'lap_time': 45000, 'lap_time_formatted': '45s' }, 'node_index': 0, 'hide_stage_timer': True, 'message': 'Test', 'strip': strip, 'manager': MockManager(), 'INTERFACE': MockInterface() } config = { 'LED_ROWS': 6, 'PANEL_ROTATE': False, 'INVERTED_PANEL_ROWS': False } effects = module.discover(config) for effect in effects: args = {} args.update(effect['defaultArgs']) args.update(test_args) strip.frames = [] effect['handlerFn'](args) self.assertGreater(len(strip.frames), 0, effect)
def test_peak_nadir_history_empty(self): intf = MockInterface(1) node = intf.nodes[0] now = 100 pn = PeakNadirHistory(node, now) self.assertTrue(pn.isEmpty())