package starter;

import io.zzax.jadeite.test.Checker;

public class Main {
    public static void main(String[] args) {
        new Main().test();
    }

    //  Link Section

    public String scheme(String link) {
        return "";
    }

    public String host(String link) {
        return "";
    }

    public int portNumber(String link) {
        return 0;
    }

    public String path(String link) {
        return "";
    }

    //  Path Section

    public boolean isAbsolute(String path) {
        return false;
    }

    public boolean isRelative(String path) {
        return false;
    }

    public String addComponent(String path, String component) {
        return "";
    }

    public String removeLastComponent(String path) {
        return "";
    }

    public String[] components(String path) {
        return new String[0];
    }

    //  Automatic Test Section

    public void test() {
        Checker.describe("scheme", () -> {
            Checker.task(task -> {
                String link = "https://doc.zzax.io/";
                task.when("link", link);
                String result = scheme(link);
                task.check("result", result, "https");
            });
        });

        Checker.describe("host", () -> {
            Checker.task(task -> {
                String link = "https://doc.zzax.io/";
                task.when("link", link);
                String result = host(link);
                task.check("result", result, "doc.zzax.io");
            });
            Checker.task(task -> {
                String link = "https://doc.zzax.io:8080/";
                task.when("link", link);
                String result = host(link);
                task.check("result", result, "doc.zzax.io");
            });
        });

        Checker.describe("portNumber", () -> {
            Checker.task(task -> {
                String link = "https://doc.zzax.io:8080/";
                task.when("link", link);
                int result = portNumber(link);
                task.check("result", result, 8080);
            });
            Checker.task(task -> {
                String link = "https://doc.zzax.io/";
                task.when("link", link);
                int result = portNumber(link);
                task.check("result", result, -1);
            });
        });

        Checker.describe("path", () -> {
            Checker.task(task -> {
                String link = "https://doc.zzax.io/c/java111/";
                task.when("link", link);
                String result = path(link);
                task.check("result", result, "/c/java111/");
            });
            Checker.task(task -> {
                String link = "https://doc.zzax.io/q/zzax";
                task.when("link", link);
                String result = path(link);
                task.check("result", result, "/q/zzax");
            });
            Checker.task(task -> {
                String link = "https://doc.zzax.io/";
                task.when("link", link);
                String result = path(link);
                task.check("result", result, "/");
            });
        });

        Checker.describe("isAbsolute", () -> {
            Checker.task(task -> {
                String link = "/c/java111/";
                task.when("link", link);
                boolean result = isAbsolute(link);
                task.check("result", result, true);
            });
            Checker.task(task -> {
                String link = "/c/java111";
                task.when("link", link);
                boolean result = isAbsolute(link);
                task.check("result", result, true);
            });
            Checker.task(task -> {
                String link = "c/java111";
                task.when("link", link);
                boolean result = isAbsolute(link);
                task.check("result", result, false);
            });
            Checker.task(task -> {
                String link = "/";
                task.when("link", link);
                boolean result = isAbsolute(link);
                task.check("result", result, true);
            });
        });

        Checker.describe("isRelative", () -> {
            Checker.task(task -> {
                String link = "/c/java111/";
                task.when("link", link);
                boolean result = isRelative(link);
                task.check("result", result, false);
            });
            Checker.task(task -> {
                String link = "/c/java111";
                task.when("link", link);
                boolean result = isRelative(link);
                task.check("result", result, false);
            });
            Checker.task(task -> {
                String link = "c/java111";
                task.when("link", link);
                boolean result = isRelative(link);
                task.check("result", result, true);
            });
            Checker.task(task -> {
                String link = "/";
                task.when("link", link);
                boolean result = isRelative(link);
                task.check("result", result, false);
            });
        });

        Checker.describe("addComponent", () -> {
            Checker.task(task -> {
                String link = "/c/";
                String component = "java111";
                task.when("link", link);
                task.when("component", component);
                String result = addComponent(link, component);
                task.check("result", result, "/c/java111");
            });
            Checker.task(task -> {
                String link = "/c";
                String component = "java111";
                task.when("link", link);
                task.when("component", component);
                String result = addComponent(link, component);
                task.check("result", result, "/c/java111");
            });
            Checker.task(task -> {
                String link = "/c/";
                String component = "/java111";
                task.when("link", link);
                task.when("component", component);
                String result = addComponent(link, component);
                task.check("result", result, "/c/java111");
            });
            Checker.task(task -> {
                String link = "/c";
                String component = "/java111";
                task.when("link", link);
                task.when("component", component);
                String result = addComponent(link, component);
                task.check("result", result, "/c/java111");
            });
        });

        Checker.describe("removeLastComponent", () -> {
            Checker.task(task -> {
                String link = "/c/java111";
                task.when("link", link);
                String result = removeLastComponent(link);
                task.check("result", result, "/c");
            });
            Checker.task(task -> {
                String link = "/c/java111/";
                task.when("link", link);
                String result = removeLastComponent(link);
                task.check("result", result, "/c");
            });
            Checker.task(task -> {
                String link = "/c";
                task.when("link", link);
                String result = removeLastComponent(link);
                task.check("result", result, "/");
            });
            Checker.task(task -> {
                String link = "/";
                task.when("link", link);
                String result = removeLastComponent(link);
                task.check("result", result, "/");
            });
        });

        Checker.describe("components", () -> {
            Checker.task(task -> {
                String link = "/c/java111";
                task.when("link", link);
                String[] result = components(link);
                String[] expected = {"/", "c", "java111"};
                task.check("result", result, expected);
            });
            Checker.task(task -> {
                String link = "/c/java111/";
                task.when("link", link);
                String[] result = components(link);
                String[] expected = {"/", "c", "java111"};
                task.check("result", result, expected);
            });
            Checker.task(task -> {
                String link = "/c";
                task.when("link", link);
                String[] result = components(link);
                String[] expected = {"/", "c"};
                task.check("result", result, expected);
            });
            Checker.task(task -> {
                String link = "/";
                task.when("link", link);
                String[] result = components(link);
                String[] expected = {"/"};
                task.check("result", result, expected);
            });
        });
    }
}
