def test_not_enough_bots(self):
        """If there's not enough robots to do an assignment, it should raise an error"""

        bot1 = robocup.OurRobot(self.context, 1)
        bot1.set_pos_for_testing(robocup.Point(1, 6))

        req1 = role_assignment.RoleRequirements()
        req1.pos = robocup.Point(1, 7)
        req1.required = True

        req2 = role_assignment.RoleRequirements()
        req2.pos = robocup.Point(3, 4)
        req2.required = True

        req_tree = {'role1': req1, 'role2': req2}
        self.assertRaises(role_assignment.ImpossibleAssignmentError,
                          role_assignment.assign_roles, [bot1], req_tree)
    def test_pos_cost(self):
        """Ensure that when requirements specify a target position, it is taken
        into account in assignment"""

        bot1 = robocup.OurRobot(self.context, 1)
        bot1.set_pos_for_testing(robocup.Point(1, 6))

        bot2 = robocup.OurRobot(self.context, 2)
        bot2.set_pos_for_testing(robocup.Point(2, 3))

        req1 = role_assignment.RoleRequirements()
        req1.destination_shape = robocup.Point(1, 7)

        req2 = role_assignment.RoleRequirements()
        req2.destination_shape = robocup.Point(3, 4)

        req_tree = {'role1': req1, 'role2': req2}
        assignments = role_assignment.assign_roles([bot1, bot2], req_tree)
        self.assertEqual(len(assignments), 2)
        self.assertEqual(assignments['role1'][1], bot1)
        self.assertEqual(assignments['role2'][1], bot2)
 def role_requirements(self):
     reqs = role_assignment.RoleRequirements()
     if self.robot != None:
         reqs.previous_shell_id = self.robot.shell_id()
     return reqs