160 lines
4.2 KiB
Go
160 lines
4.2 KiB
Go
package mapping
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/omniscale/imposm3/element"
|
|
)
|
|
|
|
func BenchmarkTagMatch(b *testing.B) {
|
|
m, err := NewMapping("test_mapping.yml")
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
matcher := m.PolygonMatcher()
|
|
for i := 0; i < b.N; i++ {
|
|
e := element.Relation{}
|
|
e.Tags = element.Tags{"landuse": "forest", "name": "Forest", "source": "bling", "tourism": "zoo"}
|
|
if m := matcher.MatchRelation(&e); len(m) != 1 {
|
|
b.Fatal(m)
|
|
}
|
|
}
|
|
}
|
|
|
|
func makeMember(id int64, tags element.Tags) element.Member {
|
|
way := &element.Way{
|
|
OSMElem: element.OSMElem{Id: id, Tags: tags},
|
|
Refs: []int64{0, 1, 2, 0}, // fake closed way, req. for SelectRelationPolygons
|
|
}
|
|
return element.Member{Id: id, Type: element.WAY, Role: "", Way: way}
|
|
}
|
|
|
|
func makeMemberRole(id int64, tags element.Tags, role string) element.Member {
|
|
way := &element.Way{
|
|
OSMElem: element.OSMElem{Id: id, Tags: tags},
|
|
Refs: []int64{0, 1, 2, 0}, // fake closed way, req. for SelectRelationPolygons
|
|
}
|
|
return element.Member{Id: id, Type: element.WAY, Role: role, Way: way}
|
|
}
|
|
|
|
func TestSelectRelationPolygonsSimple(t *testing.T) {
|
|
mapping, err := NewMapping("test_mapping.yml")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r := element.Relation{}
|
|
r.Tags = element.Tags{"landuse": "park", "type": "multipolygon"}
|
|
r.Members = []element.Member{
|
|
makeMember(0, element.Tags{"landuse": "forest"}),
|
|
makeMember(1, element.Tags{"landuse": "park"}),
|
|
makeMember(2, element.Tags{"waterway": "riverbank"}),
|
|
makeMember(4, element.Tags{"foo": "bar"}),
|
|
}
|
|
filtered := SelectRelationPolygons(
|
|
mapping.PolygonMatcher(),
|
|
&r,
|
|
)
|
|
if len(filtered) != 1 {
|
|
t.Fatal(filtered)
|
|
}
|
|
if filtered[0].Id != 1 {
|
|
t.Fatal(filtered[0])
|
|
}
|
|
}
|
|
|
|
func TestSelectRelationPolygonsUnrelatedTags(t *testing.T) {
|
|
mapping, err := NewMapping("test_mapping.yml")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r := element.Relation{}
|
|
r.Tags = element.Tags{"landuse": "park", "type": "multipolygon"}
|
|
r.Members = []element.Member{
|
|
makeMember(0, element.Tags{"landuse": "park", "layer": "2", "name": "foo"}),
|
|
makeMember(1, element.Tags{"landuse": "forest"}),
|
|
}
|
|
filtered := SelectRelationPolygons(
|
|
mapping.PolygonMatcher(),
|
|
&r,
|
|
)
|
|
if len(filtered) != 1 {
|
|
t.Fatal(filtered)
|
|
}
|
|
if filtered[0].Id != 0 {
|
|
t.Fatal(filtered)
|
|
}
|
|
}
|
|
|
|
func TestSelectRelationPolygonsMultiple(t *testing.T) {
|
|
mapping, err := NewMapping("test_mapping.yml")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r := element.Relation{}
|
|
r.Tags = element.Tags{"landuse": "park", "type": "multipolygon"}
|
|
r.Members = []element.Member{
|
|
makeMember(0, element.Tags{"landuse": "park"}),
|
|
makeMember(1, element.Tags{"natural": "forest"}),
|
|
makeMember(2, element.Tags{"landuse": "park"}),
|
|
makeMember(3, element.Tags{"highway": "pedestrian"}),
|
|
makeMember(4, element.Tags{"landuse": "park", "layer": "2", "name": "foo"}),
|
|
}
|
|
filtered := SelectRelationPolygons(
|
|
mapping.PolygonMatcher(),
|
|
&r,
|
|
)
|
|
if len(filtered) != 3 {
|
|
t.Fatal(filtered)
|
|
}
|
|
if filtered[0].Id != 0 || filtered[1].Id != 2 || filtered[2].Id != 4 {
|
|
t.Fatal(filtered)
|
|
}
|
|
}
|
|
|
|
func TestSelectRelationPolygonsMultipleTags(t *testing.T) {
|
|
mapping, err := NewMapping("test_mapping.yml")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r := element.Relation{}
|
|
r.Tags = element.Tags{"landuse": "forest", "natural": "scrub", "type": "multipolygon"}
|
|
r.Members = []element.Member{
|
|
makeMember(0, element.Tags{"natural": "scrub"}),
|
|
makeMember(1, element.Tags{"landuse": "forest"}),
|
|
}
|
|
filtered := SelectRelationPolygons(
|
|
mapping.PolygonMatcher(),
|
|
&r,
|
|
)
|
|
// TODO both should be filterd out, but we only get one,
|
|
// because we match only one tag per table
|
|
if len(filtered) != 1 {
|
|
t.Fatal(filtered)
|
|
}
|
|
}
|
|
|
|
func TestSelectRelationPolygonsMultipleTagsOnWay(t *testing.T) {
|
|
mapping, err := NewMapping("test_mapping.yml")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r := element.Relation{}
|
|
r.Tags = element.Tags{"waterway": "riverbank", "type": "multipolygon"}
|
|
r.Members = []element.Member{
|
|
makeMemberRole(0, element.Tags{"waterway": "riverbank", "natural": "water"}, "outer"),
|
|
makeMemberRole(1, element.Tags{"natural": "water"}, "inner"),
|
|
makeMemberRole(2, element.Tags{"place": "islet"}, "inner"),
|
|
}
|
|
filtered := SelectRelationPolygons(
|
|
mapping.PolygonMatcher(),
|
|
&r,
|
|
)
|
|
|
|
if len(filtered) != 1 {
|
|
t.Fatal(filtered)
|
|
}
|
|
if filtered[0].Id != 0 {
|
|
t.Fatal(filtered)
|
|
}
|
|
}
|