// Copyright (c) 2019 Pantor. All rights reserved.

#include "catch/catch.hpp"
#include "inja/inja.hpp"


using json = nlohmann::json;


const std::string test_file_directory {"../test/data/"};

TEST_CASE("loading") {
    inja::Environment env;
    json data;
    data["name"] = "Jeff";

    SECTION("Files should be loaded") {
        CHECK(env.load_file(test_file_directory + "simple.txt") == "Hello {{ name }}.");
    }

    SECTION("Files should be rendered") {
        CHECK(env.render_file(test_file_directory + "simple.txt", data) == "Hello Jeff.");
    }

    SECTION("File includes should be rendered") {
        CHECK(env.render_file(test_file_directory + "include.txt", data) == "Answer: Hello Jeff.");
    }

    SECTION("File error should throw") {
        std::string path(test_file_directory + "does-not-exist");
        CHECK_THROWS_WITH(env.load_file(path), "[inja.exception.file_error] failed accessing file at '" + path + "'");
        CHECK_THROWS_WITH(env.load_json(path), "[inja.exception.file_error] failed accessing file at '" + path + "'");
    }
}

TEST_CASE("complete-files") {
    inja::Environment env {test_file_directory};

    for (std::string test_name : {"simple-file", "nested", "nested-line", "html"}) {
        SECTION(test_name) {
            CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt"));
        }
    }
}

TEST_CASE("complete-files-whitespace-control") {
    inja::Environment env {test_file_directory};
    env.set_trim_blocks(true);
    env.set_lstrip_blocks(true);
    
    for (std::string test_name : {"nested-whitespace"}) {
        SECTION(test_name) {
            CHECK(env.render_file_with_json_file(test_name + "/template.txt", test_name + "/data.json") == env.load_file(test_name + "/result.txt"));
        }
    }
}

TEST_CASE("global-path") {
    inja::Environment env {test_file_directory, "./"};
    inja::Environment env_result {"./"};
    json data;
    data["name"] = "Jeff";

    SECTION("Files should be written") {
        env.write("simple.txt", data, "global-path-result.txt");
        CHECK(env_result.load_file("global-path-result.txt") == "Hello Jeff.");
    }
}
