From 558f755f5746a4ee819de87579951b7533688e5d Mon Sep 17 00:00:00 2001 From: Martin Kagamino Lehoux Date: Thu, 27 Aug 2026 18:05:59 +0200 Subject: Categorise OSM passes by highway and colour them on the ride detail map Passes are extracted from OSM PBF nodes (mountain_pass=yes) and linked to containing ways; highway road values map to road, track to track, path/footway to path, plus hiking for rock/climbing. All passes are kept, coloured distinctly (road/track/path/hiking/unknown) for road-bike validation on ride 397. Single squashed migration adds category column, cheap to re-extract. --- mountain_pass/extract_test.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'mountain_pass/extract_test.go') diff --git a/mountain_pass/extract_test.go b/mountain_pass/extract_test.go index 7eae33b..952ba08 100644 --- a/mountain_pass/extract_test.go +++ b/mountain_pass/extract_test.go @@ -68,3 +68,46 @@ func TestCountingReaderTracksBytes(t *testing.T) { } assert.Equal(t, int64(len(content)), reader.n) } + +func TestCategorizePass(t *testing.T) { + cases := []struct { + name string + tags map[string]string + highways []string + wantCategory string + }{ + {"road secondary", map[string]string{"natural": "saddle"}, []string{"secondary"}, CategoryRoad}, + {"road wins over path", map[string]string{"natural": "saddle"}, []string{"path", "secondary", "track"}, CategoryRoad}, + {"track", map[string]string{"natural": "saddle"}, []string{"track"}, CategoryTrack}, + {"path", map[string]string{"natural": "saddle"}, []string{"path"}, CategoryPath}, + {"hiking rock path", map[string]string{"natural": "rock", "sport": "climbing"}, []string{"path"}, CategoryHiking}, + {"hiking rock no way", map[string]string{"natural": "rock"}, nil, CategoryHiking}, + {"unknown no way", map[string]string{"natural": "saddle"}, nil, CategoryUnknown}, + {"via_ferrata is path", map[string]string{"natural": "saddle"}, []string{"via_ferrata"}, CategoryPath}, + {"unknown other highway", map[string]string{"natural": "saddle"}, []string{"construction"}, CategoryUnknown}, + {"hiking rock but road present is road", map[string]string{"natural": "rock", "sport": "climbing"}, []string{"secondary"}, CategoryRoad}, + } + for _, c := range cases { + tags := osm.Tags{} + for k, v := range c.tags { + tags = append(tags, osm.Tag{Key: k, Value: v}) + } + cat := categorizePass(tags, c.highways) + assert.Equal(t, c.wantCategory, cat, c.name) + } +} + +func TestIsRoadHighway(t *testing.T) { + assert.True(t, isRoadHighway("secondary")) + assert.True(t, isRoadHighway("primary")) + assert.True(t, isRoadHighway("tertiary")) + assert.True(t, isRoadHighway("residential")) + assert.False(t, isRoadHighway("track")) + assert.False(t, isRoadHighway("path")) +} + +func TestIsPathHighway(t *testing.T) { + assert.True(t, isPathHighway("path")) + assert.True(t, isPathHighway("footway")) + assert.False(t, isPathHighway("secondary")) +} -- cgit v1.3