Skip to content
Snippets Groups Projects
Commit 56f2c965 authored by Simon McVittie's avatar Simon McVittie Committed by Frédéric Dalleau
Browse files

TrpPlace: add full support for place: URIs as currently specified

parent 6cc3aa1f
No related branches found
No related tags found
No related merge requests found
......@@ -123,6 +123,42 @@ test_builder (void)
g_assert_cmpint (trp_place_get_crs (place), ==,
TRP_COORDINATE_REFERENCE_SYSTEM_WGS84);
g_assert_cmpstr (trp_place_get_location_string (place), ==, "Nowhere");
trp_place_builder_set_location_string (builder, NULL);
trp_place_builder_set_area (builder, "Southwick");
trp_place_builder_set_locality (builder, "Brighton");
trp_place_builder_set_region (builder, "Sussex");
trp_place_builder_set_postal_code (builder, "BN42 4ED");
trp_place_builder_set_street (builder, "Albion Street");
trp_place_builder_set_building (builder, "Nautilus House");
trp_place_builder_set_formatted_address (builder,
"Shoreham Port\n"
"Nautilus House\n"
"90-100 Albion Street\n"
"Southwick\n"
"Brighton\n"
"BN42 4ED\n");
place = trp_place_builder_copy (builder);
location_string = trp_place_force_location_string (place);
g_assert_cmpstr (location_string, ==,
trp_place_get_formatted_address (place));
g_assert_cmpstr (location_string, ==, "Shoreham Port\n"
"Nautilus House\n"
"90-100 Albion Street\n"
"Southwick\n"
"Brighton\n"
"BN42 4ED\n");
g_clear_pointer (&location_string, g_free);
g_clear_object (&place);
trp_place_builder_set_location_string (builder, "Shoreham Port");
trp_place_builder_set_building (builder, "90-100");
place = trp_place_builder_copy (builder);
location_string = trp_place_force_location_string (place);
g_assert_cmpstr (location_string, ==, "Shoreham Port");
g_assert_cmpstr (trp_place_get_building (place), ==, "90-100");
g_clear_pointer (&location_string, g_free);
g_clear_object (&place);
}
static void
......@@ -131,6 +167,7 @@ test_to_uri (void)
g_autoptr (TrpPlace) place = NULL;
g_autoptr (TrpPlaceBuilder) builder = NULL;
g_autofree gchar *uri = NULL;
g_autofree gchar *any_uri = NULL;
builder = trp_place_builder_new (NULL);
......@@ -174,6 +211,69 @@ test_to_uri (void)
"place:Somewhere;location=geo:50.5%2C-0.25%2C2.375%3Bu%3D1");
g_clear_pointer (&uri, g_free);
g_clear_object (&place);
g_clear_pointer (&builder, trp_place_builder_unref);
builder = trp_place_builder_new (NULL);
trp_place_builder_set_location_string (builder, "Shoreham Port");
place = trp_place_builder_copy (builder);
uri = trp_place_to_uri (place, TRP_URI_SCHEME_GEO);
/* There is no geo: URI if there isn't enough information */
g_assert_cmpstr (uri, ==, NULL);
uri = trp_place_to_uri (place, TRP_URI_SCHEME_PLACE);
g_assert_cmpstr (uri, ==, "place:Shoreham%20Port");
any_uri = trp_place_to_uri (place, TRP_URI_SCHEME_ANY);
g_assert_cmpstr (any_uri, ==, uri);
g_clear_pointer (&any_uri, g_free);
g_clear_pointer (&uri, g_free);
g_clear_object (&place);
trp_place_builder_set_country_code (builder, "gb");
trp_place_builder_set_area (builder, "Southwick");
trp_place_builder_set_locality (builder, "Brighton");
trp_place_builder_set_region (builder, "Sussex");
trp_place_builder_set_postal_code (builder, "BN42 4ED");
trp_place_builder_set_street (builder, "Albion Street");
trp_place_builder_set_building (builder, "90-100");
trp_place_builder_set_formatted_address (builder,
"Shoreham Port\n"
"Nautilus House\n"
"90-100 Albion Street\n"
"Southwick\n"
"Brighton\n"
"BN42 4ED\n");
place = trp_place_builder_copy (builder);
uri = trp_place_to_uri (place, TRP_URI_SCHEME_GEO);
/* There is no geo: URI if there isn't enough information */
g_assert_cmpstr (uri, ==, NULL);
uri = trp_place_to_uri (place, TRP_URI_SCHEME_PLACE);
g_assert_cmpstr (uri, ==,
"place:Shoreham%20Port"
/* This test relies on an implementation detail: we sort
* parameters alphabetically. This is not an API
* guarantee, but for any parameters whose order is
* irrelevant, it makes sense to do. */
";area=Southwick"
";country=GB"
";formatted-address="
"Shoreham%20Port%0A"
"Nautilus%20House%0A"
"90-100%20Albion%20Street%0A"
"Southwick%0A"
"Brighton%0A"
"BN42%204ED%0A"
";locality=Brighton"
";postal-code=BN42%204ED"
";region=Sussex"
";street=Albion%20Street"
";building=90-100"
);
any_uri = trp_place_to_uri (place, TRP_URI_SCHEME_ANY);
g_assert_cmpstr (any_uri, ==, uri);
g_clear_pointer (&any_uri, g_free);
g_clear_pointer (&uri, g_free);
g_clear_object (&place);
}
/* Use the implementation detail that all the unknown values are
......@@ -189,6 +289,14 @@ typedef struct
gdouble altitude;
gdouble uncertainty;
const char *location_string;
const char *postal_code;
const char *country_code;
const char *region;
const char *locality;
const char *area;
const char *street;
const char *building;
const char *formatted_address;
} SampleUri;
static const SampleUri good_uris[] =
......@@ -212,6 +320,12 @@ static const SampleUri good_uris[] =
{ "place:Hello%20world", 0, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Hello world" },
{ "place:X", 0, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "X" },
{ "place:X;x-treasure=buried-here", 0, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "X" },
{ "place:Whatever;postal-code=012345;country=bq;region=Here"
";locality=Sometown;area=Somewhere;street=West%20Wallaby%20Street"
";building=42;formatted-address=...",
0, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever",
"012345", "BQ", "Here", "Sometown", "Somewhere", "West Wallaby Street",
"42", "..." },
};
static const struct
......@@ -240,6 +354,10 @@ static const struct
{ "place://hello", TRP_PLACE_ERROR_INVALID_URI },
{ "place:/hello;location=geo:0%2C1", TRP_PLACE_ERROR_INVALID_URI },
{ "place:hello;location=geo:/0%2C1", TRP_PLACE_ERROR_INVALID_URI },
{ "place:Whatever;country=G", TRP_PLACE_ERROR_INVALID_COUNTRY_CODE },
{ "place:Whatever;country=826", TRP_PLACE_ERROR_INVALID_COUNTRY_CODE },
{ "place:Whatever;country=United%20Kingdom",
TRP_PLACE_ERROR_INVALID_COUNTRY_CODE },
};
static const struct
......@@ -324,6 +442,38 @@ static const SampleUri ugly_uris[] =
/* Check for multiple ';' */
{ "place:X;;;location=geo:4,2;;;", TRP_PLACE_ERROR_INVALID_URI,
4.0, 2.0, UNKNOWN, UNKNOWN, "X" },
{ "place:Whatever;postal-code", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;postal-code=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;country", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;country=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;street", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;street=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;building", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;building=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;formatted-address", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;formatted-address=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;area", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;area=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;region", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;region=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;locality", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
{ "place:Whatever;locality=", TRP_PLACE_ERROR_INVALID_URI,
UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, "Whatever" },
};
static void
......
This diff is collapsed.
......@@ -97,6 +97,8 @@ GQuark trp_place_error_quark (void);
* was used
* @TRP_PLACE_ERROR_OUT_OF_RANGE: A coordinate was out of range, for
* example a latitude of 91°N
* @TRP_PLACE_ERROR_INVALID_COUNTRY_CODE: A country code was not in
* ISO 3166 alpha-3 format (three letters, for example `GBR` or `fra`)
*
* An error in defining a place or parsing a navigation-related URI.
*
......@@ -109,6 +111,7 @@ typedef enum
TRP_PLACE_ERROR_UNKNOWN_SCHEME,
TRP_PLACE_ERROR_UNKNOWN_CRS,
TRP_PLACE_ERROR_OUT_OF_RANGE,
TRP_PLACE_ERROR_INVALID_COUNTRY_CODE,
} TrpPlaceError;
#define TRP_TYPE_PLACE (trp_place_get_type ())
......@@ -126,6 +129,14 @@ gdouble trp_place_get_latitude (TrpPlace *self);
gdouble trp_place_get_longitude (TrpPlace *self);
gdouble trp_place_get_altitude (TrpPlace *self);
gdouble trp_place_get_uncertainty (TrpPlace *self);
const gchar *trp_place_get_postal_code (TrpPlace *self);
const gchar *trp_place_get_country_code (TrpPlace *self);
const gchar *trp_place_get_region (TrpPlace *self);
const gchar *trp_place_get_locality (TrpPlace *self);
const gchar *trp_place_get_area (TrpPlace *self);
const gchar *trp_place_get_street (TrpPlace *self);
const gchar *trp_place_get_building (TrpPlace *self);
const gchar *trp_place_get_formatted_address (TrpPlace *self);
TrpCoordinateReferenceSystem trp_place_get_crs (TrpPlace *self);
......@@ -233,6 +244,8 @@ gboolean (trp_place_is_altitude) (gdouble d);
#define trp_place_is_uncertainty(d) ((d) >= 0)
gboolean (trp_place_is_uncertainty) (gdouble d);
gboolean trp_place_is_country_code (const gchar *country);
typedef struct _TrpPlaceBuilder TrpPlaceBuilder;
#define TRP_TYPE_PLACE_BUILDER (trp_place_builder_get_type ())
......@@ -253,6 +266,22 @@ void trp_place_builder_set_uncertainty (TrpPlaceBuilder *self,
gdouble uncertainty);
void trp_place_builder_set_location_string (TrpPlaceBuilder *self,
const gchar *location_string);
void trp_place_builder_set_postal_code (TrpPlaceBuilder *self,
const gchar *postal_code);
void trp_place_builder_set_country_code (TrpPlaceBuilder *self,
const gchar *country);
void trp_place_builder_set_region (TrpPlaceBuilder *self,
const gchar *region);
void trp_place_builder_set_locality (TrpPlaceBuilder *self,
const gchar *locality);
void trp_place_builder_set_area (TrpPlaceBuilder *self,
const gchar *area);
void trp_place_builder_set_street (TrpPlaceBuilder *self,
const gchar *street);
void trp_place_builder_set_building (TrpPlaceBuilder *self,
const gchar *building);
void trp_place_builder_set_formatted_address (TrpPlaceBuilder *self,
const gchar *address);
TrpPlace *trp_place_builder_copy (TrpPlaceBuilder *self);
TrpPlace *trp_place_builder_end (TrpPlaceBuilder *self);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment