def test_composite_device_sequence(): with CompositeDevice(InputDevice(MockPin(2)), InputDevice(MockPin(3))) as device: assert len(device) == 2 assert device[0].pin.number == 2 assert device[1].pin.number == 3 assert device.namedtuple._fields == ('_0', '_1')
def test_traffic_lights(): red_pin = MockPin(2) amber_pin = MockPin(3) green_pin = MockPin(4) with TrafficLights(red_pin, amber_pin, green_pin) as board: board.red.on() assert board.red.value assert not board.amber.value assert not board.yellow.value assert not board.green.value assert red_pin.state assert not amber_pin.state assert not green_pin.state board.amber.on() assert amber_pin.state board.yellow.off() assert not amber_pin.state with TrafficLights(red=red_pin, yellow=amber_pin, green=green_pin) as board: board.yellow.on() assert not board.red.value assert board.amber.value assert board.yellow.value assert not board.green.value assert not red_pin.state assert amber_pin.state assert not green_pin.state board.amber.off() assert not amber_pin.state
def test_composite_device_named(): with CompositeDevice(foo=InputDevice(MockPin(2)), bar=InputDevice(MockPin(3)), _order=('foo', 'bar')) as device: assert device.namedtuple._fields == ('foo', 'bar') assert device.value == (0, 0) assert not device.is_active
def test_led_bar_graph_value(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBarGraph(pin1, pin2, pin3) as graph: assert isinstance(graph[0], LED) assert isinstance(graph[1], LED) assert isinstance(graph[2], LED) assert graph.active_high assert graph[0].active_high assert graph[1].active_high assert graph[2].active_high graph.value = 0 assert graph.value == 0 assert not any((pin1.state, pin2.state, pin3.state)) graph.value = 1 assert graph.value == 1 assert all((pin1.state, pin2.state, pin3.state)) graph.value = 1 / 3 assert graph.value == 1 / 3 assert pin1.state and not (pin2.state or pin3.state) graph.value = -1 / 3 assert graph.value == -1 / 3 assert pin3.state and not (pin1.state or pin2.state) pin1.state = True pin2.state = True assert graph.value == 1 pin3.state = False assert graph.value == 2 / 3 pin3.state = True pin1.state = False assert graph.value == -2 / 3
def test_mock_pin_init_twice_different_modes(): pin1 = MockPin(2) pin2 = MockPWMPin(pin1.number+1) assert pin1 != pin2 with pytest.raises(ValueError): pin3 = MockPWMPin(pin1.number) with pytest.raises(ValueError): pin4 = MockPin(pin2.number)
def test_motor_pins_nonpwm(): f = MockPin(1) b = MockPin(2) with Motor(f, b, pwm=False) as device: assert device.forward_device.pin is f assert isinstance(device.forward_device, DigitalOutputDevice) assert device.backward_device.pin is b assert isinstance(device.backward_device, DigitalOutputDevice)
def test_led_board_initial_value(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, pin2, foo=pin3, initial_value=0) as board: assert board.value == (0, 0, 0) with LEDBoard(pin1, pin2, foo=pin3, initial_value=1) as board: assert board.value == (1, 1, 1)
def test_composite_device_values(): with CompositeDevice(InputDevice(MockPin(2)), InputDevice(MockPin(3))) as device: assert device.value == (0, 0) assert not device.is_active device[0].pin.drive_high() assert device.value == (1, 0) assert device.is_active
def test_motor_close_nonpwm(): f = MockPin(1) b = MockPin(2) with Motor(f, b, pwm=False) as device: device.close() assert device.closed assert device.forward_device.pin is None assert device.backward_device.pin is None
def test_led_bar_graph_bad_value(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBarGraph(pin1, pin2, pin3) as graph: with pytest.raises(ValueError): graph.value = -2 with pytest.raises(ValueError): graph.value = 2
def test_traffic_lights(): red_pin = MockPin(2) amber_pin = MockPin(3) green_pin = MockPin(4) with TrafficLights(red_pin, amber_pin, green_pin) as board: board.red.on() assert red_pin.state assert not amber_pin.state assert not green_pin.state
def test_traffic_lights_bad_init(): with pytest.raises(ValueError): TrafficLights() red_pin = MockPin(2) amber_pin = MockPin(3) green_pin = MockPin(4) yellow_pin = MockPin(5) with pytest.raises(ValueError): TrafficLights(red=red_pin, amber=amber_pin, yellow=yellow_pin, green=green_pin)
def test_composite_output_on_off(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with CompositeOutputDevice(OutputDevice(pin1), OutputDevice(pin2), foo=OutputDevice(pin3)) as device: device.on() assert all((pin1.state, pin2.state, pin3.state)) device.off() assert not any((pin1.state, pin2.state, pin3.state))
def test_led_board_on_off(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, pin2, foo=pin3) as board: assert isinstance(board[0], LED) assert isinstance(board[1], LED) assert isinstance(board[2], LED) assert board.active_high assert board[0].active_high assert board[1].active_high assert board[2].active_high board.on() assert all((pin1.state, pin2.state, pin3.state)) board.off() assert not any((pin1.state, pin2.state, pin3.state)) board[0].on() assert board.value == (1, 0, 0) assert pin1.state assert not pin2.state assert not pin3.state board.toggle() assert board.value == (0, 1, 1) assert not pin1.state assert pin2.state assert pin3.state board.toggle(0, 1) assert board.value == (1, 0, 1) assert pin1.state assert not pin2.state assert pin3.state board.off(2) assert board.value == (1, 0, 0) assert pin1.state assert not pin2.state assert not pin3.state board.on(1) assert board.value == (1, 1, 0) assert pin1.state assert pin2.state assert not pin3.state board.off(0, 1) assert board.value == (0, 0, 0) assert not pin1.state assert not pin2.state assert not pin3.state board.on(1, 2) assert board.value == (0, 1, 1) assert not pin1.state assert pin2.state assert pin3.state board.toggle(0) assert board.value == (1, 1, 1) assert pin1.state assert pin2.state assert pin3.state
def test_led_board_value(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, pin2, foo=pin3) as board: assert board.value == (0, 0, 0) board.value = (0, 1, 0) assert board.value == (0, 1, 0) board.value = (1, 0, 1) assert board.value == (1, 0, 1)
def test_motor_reverse_nonpwm(): f = MockPin(1) b = MockPin(2) with Motor(f, b, pwm=False) as device: device.forward() assert device.value == 1 assert b.state == 0 and f.state == 1 device.reverse() assert device.value == -1 assert b.state == 1 and f.state == 0
def test_led_bar_graph_initial_value(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBarGraph(pin1, pin2, pin3, initial_value=1 / 3) as graph: assert graph.value == 1 / 3 assert pin1.state and not (pin2.state or pin3.state) with LEDBarGraph(pin1, pin2, pin3, initial_value=-1 / 3) as graph: assert graph.value == -1 / 3 assert pin3.state and not (pin1.state or pin2.state)
def test_led_bar_graph_bad_init(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with pytest.raises(TypeError): LEDBarGraph(pin1, pin2, foo=pin3) with pytest.raises(ValueError): LEDBarGraph(pin1, pin2, pin3, initial_value=-2) with pytest.raises(ValueError): LEDBarGraph(pin1, pin2, pin3, initial_value=2)
def test_led_board_blink_interrupt_off(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: board.blink(0.1, 1) sleep(0.2) board.off() # should interrupt while off pin1.assert_states([False, True, False]) pin2.assert_states([False, True, False]) pin3.assert_states([False, True, False])
def test_led_board_nested(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: assert list(led.pin for led in board.leds) == [pin1, pin2, pin3] assert board.value == (0, (0, 0)) board.value = (1, (0, 1)) assert pin1.state assert not pin2.state assert pin3.state
def test_led_board_bad_blink(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: with pytest.raises(ValueError): board.blink(fade_in_time=1, fade_out_time=1) with pytest.raises(ValueError): board.blink(fade_out_time=1) with pytest.raises(ValueError): board.pulse()
def test_led_board_blink_foreground(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: board.blink(0.1, 0.1, n=2, background=False) test = [(0.0, False), (0.0, True), (0.1, False), (0.1, True), (0.1, False)] pin1.assert_states_and_times(test) pin2.assert_states_and_times(test) pin3.assert_states_and_times(test)
def test_motor_bad_value_nonpwm(): f = MockPin(1) b = MockPin(2) with Motor(f, b, pwm=False) as device: with pytest.raises(ValueError): device.value = -2 with pytest.raises(ValueError): device.value = 2 with pytest.raises(ValueError): device.value = 0.5 with pytest.raises(ValueError): device.value = -0.5
def test_composite_output_value(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with CompositeOutputDevice(OutputDevice(pin1), OutputDevice(pin2), foo=OutputDevice(pin3)) as device: assert device.value == (0, 0, 0) device.toggle() assert device.value == (1, 1, 1) device.value = (1, 0, 1) assert device[0].is_active assert not device[1].is_active assert device[2].is_active
def test_composite_output_toggle(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with CompositeOutputDevice(OutputDevice(pin1), OutputDevice(pin2), foo=OutputDevice(pin3)) as device: device.toggle() assert all((pin1.state, pin2.state, pin3.state)) device[0].off() device.toggle() assert pin1.state assert not pin2.state assert not pin3.state
def test_led_board_blink_background(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: board.blink(0.1, 0.1, n=2) board._blink_thread.join( ) # naughty, but ensures no arbitrary waits in the test test = [(0.0, False), (0.0, True), (0.1, False), (0.1, True), (0.1, False)] pin1.assert_states_and_times(test) pin2.assert_states_and_times(test) pin3.assert_states_and_times(test)
def test_led_board_blink_take_over(): pin1 = MockPin(2) pin2 = MockPin(3) pin3 = MockPin(4) with LEDBoard(pin1, LEDBoard(pin2, pin3)) as board: board[1].blink(0.1, 0.1, n=2) board.blink(0.1, 0.1, n=2) # immediately take over blinking board[1]._blink_thread.join() board._blink_thread.join() test = [(0.0, False), (0.0, True), (0.1, False), (0.1, True), (0.1, False)] pin1.assert_states_and_times(test) pin2.assert_states_and_times(test) pin3.assert_states_and_times(test)
def test_motor_value_nonpwm(): f = MockPin(1) b = MockPin(2) with Motor(f, b, pwm=False) as device: device.value = -1 assert device.is_active assert device.value == -1 assert b.state == 1 and f.state == 0 device.value = 1 assert device.is_active assert device.value == 1 assert b.state == 0 and f.state == 1 device.value = 0 assert not device.is_active assert not device.value assert b.state == 0 and f.state == 0
def test_output_write_active_low(): pin = MockPin(2) with OutputDevice(pin, active_high=False) as device: device.on() assert not pin.state device.off() assert pin.state
def test_output_blink_interrupt_off(): pin = MockPin(2) with DigitalOutputDevice(pin) as device: device.blink(0.1, 1) sleep(0.2) device.off() # should interrupt while off pin.assert_states([False, True, False])