libcruft-util/test/uri.cpp

169 lines
4.8 KiB
C++
Raw Normal View History

2015-02-09 17:43:24 +11:00
#include "uri.hpp"
2015-04-13 16:45:56 +10:00
#include "tap.hpp"
2015-02-09 17:43:24 +11:00
int
main (void)
{
cruft::TAP::logger tap;
static const struct {
const char *src;
const char *scheme;
const char *hierarchical;
const char *authority;
const char *user;
const char *host;
const char *port;
const char *path;
const char *query;
const char *fragment;
} GOOD[] = {
// examples from rfc3986
{
.src = "ftp://ftp.is.co.za/rfc/rfc1808.txt",
.scheme = "ftp",
.hierarchical = "ftp.is.co.za/rfc/rfc1808.txt",
.authority = "ftp.is.co.za",
.user = "",
.host = "ftp.is.co.za",
.port = "",
.path = "/rfc/rfc1808.txt",
.query = "",
.fragment = "" },
{
.src = "http://www.ietf.org/rfc/rfc2396.txt",
.scheme = "http",
.hierarchical = "www.ietf.org/rfc/rfc2396.txt",
.authority = "www.ietf.org",
.user = "",
.host = "www.ietf.org",
.port = "",
.path = "/rfc/rfc2396.txt",
.query = "",
.fragment = "" },
{
.src = "ldap://[2001:db8::7]/c=GB?objectClass?one",
.scheme = "ldap",
.hierarchical = "[2001:db8::7]/c=GB",
.authority = "[2001:db8::7]",
.user = "",
.host = "[2001:db8::7]",
.port = "",
.path = "/c=GB",
.query = "objectClass?one",
.fragment = "" },
{
.src = "mailto:John.Doe@example.com",
.scheme= "mailto",
.hierarchical = "John.Doe@example.com",
.authority= "",
.user = "",
.host = "",
.port = "",
.path= "John.Doe@example.com",
.query= "",
.fragment= "" },
{
.src = "news:comp.infosystems.www.servers.unix",
.scheme= "news",
.hierarchical = "comp.infosystems.www.servers.unix",
.authority= "",
.user = "",
.host = "",
.port = "",
.path= "comp.infosystems.www.servers.unix",
.query= "",
.fragment= "" },
2015-02-09 17:43:24 +11:00
{
.src = "tel:+1-816-555-1212",
.scheme= "tel",
.hierarchical = "+1-816-555-1212",
.authority= "",
.user = "",
.host = "",
.port = "",
.path= "+1-816-555-1212",
.query= "",
.fragment= "" },
{
.src = "telnet://192.0.2.16:80/",
.scheme= "telnet",
.hierarchical = "192.0.2.16:80/",
.authority= "192.0.2.16:80",
.user = "",
.host = "192.0.2.16",
.port = "80",
.path= "/",
.query= "",
.fragment= "" },
{
.src = "urn:oasis:names:specification:docbook:dtd:xml:4.1.2",
.scheme= "urn",
.hierarchical = "oasis:names:specification:docbook:dtd:xml:4.1.2",
.authority= "",
.user = "",
.host = "",
.port = "",
.path= "oasis:names:specification:docbook:dtd:xml:4.1.2",
.query= "",
.fragment= "" },
// a case with all possible components
{
.src = "https://user:password@example.com:80/path/to?foo=bar#fragment",
.scheme = "https",
.hierarchical = "user:password@example.com:80/path/to",
.authority = "user:password@example.com:80",
.user = "user:password",
.host = "example.com",
.port = "80",
.path = "/path/to",
.query = "foo=bar",
.fragment = "fragment" },
};
for (auto t: GOOD) {
tap.expect_nothrow ([t] (void) { cruft::uri foo (t.src); }, "nothrow parsing '%s'", t.src);
cruft::uri u (t.src);
tap.expect_eq (u.scheme (), t.scheme, "scheme for '%s'", t.src);
tap.expect_eq (u.heirarchical (), t.hierarchical, "hierarchical for '%s'", t.src);
tap.expect_eq (u.authority (), t.authority, "authority for '%s'", t.src);
tap.expect_eq (u.host (), t.host, "host for '%s'", t.src);
tap.expect_eq (u.user (), t.user, "user for '%s'", t.src);
tap.expect_eq (u.port (), t.port, "port for '%s'", t.src);
tap.expect_eq (u.path (), t.path, "path for '%s'", t.src);
tap.expect_eq (u.query (), t.query, "query for '%s'", t.src);
tap.expect_eq (u.fragment (), t.fragment, "fragment for '%s'", t.src);
}
2015-04-13 18:06:08 +10:00
2015-02-09 17:43:24 +11:00
static const char* BAD[] = {
"www.google.com.au",
};
for (auto i: BAD)
tap.expect_throw<cruft::uri::parse_error> (
[i] (void) { cruft::uri foo (i); }, "throw parsing '%s'", i
);
2015-04-13 16:45:56 +10:00
return tap.status ();
2015-02-09 17:43:24 +11:00
}