Beispiel #1
0
if __name__ == "__main__":
    logging.info('Steering system test: starting')
    steering = Steering(steering_motor_address='outC',
                        steering_motor_speed_factor=10,
                        steering_speed=5,
                        steering_max_range=35,
                        steering_motor_position_factor=-1)

    logging.info('=== Steering system test: Initialize ===')
    steering.initialize()
    logging.info('Steering system test: steering position = ' +
                 str(steering.get_current_steering_position()))
    time.sleep(1)

    logging.info('=== Steering system test: turn to 100% left ===')
    steering.set_steering_position(-100)
    logging.info('Steering system test: steering position = ' +
                 str(steering.get_current_steering_position()))
    logging.info('Steering system test: steering motor state = ' +
                 str(steering.steering_motor.state))
    time.sleep(1)

    logging.info('=== Steering system test: turn to 50% right ===')
    steering.set_steering_position(50)
    logging.info('Steering system test: steering position = ' +
                 str(steering.get_current_steering_position()))
    logging.info('Steering system test: steering motor state = ' +
                 str(steering.steering_motor.state))
    time.sleep(1)

    logging.info('=== Steering system test: turn to 100% right ===')
class SteeringUnitTest(unittest.TestCase):
    def setUp(self):
        self.steering = Steering(TEST_STEERING_MOTOR_ADDRESS,
                                 TEST_STEERING_MOTOR_SPEED_FACTOR,
                                 TEST_STEERING_SPEED, TEST_STEERING_MAX_RANGE,
                                 TEST_STEERING_MOTOR_POSITION_FACTOR, True)
        self.steering.steering_motor = MagicMock()

    def test_shouldCalculateCorrectCurrentSteeringPositionWhenTurnedLeft(self):
        # given
        __test_steering_motor_position = -21
        self.steering.steering_motor.position = __test_steering_motor_position

        # when
        __actual_steering_position = self.steering.get_current_steering_position(
        )

        # then
        __expected_steering_position = self.__get_expected_steering_position(
            __test_steering_motor_position)
        self.assertEqual(__expected_steering_position,
                         __actual_steering_position)

    def test_shouldCalculateCorrectCurrentSteeringPositionWhenTurnedMaxLeft(
            self):
        # given
        self.steering.steering_motor.position = -TEST_STEERING_MAX_RANGE

        # when
        __actual_steering_position = self.steering.get_current_steering_position(
        )

        # then
        __expected_steering_position = TEST_STEERING_MOTOR_POSITION_FACTOR * -100
        self.assertEqual(__expected_steering_position,
                         __actual_steering_position)

    def test_shouldCalculateCorrectCurrentSteeringPositionWhenTurnedRight(
            self):
        # given
        __test_steering_motor_position = 18
        self.steering.steering_motor.position = __test_steering_motor_position

        # when
        __actual_steering_position = self.steering.get_current_steering_position(
        )

        # then
        __expected_steering_position = self.__get_expected_steering_position(
            __test_steering_motor_position)
        self.assertEqual(__expected_steering_position,
                         __actual_steering_position)

    def test_shouldCalculateCorrectCurrentSteeringPositionWhenTurnedMaxRight(
            self):
        # given
        self.steering.steering_motor.position = TEST_STEERING_MAX_RANGE

        # when
        __actual_steering_position = self.steering.get_current_steering_position(
        )

        # then
        __expected_steering_position = TEST_STEERING_MOTOR_POSITION_FACTOR * 100
        self.assertEqual(__expected_steering_position,
                         __actual_steering_position)

    def test_shouldCalculateCorrectCurrentSteeringPositionWhenAtCenter(self):
        # given
        self.steering.steering_motor.position = 0

        # when
        __actual_steering_position = self.steering.get_current_steering_position(
        )

        # then
        self.assertEqual(0, __actual_steering_position)

    def test_shouldResetSteeringPositionToCenterWhenInitialized(self):
        # given
        self.steering.steering_motor.position = 32

        # when
        self.steering.initialize()

        # then
        self.steering.steering_motor.reset.assert_called_once()

    def test_shouldTurnMaxRangeRightForCenteringWhenInitialized(self):
        # given
        self.steering.steering_motor.position = 32

        # when
        self.steering.initialize()

        # then
        __expected_steering_motor_turn = TEST_STEERING_MOTOR_POSITION_FACTOR * TEST_STEERING_MAX_RANGE
        self.steering.steering_motor.run_to_rel_pos.assert_called_with(
            position_sp=__expected_steering_motor_turn,
            speed_sp=EXPECTED_STEERING_MOTOR_SPEED,
            stop_action=EXPECTED_STEERING_MOTOR_STOP_ACTION)

    def test_should_turn_steering_motor_left_by_correct_amount_when_steering_motor_position_was_zero(
            self):
        # given
        __test_steering_motor_initial_position = 0
        __test_steering_position = -50
        self.steering.steering_motor.position = __test_steering_motor_initial_position

        # when
        self.steering.set_steering_position(__test_steering_position)

        # then
        __expected_steering_motor_turn = self.__get_expected_steering_motor_turn(
            __test_steering_position)
        self.steering.steering_motor.run_to_abs_pos.assert_called_with(
            position_sp=__expected_steering_motor_turn,
            speed_sp=EXPECTED_STEERING_MOTOR_SPEED,
            stop_action=EXPECTED_STEERING_MOTOR_STOP_ACTION)

    def test_should_turn_steering_motor_right_by_correct_amount_when_steering_motor_position_was_zero(
            self):
        # given
        __test_steering_motor_initial_position = 0
        __test_steering_position = 66
        self.steering.steering_motor.position = __test_steering_motor_initial_position

        # when
        self.steering.set_steering_position(__test_steering_position)

        # then
        __expected_steering_motor_turn = self.__get_expected_steering_motor_turn(
            __test_steering_position)
        self.steering.steering_motor.run_to_abs_pos.assert_called_with(
            position_sp=__expected_steering_motor_turn,
            speed_sp=EXPECTED_STEERING_MOTOR_SPEED,
            stop_action=EXPECTED_STEERING_MOTOR_STOP_ACTION)

    def test_should_turn_steering_motor_left_by_correct_amount_when_steering_motor_position_was_in_left(
            self):
        # given
        __test_steering_motor_initial_position = -10
        __test_steering_position = -50
        self.steering.steering_motor.position = __test_steering_motor_initial_position

        # when
        self.steering.set_steering_position(__test_steering_position)

        # then
        __expected_steering_motor_turn = self.__get_expected_steering_motor_turn(
            __test_steering_position)
        self.steering.steering_motor.run_to_abs_pos.assert_called_with(
            position_sp=__expected_steering_motor_turn,
            speed_sp=EXPECTED_STEERING_MOTOR_SPEED,
            stop_action=EXPECTED_STEERING_MOTOR_STOP_ACTION)

    def test_should_turn_steering_motor_left_by_correct_amount_when_steering_motor_position_was_in_right(
            self):
        # given
        __test_steering_motor_initial_position = 15
        __test_steering_position = -50
        self.steering.steering_motor.position = __test_steering_motor_initial_position

        # when
        self.steering.set_steering_position(__test_steering_position)

        # then
        __expected_steering_motor_turn = self.__get_expected_steering_motor_turn(
            __test_steering_position)
        self.steering.steering_motor.run_to_abs_pos.assert_called_with(
            position_sp=__expected_steering_motor_turn,
            speed_sp=EXPECTED_STEERING_MOTOR_SPEED,
            stop_action=EXPECTED_STEERING_MOTOR_STOP_ACTION)

    def test_should_turn_steering_motor_right_by_correct_amount_when_steering_motor_position_was_in_right(
            self):
        # given
        __test_steering_motor_initial_position = 15
        __test_steering_position = 60
        self.steering.steering_motor.position = __test_steering_motor_initial_position

        # when
        self.steering.set_steering_position(__test_steering_position)

        # then
        __expected_steering_motor_turn = self.__get_expected_steering_motor_turn(
            __test_steering_position)
        self.steering.steering_motor.run_to_abs_pos.assert_called_with(
            position_sp=__expected_steering_motor_turn,
            speed_sp=EXPECTED_STEERING_MOTOR_SPEED,
            stop_action=EXPECTED_STEERING_MOTOR_STOP_ACTION)

    def test_should_turn_steering_motor_right_by_correct_amount_when_steering_motor_position_was_in_left(
            self):
        # given
        __test_steering_motor_initial_position = -20
        __test_steering_position = 60
        self.steering.steering_motor.position = __test_steering_motor_initial_position

        # when
        self.steering.set_steering_position(__test_steering_position)

        # then
        __expected_steering_motor_turn = self.__get_expected_steering_motor_turn(
            __test_steering_position)
        self.steering.steering_motor.run_to_abs_pos.assert_called_with(
            position_sp=__expected_steering_motor_turn,
            speed_sp=EXPECTED_STEERING_MOTOR_SPEED,
            stop_action=EXPECTED_STEERING_MOTOR_STOP_ACTION)

    @staticmethod
    def __get_expected_steering_motor_turn(desired_steering_position):
        return TEST_STEERING_MOTOR_POSITION_FACTOR * (int(
            desired_steering_position * TEST_STEERING_MAX_RANGE / 100))

    @staticmethod
    def __get_expected_steering_position(steering_motor_position):
        return TEST_STEERING_MOTOR_POSITION_FACTOR * int(
            steering_motor_position * 100 / TEST_STEERING_MAX_RANGE)