package mountain_pass import ( "io" "strings" "testing" "github.com/paulmach/osm" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestIsMountainPass(t *testing.T) { cases := []struct { name string tags map[string]string want bool }{ {"tagged", map[string]string{"mountain_pass": "yes", "name": "Col de la Gineste"}, true}, {"legacy natural", map[string]string{"natural": "mountain_pass"}, true}, {"not a pass", map[string]string{"natural": "saddle", "name": "Col de la Gineste"}, false}, {"no tags", map[string]string{}, false}, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { node := &osm.Node{Tags: osm.Tags{}} for key, value := range c.tags { node.Tags = append(node.Tags, osm.Tag{Key: key, Value: value}) } assert.Equal(t, c.want, isMountainPass(node)) }) } } func TestParseElevation(t *testing.T) { cases := []struct { input string want int ok bool }{ {"1320", 1320, true}, {"1320 m", 1320, true}, {" 447.5", 447, true}, {"", 0, false}, {"unknown", 0, false}, } for _, c := range cases { value, ok := parseElevation(c.input) assert.Equal(t, c.want, value) assert.Equal(t, c.ok, ok) } } func TestCountingReaderTracksBytes(t *testing.T) { const content = "0123456789abcdef" reader := &countingReader{r: strings.NewReader(content)} buf := make([]byte, 4) var total int64 for { n, err := reader.Read(buf) total += int64(n) require.Equal(t, total, reader.n) if err == io.EOF { break } require.NoError(t, err) } 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")) }