Esempio n. 1
0
class TestPathing:
    """
    Test DocString
    """
    scenarios = [(f"Testing {md.bot.game_info.map_name}", {
        "map_data": md
    }) for md in get_map_datas()]

    def test_region_connectivity(self, map_data: MapData) -> None:
        base = map_data.bot.townhalls[0]
        region = map_data.where_all(base.position_tuple)[0]
        destination = map_data.where_all(
            map_data.bot.enemy_start_locations[0].position)[0]
        all_possible_paths = map_data.region_connectivity_all_paths(
            start_region=region, goal_region=destination)
        for p in all_possible_paths:
            assert (destination in p), f"destination = {destination}"

        bad_request = map_data.region_connectivity_all_paths(
            start_region=region,
            goal_region=destination,
            not_through=[destination])
        assert (bad_request == [])

    def test_handle_out_of_bounds_values(self, map_data: MapData) -> None:
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        assert (
            isinstance(reg_start, Region)
        ), f"reg_start = {reg_start},  base = {base}, position_tuple = {base.position_tuple}"
        reg_end = map_data.where_all(
            map_data.bot.enemy_start_locations[0].position)[0]
        p0 = reg_start.center
        p1 = reg_end.center
        pts = []
        r = 10
        for i in range(50):
            pts.append(get_random_point(-500, -250, -500, -250))

        arr = map_data.get_pyastar_grid()
        for p in pts:
            arr = map_data.add_cost(p, r, arr)
        path = map_data.pathfind(p0, p1, grid=arr)
        assert (path is not None), f"path = {path}"

    def test_handle_illegal_weights(self, map_data: MapData) -> None:
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        assert (
            isinstance(reg_start, Region)
        ), f"reg_start = {reg_start},  base = {base}, position_tuple = {base.position_tuple}"
        reg_end = map_data.where_all(
            map_data.bot.enemy_start_locations[0].position)[0]
        p0 = reg_start.center
        p1 = reg_end.center
        pts = []
        r = 10
        for i in range(10):
            pts.append(get_random_point(20, 180, 20, 180))

        arr = map_data.get_pyastar_grid()
        for p in pts:
            arr = map_data.add_cost(p, r, arr, weight=-100)
        path = map_data.pathfind(p0, p1, grid=arr)
        assert (path is not None), f"path = {path}"

    def test_find_lowest_cost_points(self, map_data: MapData) -> None:
        cr = 7
        safe_query_radius = 14
        expected_max_distance = 2 * safe_query_radius

        influence_grid = map_data.get_air_vs_ground_grid()
        cost_point = (50, 130)
        influence_grid = map_data.add_cost(position=cost_point,
                                           radius=cr,
                                           grid=influence_grid)
        safe_points = map_data.find_lowest_cost_points(
            from_pos=cost_point, radius=safe_query_radius, grid=influence_grid)
        assert (
            safe_points[0][0], np.integer
        ), f"safe_points[0][0] = {safe_points[0][0]}, type {type(safe_points[0][0])}"
        assert isinstance(
            safe_points[0][1], np.integer
        ), f"safe_points[0][1] = {safe_points[0][1]}, type {type(safe_points[0][1])}"
        cost = influence_grid[safe_points[0]]
        for p in safe_points:
            assert (influence_grid[
                        p] == cost), f"grid type = air_vs_ground_grid, p = {p}, " \
                                     f"influence_grid[p] = {influence_grid[p]}, expected cost = {cost}"
            assert (map_data.distance(cost_point, p) < expected_max_distance)

        influence_grid = map_data.get_clean_air_grid()
        cost_point = (50, 130)
        influence_grid = map_data.add_cost(position=cost_point,
                                           radius=cr,
                                           grid=influence_grid)
        safe_points = map_data.find_lowest_cost_points(
            from_pos=cost_point, radius=safe_query_radius, grid=influence_grid)
        cost = influence_grid[safe_points[0]]
        for p in safe_points:
            assert (influence_grid[
                        p] == cost), f"grid type = clean_air_grid, p = {p}, " \
                                     f"influence_grid[p] = {influence_grid[p]}, expected cost = {cost}"
            assert (map_data.distance(cost_point, p) < expected_max_distance)

        influence_grid = map_data.get_pyastar_grid()
        cost_point = (50, 130)
        influence_grid = map_data.add_cost(position=cost_point,
                                           radius=cr,
                                           grid=influence_grid)
        safe_points = map_data.find_lowest_cost_points(
            from_pos=cost_point, radius=safe_query_radius, grid=influence_grid)
        cost = influence_grid[safe_points[0]]
        for p in safe_points:
            assert (influence_grid[
                        p] == cost), f"grid type = pyastar_grid, p = {p}, " \
                                     f"influence_grid[p] = {influence_grid[p]}, expected cost = {cost}"
            assert (map_data.distance(cost_point, p) < expected_max_distance)

        influence_grid = map_data.get_climber_grid()
        cost_point = (50, 130)
        influence_grid = map_data.add_cost(position=cost_point,
                                           radius=cr,
                                           grid=influence_grid)
        safe_points = map_data.find_lowest_cost_points(
            from_pos=cost_point, radius=safe_query_radius, grid=influence_grid)
        cost = influence_grid[safe_points[0]]
        for p in safe_points:
            assert (influence_grid[
                        p] == cost), f"grid type = climber_grid, p = {p}, " \
                                     f"influence_grid[p] = {influence_grid[p]}, expected cost = {cost}"
            assert (map_data.distance(cost_point, p) < expected_max_distance)

    def test_clean_air_grid_smoothing(self, map_data: MapData) -> None:
        default_weight = 2
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        reg_end = map_data.where_all(
            map_data.bot.enemy_start_locations[0].position)[0]
        p0 = Point2(reg_start.center)
        p1 = Point2(reg_end.center)
        grid = map_data.get_clean_air_grid(default_weight=default_weight)
        cost_points = [(87, 76), (108, 64), (97, 53)]
        cost_points = list(map(Point2, cost_points))
        for cost_point in cost_points:
            grid = map_data.add_cost(position=cost_point, radius=7, grid=grid)
        path = map_data.pathfind(start=p0, goal=p1, grid=grid, smoothing=True)
        assert (len(path) < 50)

    def test_clean_air_grid_no_smoothing(self, map_data: MapData) -> None:
        """
        non diagonal path should be longer,  but still below 250
        """
        default_weight = 2
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        reg_end = map_data.where_all(
            map_data.bot.enemy_start_locations[0].position)[0]
        p0 = Point2(reg_start.center)
        p1 = Point2(reg_end.center)
        grid = map_data.get_clean_air_grid(default_weight=default_weight)
        cost_points = [(87, 76), (108, 64), (97, 53)]
        cost_points = list(map(Point2, cost_points))
        for cost_point in cost_points:
            grid = map_data.add_cost(position=cost_point, radius=7, grid=grid)
        path = map_data.pathfind(start=p0, goal=p1, grid=grid, smoothing=False)
        assert (len(path) < 250)

    def test_air_vs_ground(self, map_data: MapData) -> None:
        default_weight = 99
        grid = map_data.get_air_vs_ground_grid(default_weight=default_weight)
        ramps = map_data.map_ramps
        path_array = map_data.pather.default_grid
        for ramp in ramps:
            for point in ramp.points:
                if path_array[point.x][point.y] == 1:
                    assert (grid[point.x][point.y] == default_weight
                            ), f"point {point}"

    def test_sensitivity(self, map_data: MapData) -> None:
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        reg_end = map_data.where_all(
            map_data.bot.enemy_start_locations[0].position)[0]
        p0 = reg_start.center
        p1 = reg_end.center
        arr = map_data.get_pyastar_grid()
        path_pure = map_data.pathfind(p0, p1, grid=arr)
        path_sensitive_5 = map_data.pathfind(p0, p1, grid=arr, sensitivity=5)
        path_sensitive_1 = map_data.pathfind(p0, p1, grid=arr, sensitivity=1)
        assert (len(path_sensitive_5) < len(path_pure))
        assert (p in path_pure for p in path_sensitive_5)
        assert (path_sensitive_1 == path_pure)

    def test_pathing_influence(self, map_data: MapData,
                               caplog: LogCaptureFixture) -> None:
        logger.info(map_data)
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        reg_end = map_data.where_all(
            map_data.bot.enemy_start_locations[0].position)[0]
        p0 = reg_start.center
        p1 = reg_end.center
        pts = []
        r = 10
        for i in range(50):
            pts.append(get_random_point(0, 200, 0, 200))

        arr = map_data.get_pyastar_grid()
        for p in pts:
            arr = map_data.add_cost(p, r, arr)
        path = map_data.pathfind(p0, p1, grid=arr)
        assert (path is not None)
class TestSanity:
    """
    Test DocString
    """
    scenarios = [(f"Testing {md.bot.game_info.map_name}", {
        "map_data": md
    }) for md in get_map_datas()]

    def test_polygon(self, map_data: MapData) -> None:
        for polygon in map_data.polygons:
            polygon.plot(testing=True)
            assert (polygon not in polygon.areas)
            assert (polygon.nodes == list(polygon.points))
            assert (polygon.width > 0)
            assert (polygon.area > 0)
            assert (polygon.is_inside_point(polygon.center))

            extended_pts = polygon.points.union(polygon.perimeter_points)
            assert (polygon.points == extended_pts)

            for point in extended_pts:
                assert (polygon.is_inside_point(point) is True)

                # https://github.com/BurnySc2/python-sc2/issues/62
                assert (point is not None)
                assert (type(point[0] == int))

            for point in polygon.corner_points:
                assert (point in polygon.corner_array)
            assert (polygon.buildables.free_pct is not None)

    def test_regions(self, map_data: MapData) -> None:
        for region in map_data.regions.values():
            for p in region.points:
                assert (
                    region in map_data.where_all(p)
                ), f"expected {region}, got {map_data.where_all(p)}, point {p}"
            assert (region == map_data.where(region.center))

            # coverage
            region.plot(testing=True)

    def test_ramps(self, map_data: MapData) -> None:
        for ramp in map_data.map_ramps:
            assert (len(ramp.regions) == 2), f"ramp = {ramp}"

    def test_chokes(self, map_data: MapData) -> None:
        for choke in map_data.map_chokes:
            for p in choke.points:
                assert (choke in map_data.where_all(p)), \
                    logger.error(f"<Map : {map_data}, Choke : {choke},"
                                         f" where :  {map_data.where(choke.center)} point : {choke.center}>")

    def test_vision_blockers(self, map_data: MapData) -> None:
        all_chokes = map_data.map_chokes
        for vb in map_data.map_vision_blockers:
            assert (vb in all_chokes)
            for p in vb.points:
                assert (vb in map_data.where_all(p)), \
                    logger.error(f"<Map : {map_data}, Choke : {vb},"
                                          f" where_all :  {map_data.where_all(vb.center)} point : {vb.center}>")
class TestPathing:
    """
    Test DocString
    """
    scenarios = [(f"Testing {md.bot.game_info.map_name}", {"map_data": md}) for md in get_map_datas()]

    def test_region_connectivity(self, map_data: MapData) -> None:
        base = map_data.bot.townhalls[0]
        region = map_data.where_all(base.position_tuple)[0]
        destination = map_data.where_all(map_data.bot.enemy_start_locations[0].position)[0]
        all_possible_paths = map_data.region_connectivity_all_paths(start_region=region,
                                                                    goal_region=destination)
        for p in all_possible_paths:
            assert (destination in p), f"destination = {destination}"

        bad_request = map_data.region_connectivity_all_paths(start_region=region,
                                                             goal_region=destination,
                                                             not_through=[destination])
        assert (bad_request == [])

    def test_handle_illegal_values(self, map_data: MapData) -> None:
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        assert (isinstance(reg_start,
                           Region)), f"reg_start = {reg_start},  base = {base}, position_tuple = {base.position_tuple}"
        reg_end = map_data.where_all(map_data.bot.enemy_start_locations[0].position)[0]
        p0 = reg_start.center
        p1 = reg_end.center
        pts = []
        r = 10
        for i in range(50):
            pts.append(get_random_point(-500, -250, -500, -250))

        arr = map_data.get_pyastar_grid()
        for p in pts:
            arr = map_data.add_cost(p, r, arr)
        path = map_data.pathfind(p0, p1, grid=arr)
        assert (path is not None), f"path = {path}"

    def test_air_vs_ground(self, map_data: MapData) -> None:
        default_weight = 99
        grid = map_data.get_air_vs_ground_grid(default_weight=default_weight)
        ramps = map_data.map_ramps
        path_array = map_data.path_arr.T
        for ramp in ramps:
            for point in ramp.points:
                if path_array[point.x][point.y] == 1:
                    assert (grid[point.x][point.y] == default_weight)

    def test_sensitivity(self, map_data: MapData) -> None:
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        reg_end = map_data.where_all(map_data.bot.enemy_start_locations[0].position)[0]
        p0 = reg_start.center
        p1 = reg_end.center
        arr = map_data.get_pyastar_grid()
        path_pure = map_data.pathfind(p0, p1, grid=arr)
        path_sensitive_5 = map_data.pathfind(p0, p1, grid=arr, sensitivity=5)
        path_sensitive_1 = map_data.pathfind(p0, p1, grid=arr, sensitivity=1)
        assert (len(path_sensitive_5) < len(path_pure))
        assert (p in path_pure for p in path_sensitive_5)
        assert (path_sensitive_1 == path_pure)

    def test_pathing_influence(self, map_data: MapData, caplog: LogCaptureFixture) -> None:
        logger.info(map_data)
        base = map_data.bot.townhalls[0]
        reg_start = map_data.where_all(base.position_tuple)[0]
        reg_end = map_data.where_all(map_data.bot.enemy_start_locations[0].position)[0]
        p0 = reg_start.center
        p1 = reg_end.center
        pts = []
        r = 10
        for i in range(50):
            pts.append(get_random_point(0, 200, 0, 200))

        arr = map_data.get_pyastar_grid()
        for p in pts:
            arr = map_data.add_cost(p, r, arr)
        path = map_data.pathfind(p0, p1, grid=arr)
        assert (path is not None)