def test_rotations(
        multipolygon_with_region: Tuple[Multipolygon, Region]) -> None:
    multipolygon, region = multipolygon_with_region

    result = region_in_multipolygon(region, multipolygon)

    assert all(result is region_in_multipolygon(region, rotated)
               for rotated in multipolygon_rotations(multipolygon))
def test_self(multipolygon: Multipolygon) -> None:
    has_holes = any(polygon.holes for polygon in multipolygon.polygons)
    assert equivalence(
        all(
            region_in_multipolygon(polygon.border, multipolygon) is
            Relation.COMPONENT
            for polygon in multipolygon.polygons), not has_holes)
    assert equivalence(
        any(
            region_in_multipolygon(polygon.border, multipolygon) is
            Relation.OVERLAP for polygon in multipolygon.polygons), has_holes)
def test_basic(multipolygon_with_region: Tuple[Multipolygon, Region]) -> None:
    multipolygon, region = multipolygon_with_region

    result = region_in_multipolygon(region, multipolygon)

    assert isinstance(result, Relation)
    assert result in MULTIPART_COMPOUND_RELATIONS
def test_connection_with_contour_in_multipolygon(
        multipolygon_with_region: Tuple[Multipolygon, Region]) -> None:
    multipolygon, region = multipolygon_with_region

    result = region_in_multipolygon(region, multipolygon)

    contour_relation = contour_in_multipolygon(region, multipolygon)
    assert implication(result is Relation.DISJOINT or result is Relation.COVER,
                       contour_relation is Relation.DISJOINT)
    assert implication(
        contour_relation is Relation.DISJOINT, result is Relation.DISJOINT
        or result is Relation.OVERLAP or result is Relation.COVER)
    assert implication(
        result is Relation.TOUCH or result is Relation.ENCLOSES
        or result is Relation.COMPOSITE, contour_relation is Relation.TOUCH)
    assert implication(
        contour_relation is Relation.TOUCH, result is Relation.TOUCH
        or result is Relation.ENCLOSES or result is Relation.OVERLAP
        or result is Relation.COMPOSITE)
    assert implication(
        result is Relation.OVERLAP, contour_relation is Relation.DISJOINT
        or contour_relation is Relation.CROSS
        or contour_relation is Relation.TOUCH)
    assert implication(contour_relation is Relation.CROSS,
                       result is Relation.OVERLAP)
    assert equivalence(
        result is Relation.COMPONENT or result is Relation.EQUAL,
        contour_relation is Relation.COMPONENT)
    assert equivalence(result is Relation.ENCLOSED,
                       contour_relation is Relation.ENCLOSED)
    assert equivalence(result is Relation.WITHIN,
                       contour_relation is Relation.WITHIN)
def test_step(multipolygon_with_region: Tuple[Multipolygon, Region]) -> None:
    multipolygon, region = multipolygon_with_region
    first_polygon, rest_multipolygon = multipolygon_pop_left(multipolygon)

    result = region_in_multipolygon(region, rest_multipolygon)
    next_result = region_in_multipolygon(region, multipolygon)

    relation_with_first_region = region_in_polygon(region, first_polygon)
    assert equivalence(
        next_result is Relation.DISJOINT,
        result is relation_with_first_region is Relation.DISJOINT)
    assert equivalence(
        next_result is Relation.TOUCH, result is Relation.DISJOINT
        and relation_with_first_region is Relation.TOUCH
        or result is Relation.TOUCH
        and relation_with_first_region in (Relation.DISJOINT, Relation.TOUCH))
    assert equivalence(
        next_result is Relation.COMPONENT, result is Relation.COMPONENT
        or bool(rest_multipolygon.polygons)
        and relation_with_first_region is Relation.EQUAL)
    assert equivalence(
        next_result is Relation.OVERLAP, result is Relation.OVERLAP
        or relation_with_first_region is Relation.OVERLAP
        or (bool(rest_multipolygon.polygons) and result is Relation.DISJOINT
            or result is Relation.TOUCH)
        and relation_with_first_region in (Relation.COVER, Relation.ENCLOSES)
        or result in (Relation.COVER, Relation.ENCLOSES)
        and relation_with_first_region is Relation.DISJOINT)
    assert equivalence(
        next_result is Relation.COVER,
        (not rest_multipolygon.polygons or result is Relation.COVER)
        and relation_with_first_region is Relation.COVER)
    assert equivalence(
        next_result is Relation.ENCLOSES, result is Relation.ENCLOSES
        and relation_with_first_region in (Relation.ENCLOSES, Relation.COVER)
        or (not rest_multipolygon.polygons or result is Relation.COVER)
        and relation_with_first_region is Relation.ENCLOSES)
    assert equivalence(
        next_result is Relation.EQUAL, not rest_multipolygon.polygons
        and relation_with_first_region is Relation.EQUAL)
    assert equivalence(
        next_result is Relation.ENCLOSED, result is Relation.ENCLOSED
        or relation_with_first_region is Relation.ENCLOSED)
    assert equivalence(
        next_result is Relation.WITHIN, result is Relation.WITHIN
        or relation_with_first_region is Relation.WITHIN)
def test_reversals(
        multipolygon_with_region: Tuple[Multipolygon, Region]) -> None:
    multipolygon, region = multipolygon_with_region

    result = region_in_multipolygon(region, multipolygon)

    assert result is region_in_multipolygon(reverse_contour(region),
                                            multipolygon)
    assert result is region_in_multipolygon(region,
                                            reverse_multipolygon(multipolygon))
    assert result is region_in_multipolygon(
        region, reverse_multipolygon_borders(multipolygon))
    assert result is region_in_multipolygon(
        region, reverse_multipolygon_holes(multipolygon))
    assert result is region_in_multipolygon(
        region, reverse_multipolygon_holes_contours(multipolygon))
    assert result is region_in_multipolygon(
        reverse_contour_coordinates(region),
        reverse_multipolygon_coordinates(multipolygon))
예제 #7
0
def test_step(multiregion_with_multipolygon: Tuple[Multipolygon, Multiregion]
              ) -> None:
    multipolygon, multiregion = multiregion_with_multipolygon
    first_region, *rest_multiregion = multiregion

    result = multiregion_in_multipolygon(rest_multiregion, multipolygon)
    next_result = multiregion_in_multipolygon(multiregion, multipolygon)

    relation_with_first_region = region_in_multipolygon(first_region,
                                                        multipolygon)
    assert equivalence(next_result is Relation.DISJOINT,
                       result is relation_with_first_region
                       is Relation.DISJOINT)
    assert equivalence(next_result is Relation.TOUCH,
                       result is Relation.TOUCH
                       and (relation_with_first_region is Relation.DISJOINT
                            or relation_with_first_region is Relation.TOUCH)
                       or result is Relation.DISJOINT
                       and relation_with_first_region is Relation.TOUCH)
    assert equivalence(next_result is Relation.OVERLAP,
                       result is Relation.OVERLAP
                       or relation_with_first_region is Relation.OVERLAP
                       or (bool(rest_multiregion)
                           and result is Relation.DISJOINT
                           or result is Relation.TOUCH)
                       and (relation_with_first_region is Relation.COMPONENT
                            or relation_with_first_region is Relation.ENCLOSED
                            or relation_with_first_region is Relation.WITHIN)
                       or (result is Relation.COMPONENT
                           or result is Relation.ENCLOSED
                           or result is Relation.WITHIN)
                       and (relation_with_first_region is Relation.DISJOINT
                            or relation_with_first_region is Relation.TOUCH))
    assert equivalence(next_result is Relation.COVER,
                       result is Relation.COVER
                       or relation_with_first_region is Relation.COVER)
    assert equivalence(next_result is Relation.ENCLOSES,
                       result is Relation.ENCLOSES
                       or relation_with_first_region is Relation.ENCLOSES)
    assert equivalence(next_result is Relation.COMPOSITE,
                       result is Relation.COMPOSITE or result is Relation.EQUAL
                       or (relation_with_first_region is Relation.COMPOSITE
                           or bool(rest_multiregion)
                           and relation_with_first_region is Relation.EQUAL))
    assert equivalence(next_result is Relation.EQUAL,
                       not rest_multiregion
                       and relation_with_first_region is Relation.EQUAL)
    assert equivalence(next_result is Relation.COMPONENT,
                       (not rest_multiregion or result is Relation.COMPONENT)
                       and relation_with_first_region is Relation.COMPONENT)
    assert equivalence(next_result is Relation.ENCLOSED,
                       (not rest_multiregion or result is Relation.COMPONENT
                        or result is Relation.ENCLOSED
                        or result is Relation.WITHIN)
                       and relation_with_first_region is Relation.ENCLOSED
                       or result is Relation.ENCLOSED
                       and (relation_with_first_region is Relation.COMPONENT
                            or relation_with_first_region is Relation.WITHIN))
    assert equivalence(next_result is Relation.WITHIN,
                       (not rest_multiregion or result is Relation.WITHIN)
                       and relation_with_first_region is Relation.WITHIN)