diff options
Diffstat (limited to 'osmpass/enrich_test.go')
| -rw-r--r-- | osmpass/enrich_test.go | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/osmpass/enrich_test.go b/osmpass/enrich_test.go new file mode 100644 index 0000000..88c6a3f --- /dev/null +++ b/osmpass/enrich_test.go @@ -0,0 +1,149 @@ +package osmpass + +import ( + "database/sql" + "testing" + + _ "github.com/mattn/go-sqlite3" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestNormalizeName(t *testing.T) { + assert.Equal(t, "col du telegraphe", normalizeName("Col du Télégraphe")) + assert.Equal(t, "col de la gineste", normalizeName("Col de la Gineste")) + assert.Equal(t, normalizeName("Col de la Gineste"), normalizeName("col de la gineste")) + assert.True(t, nameMatches("Col de la Lombarde", "Col de la Lombarde / Colle della Lombarda")) + assert.False(t, nameMatches("Col de la Gatasse", "Col de la Gatasso")) +} + +func TestEnrichMountainPasses(t *testing.T) { + db := testDB(t, ` + CREATE TABLE osm_passes ( + osm_id integer unique not null, + name text, + elevation integer, + latitude real not null, + longitude real not null + ); + CREATE TABLE mountain_passes ( + external_id text unique not null, + name text not null, + department_code text not null, + elevation integer not null, + latitude real, + longitude real + ); + `) + + insert(t, db, "INSERT INTO osm_passes VALUES (1, 'Col de la Gineste', 327, 43.2, 5.4)") + insert(t, db, "INSERT INTO osm_passes VALUES (2, 'Col de la Couillole', 1678, 44.1, 7.0)") + insert(t, db, "INSERT INTO osm_passes VALUES (3, 'Col de la Gatasso', 122, 43.3, 5.5)") + insert(t, db, "INSERT INTO osm_passes VALUES (4, 'Col des Portes', NULL, 43.6, 5.8)") + + insert(t, db, "INSERT INTO mountain_passes VALUES ('c/1', 'Col de la Gineste', '13', 326, NULL, NULL)") + insert(t, db, "INSERT INTO mountain_passes VALUES ('c/2', 'Col de la Gatasse', '13', 120, NULL, NULL)") + insert(t, db, "INSERT INTO mountain_passes VALUES ('c/3', 'Col inconnu', '13', 999, NULL, NULL)") + + count, err := EnrichMountainPasses(db) + require.NoError(t, err) + assert.Equal(t, 2, count) + + var latitude, longitude float64 + err = db.QueryRow("SELECT latitude, longitude FROM mountain_passes WHERE external_id = 'c/1'").Scan(&latitude, &longitude) + require.NoError(t, err) + assert.InDelta(t, 43.2, latitude, 1e-9) + assert.InDelta(t, 5.4, longitude, 1e-9) + + err = db.QueryRow("SELECT latitude, longitude FROM mountain_passes WHERE external_id = 'c/2'").Scan(&latitude, &longitude) + require.NoError(t, err) + assert.InDelta(t, 43.3, latitude, 1e-9) + assert.InDelta(t, 5.5, longitude, 1e-9) + + var isNull bool + err = db.QueryRow("SELECT latitude IS NULL FROM mountain_passes WHERE external_id = 'c/3'").Scan(&isNull) + require.NoError(t, err) + assert.True(t, isNull) +} + +func TestEnrichMountainPassesAmbiguousElevationOnly(t *testing.T) { + db := testDB(t, ` + CREATE TABLE osm_passes ( + osm_id integer unique not null, + name text, + elevation integer, + latitude real not null, + longitude real not null + ); + CREATE TABLE mountain_passes ( + external_id text unique not null, + name text not null, + department_code text not null, + elevation integer not null, + latitude real, + longitude real + ); + `) + + insert(t, db, "INSERT INTO osm_passes VALUES (1, 'Autre Col A', 122, 43.3, 5.5)") + insert(t, db, "INSERT INTO osm_passes VALUES (2, 'Autre Col B', 130, 43.5, 5.7)") + + insert(t, db, "INSERT INTO mountain_passes VALUES ('c/1', 'Col de la Gatasse', '13', 120, NULL, NULL)") + + count, err := EnrichMountainPasses(db) + require.NoError(t, err) + assert.Zero(t, count) + + var isNull bool + err = db.QueryRow("SELECT latitude IS NULL FROM mountain_passes WHERE external_id = 'c/1'").Scan(&isNull) + require.NoError(t, err) + assert.True(t, isNull) +} + +func TestEnrichMountainPassesRejectsCrossDepartmentHomonym(t *testing.T) { + db := testDB(t, ` + CREATE TABLE osm_passes ( + osm_id integer unique not null, + name text, + elevation integer, + latitude real not null, + longitude real not null + ); + CREATE TABLE mountain_passes ( + external_id text unique not null, + name text not null, + department_code text not null, + elevation integer not null, + latitude real, + longitude real + ); + `) + + insert(t, db, "INSERT INTO osm_passes VALUES (1, 'Collet de la Selle', 1178, 43.77, 6.81)") + + insert(t, db, "INSERT INTO mountain_passes VALUES ('c/1', 'La Selle', '01', 1175, NULL, NULL)") + + count, err := EnrichMountainPasses(db) + require.NoError(t, err) + assert.Zero(t, count) + + var isNull bool + err = db.QueryRow("SELECT latitude IS NULL FROM mountain_passes WHERE external_id = 'c/1'").Scan(&isNull) + require.NoError(t, err) + assert.True(t, isNull) +} + +func testDB(t *testing.T, schema string) *sql.DB { + db, err := sql.Open("sqlite3", ":memory:") + require.NoError(t, err) + db.SetMaxOpenConns(1) + t.Cleanup(func() { db.Close() }) + _, err = db.Exec(schema) + require.NoError(t, err) + return db +} + +func insert(t *testing.T, db *sql.DB, query string) { + _, err := db.Exec(query) + require.NoError(t, err) +} |