Skip to content

Commit fa4a26d

Browse files
committed
Fixed bugs in nested iterator. Expanded tests and enabled code coverage.
1 parent 19946d7 commit fa4a26d

File tree

5 files changed

+83
-20
lines changed

5 files changed

+83
-20
lines changed

.github/workflows/CI.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ jobs:
3434
- uses: julia-actions/cache@v1
3535
- uses: julia-actions/julia-buildpkg@v1
3636
- uses: julia-actions/julia-runtest@v1
37+
- uses: julia-actions/julia-processcoverage@v1
38+
- uses: codecov/codecov-action@v2
39+
with:
40+
files: lcov.info
3741
docs:
3842
name: Documentation
3943
runs-on: ubuntu-latest

src/GeoInterface.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module GeoInterface
22

3+
using Base.Iterators
4+
35
include("types.jl")
46
include("interface.jl")
57
include("defaults.jl")

src/defaults.jl

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ ismeasured(::AbstractPointTrait, geom) = :M in coordnames(geom)
1919
isempty(T, geom) = false
2020

2121
## Points
22-
ngeom(::AbstractPointTrait, geom)::Integer = 0
22+
ngeom(::AbstractPointTrait, geom) = 0
2323
getgeom(::AbstractPointTrait, geom) = nothing
2424
getgeom(::AbstractPointTrait, geom, i) = nothing
2525

@@ -37,24 +37,24 @@ getring(t::AbstractPolygonTrait, geom, i) = getgeom(t, geom, i)
3737
getexterior(t::AbstractPolygonTrait, geom) = getring(t, geom, 1)
3838
nhole(t::AbstractPolygonTrait, geom) = nring(t, geom) - 1
3939
gethole(t::AbstractPolygonTrait, geom, i) = getring(t, geom, i + 1)
40-
npoint(p::AbstractPolygonTrait, geom) = sum(npoint(p) for p in getring(t, geom))
41-
getpoint(t::AbstractPolygonTrait, geom) = (p for p in getpoint(r) for r in getring(t, geom))
40+
npoint(t::AbstractPolygonTrait, geom) = sum(npoint(p) for p in getring(t, geom))
41+
getpoint(t::AbstractPolygonTrait, geom) = flatten((p for p in getpoint(r)) for r in getring(t, geom))
4242

4343
## MultiLineString
4444
nlinestring(t::AbstractMultiLineStringTrait, geom) = ngeom(t, geom)
4545
getlinestring(t::AbstractMultiLineStringTrait, geom) = getgeom(t, geom)
4646
getlinestring(t::AbstractMultiLineStringTrait, geom, i) = getgeom(t, geom, i)
4747
npoint(t::AbstractMultiLineStringTrait, geom) = sum(npoint(ls) for ls in getgeom(t, geom))
48-
getpoint(t::AbstractMultiLineStringTrait, geom) = (p for p in getpoint(ls) for ls in getgeom(t, geom))
48+
getpoint(t::AbstractMultiLineStringTrait, geom) = flatten((p for p in getpoint(ls)) for ls in getgeom(t, geom))
4949

5050
## MultiPolygon
5151
npolygon(t::AbstractMultiPolygonTrait, geom) = ngeom(t, geom)
5252
getpolygon(t::AbstractMultiPolygonTrait, geom) = getgeom(t, geom)
5353
getpolygon(t::AbstractMultiPolygonTrait, geom, i) = getgeom(t, geom, i)
5454
nring(t::AbstractMultiPolygonTrait, geom) = sum(nring(p) for p in getpolygon(t, geom))
55-
getring(t::AbstractMultiPolygonTrait, geom) = (r for r in getring(p) for p in getpolygon(t, geom))
55+
getring(t::AbstractMultiPolygonTrait, geom) = flatten((r for r in getring(p)) for p in getpolygon(t, geom))
5656
npoint(t::AbstractMultiPolygonTrait, geom) = sum(npoint(r) for r in getring(t, geom))
57-
getpoint(t::AbstractMultiPolygonTrait, geom) = (p for p in getpoint(r) for r in getring(t, geom))
57+
getpoint(t::AbstractMultiPolygonTrait, geom) = flatten((p for p in getpoint(r)) for r in getring(t, geom))
5858

5959
## Surface
6060
npatch(t::AbstractPolyHedralSurfaceTrait, geom)::Integer = ngeom(t, geom)
@@ -68,10 +68,15 @@ getcoord(t::AbstractPointTrait, geom) = (getcoord(t, geom, i) for i in 1:ncoord(
6868
## Npoints
6969
npoint(::LineTrait, _) = 2
7070
npoint(::TriangleTrait, _) = 3
71+
nring(::TriangleTrait, _) = 1
7172
npoint(::RectangleTrait, _) = 4
73+
nring(::RectangleTrait, _) = 1
7274
npoint(::QuadTrait, _) = 4
75+
nring(::QuadTrait, _) = 1
7376
npoint(::PentagonTrait, _) = 5
77+
nring(::PentagonTrait, _) = 1
7478
npoint(::HexagonTrait, _) = 6
79+
nring(::HexagonTrait, _) = 1
7580

7681
issimple(::AbstractCurveTrait, geom) =
7782
allunique([getpoint(t, geom, i) for i in 1:npoint(geom)-1]) && allunique([getpoint(t, geom, i) for i in 2:npoint(t, geom)])

src/utils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ end
3030
"""Test whether the required interface for your `feature` has been implemented correctly."""
3131
function testfeature(feature)
3232
try
33-
@assert isfeature(geom)
33+
@assert isfeature(feature)
3434
geom = geometry(feature)
3535
@assert isgeometry(geom)
3636
props = properties(feature)

test/test_primitives.jl

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,84 @@
22

33
@testset "Developer" begin
44
# Implement interface
5-
struct MyCurve end
65
struct MyPoint end
6+
struct MyCurve end
7+
struct MyPolygon end
8+
struct MyMultiPoint end
9+
struct MyMultiCurve end
10+
struct MyMultiPolygon end
11+
struct MyCollection end
12+
713
GeoInterface.isgeometry(::MyPoint) = true
8-
GeoInterface.isgeometry(::MyCurve) = true
914
GeoInterface.geomtype(::MyPoint) = GeoInterface.PointTrait()
10-
GeoInterface.geomtype(::MyCurve) = GeoInterface.LineStringTrait()
1115
GeoInterface.ncoord(::GeoInterface.PointTrait, geom::MyPoint) = 2
1216
GeoInterface.getcoord(::GeoInterface.PointTrait, geom::MyPoint, i) = [1, 2][i]
17+
18+
GeoInterface.isgeometry(::MyCurve) = true
19+
GeoInterface.geomtype(::MyCurve) = GeoInterface.LineStringTrait()
1320
GeoInterface.ngeom(::GeoInterface.LineStringTrait, geom::MyCurve) = 2
1421
GeoInterface.getgeom(::GeoInterface.LineStringTrait, geom::MyCurve, i) = MyPoint()
1522
GeoInterface.convert(::Type{MyCurve}, ::GeoInterface.LineStringTrait, geom) = geom
1623

17-
# Test validity
18-
geom = MyCurve()
19-
@test testgeometry(geom)
20-
@test !isnothing(GeoInterface.convert(MyCurve, geom))
24+
GeoInterface.isgeometry(::MyPolygon) = true
25+
GeoInterface.geomtype(::MyPolygon) = GeoInterface.PolygonTrait()
26+
GeoInterface.ngeom(::GeoInterface.PolygonTrait, geom::MyPolygon) = 2
27+
GeoInterface.getgeom(::GeoInterface.PolygonTrait, geom::MyPolygon, i) = MyCurve()
28+
29+
30+
@testset "Point" begin
31+
geom = MyPoint()
32+
@test GeoInterface.testgeometry(geom)
33+
@test GeoInterface.x(geom) === 1
34+
@test GeoInterface.y(geom) === 2
35+
@test GeoInterface.ncoord(geom) === 2
36+
end
2137

22-
# Check functions
23-
@test GeoInterface.npoint(geom) == 2 # defaults to ngeom
24-
@test GeoInterface.coordinates(geom) == [[1, 2], [1, 2]]
25-
@test_throws MethodError GeoInterface.area(geom)
26-
point = GeoInterface.getgeom(geom, 1)
27-
@test GeoInterface.y(point) == 2
38+
@testset "LineString" begin
39+
geom = MyCurve()
40+
@test GeoInterface.testgeometry(geom)
41+
@test !isnothing(GeoInterface.convert(MyCurve, geom))
42+
43+
@test GeoInterface.npoint(geom) == 2 # defaults to ngeom
44+
@test GeoInterface.coordinates(geom) == [[1, 2], [1, 2]]
45+
@test_throws MethodError GeoInterface.area(geom)
46+
point = GeoInterface.getpoint(geom, 1)
47+
@test GeoInterface.y(point) == 2
48+
end
49+
50+
@testset "Polygon" begin
51+
geom = MyPolygon()
52+
@test GeoInterface.testgeometry(geom)
53+
54+
@test GeoInterface.nring(geom) == 2
55+
@test GeoInterface.nhole(geom) == 1
56+
@test GeoInterface.coordinates(geom) == [[[1, 2], [1, 2]], [[1, 2], [1, 2]]]
57+
lines = GeoInterface.getring(geom)
58+
line = GeoInterface.gethole(geom, 1)
59+
line = GeoInterface.getexterior(geom)
60+
@test GeoInterface.npoint(geom) == 4
61+
@test collect(GeoInterface.getpoint(geom)) == [MyPoint(), MyPoint(), MyPoint(), MyPoint()]
62+
end
2863

2964
end
3065

3166
@testset "Defaults" begin
3267
@test GeoInterface.subtrait(GeoInterface.TINTrait()) == GeoInterface.TriangleTrait
3368
end
69+
70+
@testset "Feature" begin
71+
struct Row end
72+
struct Point end
73+
74+
GeoInterface.isgeometry(::Point) = true
75+
GeoInterface.geomtype(::Point) = GeoInterface.PointTrait()
76+
GeoInterface.ncoord(::GeoInterface.PointTrait, geom::Point) = 2
77+
GeoInterface.getcoord(::GeoInterface.PointTrait, geom::Point, i) = [1, 2][i]
78+
79+
GeoInterface.isfeature(::Row) = true
80+
GeoInterface.geometry(r::Row) = Point()
81+
GeoInterface.properties(r::Row) = (; test=1)
82+
83+
@test GeoInterface.testfeature(Row())
84+
85+
end

0 commit comments

Comments
 (0)