Skip to content

v0.2.55..v0.2.56 changeset AddressScoreExtractorTest.cpp

Garret Voltz edited this page Aug 14, 2020 · 3 revisions
diff --git a/hoot-core-test/src/test/cpp/hoot/core/algorithms/extractors/AddressScoreExtractorTest.cpp b/hoot-core-test/src/test/cpp/hoot/core/algorithms/extractors/AddressScoreExtractorTest.cpp
index 9988205..decce36 100644
--- a/hoot-core-test/src/test/cpp/hoot/core/algorithms/extractors/AddressScoreExtractorTest.cpp
+++ b/hoot-core-test/src/test/cpp/hoot/core/algorithms/extractors/AddressScoreExtractorTest.cpp
@@ -31,7 +31,6 @@
 #include <hoot/core/elements/Way.h>
 #include <hoot/core/algorithms/extractors/AddressScoreExtractor.h>
 #include <hoot/core/language/ToEnglishDictionaryTranslator.h>
-#include <hoot/core/conflate/address/AddressTagKeys.h>
 
 // CPP Unit
 #include <cppunit/extensions/HelperMacros.h>
@@ -45,11 +44,8 @@ namespace hoot
 {
 
 /*
- * Its possible we might want to eventually break the parsing and normalization tests out
- * separately.
- *
- * This test took a hit in readability when moved from PoiPolygonAddressScoreExtractor to the more
- * generic AddressScoreExtractor, so could use some simplification.
+ * Its possible we might want to eventually create separate AddressParserTest and
+ * AddressNormalizerTest tests.
  */
 class AddressScoreExtractorTest : public HootTestFixture
 {
@@ -65,13 +61,16 @@ class AddressScoreExtractorTest : public HootTestFixture
   CPPUNIT_TEST(translateTagValueTest);
   CPPUNIT_TEST(invalidFullAddressTest);
   CPPUNIT_TEST(invalidComponentAddressTest);
-  CPPUNIT_TEST(addressNormalizationTest);
+  CPPUNIT_TEST(additionalTagsTest);
+  CPPUNIT_TEST(noStreetNumberTest);
+  CPPUNIT_TEST(partialMatchTest);
   CPPUNIT_TEST_SUITE_END();
 
 public:
 
   AddressScoreExtractorTest()
   {
+    setResetType(ResetAll);
   }
 
   void runTagTest()
@@ -85,20 +84,36 @@ public:
     OsmMapPtr map(new OsmMap());
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
     map->addNode(node1);
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
-    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 main street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 main street");
     map->addWay(way1);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
     NodePtr node2(new Node(Status::Unknown1, -2, Coordinate(0.0, 0.0), 15.0));
-    node2->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    node2->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
     map->addNode(node2);
     WayPtr way2(new Way(Status::Unknown2, -2, 15.0));
-    way2->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "567 first street");
+    way2->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "567 first street");
     map->addWay(way2);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node2, way2), 0.01);
+
+    NodePtr node3(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+    node3->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    map->addNode(node3);
+    WayPtr way3(new Way(Status::Unknown2, -1, 15.0));
+    way3->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 main St");
+    map->addWay(way3);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node3, way3), 0.0);
+
+    NodePtr node4(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+    node4->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Avenue");
+    map->addNode(node4);
+    WayPtr way4(new Way(Status::Unknown2, -1, 15.0));
+    way4->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 main Ave");
+    map->addWay(way4);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node4, way4), 0.0);
   }
 
   void runCombinedTagTest()
@@ -109,22 +124,22 @@ public:
     OsmMapPtr map(new OsmMap());
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
-    node1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node1->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node1);
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addWay(way1);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
     NodePtr node2(new Node(Status::Unknown1, -2, Coordinate(0.0, 0.0), 15.0));
-    node2->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node2->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node2->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node2->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node2);
     WayPtr way2(new Way(Status::Unknown2, -2, 15.0));
-    way2->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "567");
-    way2->getTags().set(TestUtils::STREET_TAG_NAME, "first street");
+    way2->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "567");
+    way2->getTags().set(AddressTagKeys::STREET_TAG_NAME, "first street");
     map->addWay(way2);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node2, way2), 0.01);
   }
@@ -137,32 +152,32 @@ public:
     OsmMapPtr map(new OsmMap());
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
-    node1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123-125");
-    node1->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123-125");
+    node1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node1);
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "124");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "124");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addWay(way1);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
     NodePtr node2(new Node(Status::Unknown1, -2, Coordinate(0.0, 0.0), 15.0));
-    node2->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123-125");
-    node2->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node2->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123-125");
+    node2->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node2);
     WayPtr way2(new Way(Status::Unknown2, -2, 15.0));
-    way2->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way2->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way2->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way2->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addWay(way2);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node2, way2), 0.0);
 
     NodePtr node3(new Node(Status::Unknown1, -3, Coordinate(0.0, 0.0), 15.0));
-    node3->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123-125");
-    node3->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node3->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123-125");
+    node3->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node3);
     WayPtr way3(new Way(Status::Unknown2, -3, 15.0));
-    way3->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "567");
-    way3->getTags().set(TestUtils::STREET_TAG_NAME, "first street");
+    way3->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "567");
+    way3->getTags().set(AddressTagKeys::STREET_TAG_NAME, "first street");
     map->addWay(way3);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node3, way3), 0.01);
   }
@@ -176,29 +191,29 @@ public:
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
     node1->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME_2, "Main Street 123 20121 mytown");
+      AddressTagKeys::FULL_ADDRESS_TAG_NAME_2, "Main Street 123 20121 mytown");
     map->addNode(node1);
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
-    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME_2, "main street 123");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME_2, "main street 123");
     map->addWay(way1);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
     NodePtr node2(new Node(Status::Unknown1, -2, Coordinate(0.0, 0.0), 15.0));
     node2->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME_2, "Main Street 123 20121 mytown");
+      AddressTagKeys::FULL_ADDRESS_TAG_NAME_2, "Main Street 123 20121 mytown");
     map->addNode(node2);
     WayPtr way2(new Way(Status::Unknown2, -2, 15.0));
     way2->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME_2, "first street 567");
+      AddressTagKeys::FULL_ADDRESS_TAG_NAME_2, "first street 567");
     map->addWay(way2);
-    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node2, way2), 0.01);
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node2, way2), 0.01);
 
     NodePtr node3(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
     node3->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME_2, "ZENTRALLÄNDSTRASSE 40 81379 MÜNCHEN");
+      AddressTagKeys::FULL_ADDRESS_TAG_NAME_2, "ZENTRALLÄNDSTRASSE 40 81379 MÜNCHEN");
     map->addNode(node3);
     WayPtr way3(new Way(Status::Unknown2, -1, 15.0));
-    way3->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME_2, "40 ZENTRALLÄNDSTRASSE");
+    way3->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME_2, "40 ZENTRALLÄNDSTRASSE");
     map->addWay(way3);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node3, way3), 0.0);
   }
@@ -211,12 +226,12 @@ public:
     OsmMapPtr map(new OsmMap());
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
-    node1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node1->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node1);
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123a");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123a");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addWay(way1);
 
     uut.setAllowLenientHouseNumberMatching(true);
@@ -238,25 +253,91 @@ public:
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
     map->addWay(way1);
 
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "16th &amp; Bryant Street");
-    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "16th and Bryant Street");
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones Street and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones Street and Bryant Street");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
-    // Haven't wrapped my head around how to deal with these yet but not worrying too much yet, b/c
-    // haven't found any instances where the inability to match address intersection has kept
-    // something from conflating. If we need it, we should be able to come up with some custom logic
-    // to handle cases like below if there's no way to make libpostal do it. AddressParser may need
-    // some refactoring, though.
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "16th &amp; Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "16th and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
-//    // sometimes the road type is expressed as plural in this type of intersection naming
-//    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "16th &amp; Bryant Street");
-//    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "16th and Bryant Streets");
-//    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "16th St and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "16th and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones St and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones Street and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones St and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones St and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones St and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones and Bryant");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones St and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones &amp; Bryant");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    // If an intersection address comes from a name tag, we must be more strict. In that case, we
+    // require that the address end with a street type token. However, I don't think this is
+    // foolproof yet and will deal with exceptions as they come along.
+
+    node1->getTags().clear();
+    node1->getTags().set("name", "Jones St and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones Street and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().set("name", "Jones and Bryant Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones Street and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
-//    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "6TH &amp; HOFF ST. PARKING GARAGE");
+    node1->getTags().set("name", "Jones and Bryant");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones Street and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().set("name", "Jones Street and Bryant");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Jones Street and Bryant Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
+
+    // sometimes the road type is expressed as plural with intersections
+    node1->getTags().clear();
+    node1->getTags().set("address", "CASTRO AND DUBOCE STREETS");
+    way1->getTags().clear();
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "45");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Castro Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.8, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().clear();
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "16th &amp; Bryant Street");
+    way1->getTags().clear();
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "16th and Bryant Streets");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().clear();
+    node1->getTags().set("address", "19th Ave & Wawona St");
+    way1->getTags().clear();
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "2695");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "19th Avenue");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.8, uut.extract(*map, node1, way1), 0.0);
+
+    // Below are some that have been seen but haven't figured out how to deal with them yet. Not
+    // worrying about them at this time, b/c haven't found any instances where the inability to
+    // match address intersection has kept something from conflating.
+
+//    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "6TH &amp; HOFF ST. PARKING GARAGE");
 //    way1->getTags().set(
-//      TestUtils::FULL_ADDRESS_TAG_NAME, "6th street and Hoff Street Parking Garage");
+//      AddressTagKeys::FULL_ADDRESS_TAG_NAME, "6th street and Hoff Street Parking Garage");
 //    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    // Have also seen this: 'name = Valencia @ 14th Streets'. Not really sure @ should be added to
+    // the intersection split tokens, but maybe.
   }
 
   void runWayTest()
@@ -267,26 +348,26 @@ public:
     OsmMapPtr map(new OsmMap());
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
-    node1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node1->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node1);
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
     NodePtr node2(new Node(Status::Unknown1, -2, Coordinate(0.0, 0.0), 15.0));
-    node2->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node2->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    node2->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node2->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addNode(node2);
     way1->addNode(node2->getId());
     map->addWay(way1);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
     NodePtr node3(new Node(Status::Unknown1, -3, Coordinate(0.0, 0.0), 15.0));
-    node3->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node3->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node3->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node3->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node3);
     WayPtr way2(new Way(Status::Unknown2, -2, 15.0));
     NodePtr node4(new Node(Status::Unknown2, -4, Coordinate(0.0, 0.0), 15.0));
-    node4->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "567");
-    node4->getTags().set(TestUtils::STREET_TAG_NAME, "first street");
+    node4->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "567");
+    node4->getTags().set(AddressTagKeys::STREET_TAG_NAME, "first street");
     map->addNode(node4);
     way2->addNode(node4->getId());
     map->addWay(way2);
@@ -295,13 +376,13 @@ public:
     NodePtr node5(new Node(Status::Unknown1, -5, Coordinate(0.0, 0.0), 15.0));
     map->addNode(node5);
     WayPtr way3(new Way(Status::Unknown2, -3, 15.0));
-    way3->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way3->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    way3->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way3->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     way3->addNode(node5->getId());
     map->addWay(way3);
     WayPtr way4(new Way(Status::Unknown2, -4, 15.0));
-    way4->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way4->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    way4->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way4->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     way4->addNode(node5->getId());
     map->addWay(way4);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, way3, way4), 0.01);
@@ -315,52 +396,52 @@ public:
     OsmMapPtr map(new OsmMap());
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
-    node1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node1->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node1);
     RelationPtr relation1(new Relation(Status::Unknown2, -1, 15.0));
     NodePtr node2(new Node(Status::Unknown1, -2, Coordinate(0.0, 0.0), 15.0));
-    node2->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node2->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    node2->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node2->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addNode(node2);
     relation1->addElement("test", node2->getElementId());
     map->addRelation(relation1);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, relation1), 0.0);
 
     NodePtr node4(new Node(Status::Unknown1, -4, Coordinate(0.0, 0.0), 15.0));
-    node4->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node4->getTags().set(TestUtils::STREET_TAG_NAME, "Main Street");
+    node4->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node4->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Main Street");
     map->addNode(node4);
     RelationPtr relation3(new Relation(Status::Unknown2, -3, 15.0));
     NodePtr node5(new Node(Status::Unknown1, -5, Coordinate(0.0, 0.0), 15.0));
-    node5->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "567");
-    node5->getTags().set(TestUtils::STREET_TAG_NAME, "first street");
+    node5->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "567");
+    node5->getTags().set(AddressTagKeys::STREET_TAG_NAME, "first street");
     map->addNode(node5);
     relation3->addElement("test", node5->getElementId());
     map->addRelation(relation3);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node4, relation3), 0.01);
 
     NodePtr node6(new Node(Status::Unknown1, -6, Coordinate(0.0, 0.0), 15.0));
-    node6->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "567");
-    node6->getTags().set(TestUtils::STREET_TAG_NAME, "first street");
+    node6->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "567");
+    node6->getTags().set(AddressTagKeys::STREET_TAG_NAME, "first street");
     map->addNode(node6);
     RelationPtr relation4(new Relation(Status::Unknown2, -4, 15.0));
     WayPtr way3(new Way(Status::Unknown2, -3, 15.0));
-    way3->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way3->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way3->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way3->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addWay(way3);
     relation4->addElement("test", way3->getElementId());
     map->addRelation(relation4);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node6, relation4), 0.01);
 
     NodePtr node7(new Node(Status::Unknown1, -7, Coordinate(0.0, 0.0), 15.0));
-    node7->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    node7->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    node7->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    node7->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addNode(node7);
     RelationPtr relation5(new Relation(Status::Unknown2, -5, 15.0));
     WayPtr way4(new Way(Status::Unknown2, -4, 15.0));
-    way4->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way4->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way4->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way4->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addWay(way4);
     relation5->addElement("test", way4->getElementId());
     map->addRelation(relation5);
@@ -372,13 +453,13 @@ public:
     map->addWay(way5);
     RelationPtr relation6(new Relation(Status::Unknown2, -6, 15.0));
     relation6->addElement("test", way5->getElementId());
-    relation6->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    relation6->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    relation6->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    relation6->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addRelation(relation5);
     RelationPtr relation7(new Relation(Status::Unknown2, -7, 15.0));
     relation7->addElement("test", node8->getElementId());
-    relation7->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    relation7->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    relation7->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    relation7->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     map->addRelation(relation7);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, relation6, relation7), 0.01);
   }
@@ -400,21 +481,21 @@ public:
     dictTranslator->setTokenizeInput(false);
 
     NodePtr node1(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
     map->addNode(node1);
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
     way1->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME, QString::fromUtf8("123 Hauptstraße"));
+      AddressTagKeys::FULL_ADDRESS_TAG_NAME, QString::fromUtf8("123 Hauptstraße"));
     map->addWay(way1);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
     NodePtr node2(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
     node2->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME_2, "Central Border Street 40 81379");
+      AddressTagKeys::FULL_ADDRESS_TAG_NAME_2, "Central Border Street 40 81379");
     map->addNode(node2);
     WayPtr way2(new Way(Status::Unknown2, -1, 15.0));
     way2->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME_2,
+      AddressTagKeys::FULL_ADDRESS_TAG_NAME_2,
       QString::fromUtf8("ZENTRALLÄNDE STRASSE 40 81379 MÜNCHEN"));
     map->addWay(way2);
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node2, way2), 0.0);
@@ -437,27 +518,27 @@ public:
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
     map->addWay(way1);
 
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
-    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "this isn't an address");
-    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node1, way1), 0.0);
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "this isn't an address");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
 
     node1->getTags().clear();
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "this isn't an address");
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "this isn't an address");
     way1->getTags().clear();
-    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
-    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node1, way1), 0.0);
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
 
     node1->getTags().clear();
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 this isn't an address");
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 this isn't an address");
     way1->getTags().clear();
-    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node1, way1), 0.0);
 
     node1->getTags().clear();
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "this isn't an address street");
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "this isn't an address street");
     way1->getTags().clear();
-    way1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
-    CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node1, way1), 0.0);
+    way1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
   }
 
   void invalidComponentAddressTest()
@@ -472,35 +553,40 @@ public:
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
     map->addWay(way1);
 
-    node1->getTags().set(TestUtils::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+    node1->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
 
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "this isn't an address");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "this isn't an address");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node1, way1), 0.0);
 
     way1->getTags().clear();
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "blah");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "blah");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node1, way1), 0.0);
 
     way1->getTags().clear();
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "blah");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "street");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "blah");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "street");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, uut.extract(*map, node1, way1), 0.0);
 
     way1->getTags().clear();
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "main street");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "main street");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
 
     way1->getTags().clear();
-    way1->getTags().set(TestUtils::HOUSE_NUMBER_TAG_NAME, "123");
-    way1->getTags().set(TestUtils::STREET_TAG_NAME, "");
+    way1->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "123");
+    way1->getTags().set(AddressTagKeys::STREET_TAG_NAME, "");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
   }
 
-  void addressNormalizationTest()
+  void additionalTagsTest()
   {
+    QStringList additionalTagKeys;
+    additionalTagKeys.append("note");
+    additionalTagKeys.append("description");
+    conf().set(ConfigOptions::getAddressAdditionalTagKeysKey(), additionalTagKeys);
+
     AddressScoreExtractor uut;
     uut.setConfiguration(conf());
     uut.setCacheEnabled(false);
@@ -511,22 +597,202 @@ public:
     WayPtr way1(new Way(Status::Unknown2, -1, 15.0));
     map->addWay(way1);
 
-    node1->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME,
-      QString::fromUtf8("Quatre-vingt-douze Ave des Champs-Élysées"));
-    way1->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME, QString::fromUtf8("92 avenue des champs-elysees"));
+    node1->getTags().set("note", "123 Main Street");
+    way1->getTags().set("note", "123 main St");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
 
     node1->getTags().clear();
-    node1->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME,
-      QString::fromUtf8("Quatre-vingt-douze Ave des Champs-Élysées"));
+    node1->getTags().set("description", "123 Main Street");
     way1->getTags().clear();
-    way1->getTags().set(
-      TestUtils::FULL_ADDRESS_TAG_NAME, QString::fromUtf8("92 avenue des champs elysees"));
+    way1->getTags().set("description", "123 main St");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
+
+    node1->getTags().clear();
+    node1->getTags().set("blah", "123 Main Street");
+    way1->getTags().clear();
+    way1->getTags().set("blah", "123 main St");
+    CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node1, way1), 0.0);
+
+    // name gets parsed by default
+    node1->getTags().clear();
+    node1->getTags().set("name", "123 Main Street");
+    way1->getTags().clear();
+    way1->getTags().set("name", "123 main St");
     CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node1, way1), 0.0);
   }
+
+  void noStreetNumberTest()
+  {
+    AddressScoreExtractor uut;
+    uut.setConfiguration(conf());
+    uut.setCacheEnabled(false);
+
+    {
+      OsmMapPtr map(new OsmMap());
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Main Street");
+      map->addNode(node);
+
+      WayPtr way(new Way(Status::Unknown2, -1, 15.0));
+      way->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+      map->addWay(way);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      OsmMapPtr map(new OsmMap());
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "123 Main Street");
+      map->addNode(node);
+
+      WayPtr way(new Way(Status::Unknown2, -1, 15.0));
+      way->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Main Street");
+      map->addWay(way);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      OsmMapPtr map(new OsmMap());
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Main Street");
+      map->addNode(node);
+
+      WayPtr way(new Way(Status::Unknown2, -1, 15.0));
+      way->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Main Street");
+      map->addWay(way);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      OsmMapPtr map(new OsmMap());
+
+      WayPtr way(new Way(Status::Unknown1, -1, 15.0));
+      way->getTags().set(AddressTagKeys::CITY_TAG_NAME, "San Ignacio");
+      way->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Hudson Street");
+      map->addWay(way);
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set(AddressTagKeys::FULL_ADDRESS_TAG_NAME, "Hudson Street, San Ignacio, Belize");
+      map->addNode(node);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      OsmMapPtr map(new OsmMap());
+
+      WayPtr way(new Way(Status::Unknown1, -1, 15.0));
+      // See note in AddressTagKeys::_getAddressTag. Not completely sure that this is a valid
+      // address but going with it for now.
+      way->getTags().set(AddressTagKeys::HOUSE_NAME_TAG_NAME, "462");
+      way->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Duboce Avenue");
+      map->addWay(way);
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set(AddressTagKeys::HOUSE_NAME_TAG_NAME, "462");
+      node->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Duboce Avenue");
+      map->addNode(node);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      OsmMapPtr map(new OsmMap());
+
+      WayPtr way(new Way(Status::Unknown1, -1, 15.0));
+      // See note in AddressTagKeys::_getAddressTag. Don't allow anything other than a number for
+      // addr:housename posing as a street num.
+      way->getTags().set(AddressTagKeys::HOUSE_NAME_TAG_NAME, "462 blah");
+      way->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Duboce Avenue");
+      map->addWay(way);
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Duboce Avenue");
+      map->addNode(node);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      OsmMapPtr map(new OsmMap());
+
+      WayPtr way(new Way(Status::Unknown1, -1, 15.0));
+      way->getTags().set(AddressTagKeys::HOUSE_NAME_TAG_NAME, "462");
+      way->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Duboce Avenue");
+      map->addWay(way);
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Duboce Avenue");
+      map->addNode(node);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.0, uut.extract(*map, node, way), 0.0);
+    }
+  }
+
+  void partialMatchTest()
+  {
+    AddressScoreExtractor uut;
+    uut.setConfiguration(conf());
+    uut.setCacheEnabled(false);
+
+    {
+      // matching street names and house numbers, one doesn't have a suffix
+
+      OsmMapPtr map(new OsmMap());
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set("address", "670 Brunswick");
+      map->addNode(node);
+
+      WayPtr way(new Way(Status::Unknown2, -1, 15.0));
+      way->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "670");
+      way->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Brunswick Street");
+      map->addWay(way);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(0.8, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      // street names are spelled very slightly differently
+
+      OsmMapPtr map(new OsmMap());
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set("name", "100 Whitney Young Circle");
+      map->addNode(node);
+
+      WayPtr way(new Way(Status::Unknown2, -1, 15.0));
+      way->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "100");
+      way->getTags().set(AddressTagKeys::HOUSE_NAME_TAG_NAME, "Whitney Yound Circle");
+      map->addWay(way);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(0.8, uut.extract(*map, node, way), 0.0);
+    }
+
+    {
+      // range address where one has no suffix
+
+      OsmMapPtr map(new OsmMap());
+
+      NodePtr node(new Node(Status::Unknown1, -1, Coordinate(0.0, 0.0), 15.0));
+      node->getTags().set("address", "150 Sutter Street");
+      map->addNode(node);
+
+      WayPtr way(new Way(Status::Unknown2, -1, 15.0));
+      way->getTags().set(AddressTagKeys::HOUSE_NAME_TAG_NAME, "Hallidie Building");
+      way->getTags().set(AddressTagKeys::HOUSE_NUMBER_TAG_NAME, "130-150");
+      way->getTags().set(AddressTagKeys::STREET_TAG_NAME, "Sutter");
+      map->addWay(way);
+
+      CPPUNIT_ASSERT_DOUBLES_EQUAL(0.8, uut.extract(*map, node, way), 0.0);
+    }
+  }
 };
 
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(AddressScoreExtractorTest, "slow");
Clone this wiki locally