#include "../test.h"
#define TEST(name) TEST_CASE("scheme-strict: " name, "[scheme-strict]")
TEST("no class") {
auto uri = URI::create("lalala");
CHECK_TYPE(uri, URI);
uri = URI::create("//crazypanda.ru/abc");
CHECK_TYPE(uri, URI);
}
TEST("same scheme assignable") {
auto uri = URI::create("http://a.b");
CHECK_TYPE(uri, URI::http);
*uri = "http://b.c/d";
CHECK(uri->host() == "b.c");
CHECK(uri->path() == "/d");
CHECK_NOTHROW(uri->scheme("http"));
}
TEST("wrong scheme") {
auto uri = URI::create("http://ru.ru");
CHECK_THROWS_AS(*uri = "ftp://ru.ru", WrongScheme);
CHECK_THROWS_AS(uri->scheme("ftp"), WrongScheme);
}
TEST("copy assign (set)") {
auto uri = URI::create("http://a.b");
*uri = URI::http("http://c.d");
CHECK(uri->host() == "c.d");
*uri = URI("https://e.f");
CHECK(uri->host() == "e.f");
CHECK_THROWS_AS(*uri = URI::ftp("ftp://e.f"), WrongScheme);
}
TEST("create strict class") {
URI::http uri("http://ya.ru");
CHECK_THROWS_AS(URI::http("ftp://syber.ru"), WrongScheme);
}
TEST("apply strict scheme to proto-relative urls") {
{
URI::http uri("//syber.ru");
CHECK(uri.to_string() == "http://syber.ru");
}
{
URI::https uri("//syber.ru");
CHECK(uri.to_string() == "https://syber.ru");
}
{
URI::ftp uri("syber.ru/abc", URI::Flags::allow_suffix_reference);
CHECK(uri.to_string() == "ftp://syber.ru/abc");
}
}