#include "../test.h"
#include <catch2/reporters/catch_reporter_registrars.hpp>
#include <catch2/reporters/catch_reporter_event_listener.hpp>

#define TEST(name) TEST_CASE("scheme-custom: " name, "[scheme-custom]")

struct MyScheme2 : URI::Strict<MyScheme2> {
    using URI::Strict<MyScheme2>::Strict;
    static string default_scheme () { return "myscheme2"; }
};

struct RegisterSchems : Catch::EventListenerBase {
    using EventListenerBase::EventListenerBase; // inherit constructor

    void testRunStarting( Catch::TestRunInfo const&) override {
        URI::register_scheme("myscheme1", 6666, true);
        URI::register_scheme("myscheme2", &typeid(MyScheme2), [](const URI& u)->URI*{ return new MyScheme2(u);  }, 7777, false);
    }
};
CATCH_REGISTER_LISTENER(RegisterSchems);

TEST("simple scheme") {
    auto uri = URI::create("myscheme1://ya.ru");
    CHECK_TYPE(uri, URI);
    CHECK(uri->port() == 6666);
    CHECK(uri->secure());

    uri = new URI("myscheme1://ya.ru");
    CHECK(uri->port() == 6666);
    CHECK(uri->secure());
}

TEST("full scheme") {
    auto uri = URI::create("myscheme2://ya.ru");
    CHECK_TYPE(uri, MyScheme2);
    CHECK(uri->port() == 7777);

    uri = new URI("myscheme2://ya.ru");
    CHECK(uri->port() == 7777);
}