#include "clar_libgit2.h"
#include "git2/sys/filter.h"
#include "crlf.h"
#include "buffer.h"

static git_repository *g_repo = NULL;

void test_filter_query__initialize(void)
{
	g_repo = cl_git_sandbox_init("crlf");

	cl_git_mkfile("crlf/.gitattributes",
		"*.txt text\n"
		"*.bin binary\n"
		"*.crlf text eol=crlf\n"
		"*.lf text eol=lf\n"
		"*.binident binary ident\n"
		"*.ident text ident\n"
		"*.identcrlf ident text eol=crlf\n"
		"*.identlf ident text eol=lf\n"
		"*.custom custom ident text\n");
}

void test_filter_query__cleanup(void)
{
	cl_git_sandbox_cleanup();
}

static int filter_for(const char *filename, const char *filter)
{
	git_filter_list *fl;
	int filtered;

	cl_git_pass(git_filter_list_load(
		&fl, g_repo, NULL, filename, GIT_FILTER_TO_WORKTREE, 0));
	filtered = git_filter_list_contains(fl, filter);
	git_filter_list_free(fl);

	return filtered;
}

void test_filter_query__filters(void)
{
	cl_assert_equal_i(1, filter_for("text.txt", "crlf"));
	cl_assert_equal_i(0, filter_for("binary.bin", "crlf"));

	cl_assert_equal_i(1, filter_for("foo.lf", "crlf"));
	cl_assert_equal_i(0, filter_for("foo.lf", "ident"));

	cl_assert_equal_i(1, filter_for("id.ident", "crlf"));
	cl_assert_equal_i(1, filter_for("id.ident", "ident"));

	cl_assert_equal_i(0, filter_for("id.binident", "crlf"));
	cl_assert_equal_i(1, filter_for("id.binident", "ident"));
}

void test_filter_query__autocrlf_true_implies_crlf(void)
{
	cl_repo_set_bool(g_repo, "core.autocrlf", true);
	cl_assert_equal_i(1, filter_for("not_in_gitattributes", "crlf"));
	cl_assert_equal_i(1, filter_for("foo.txt", "crlf"));
	cl_assert_equal_i(0, filter_for("foo.bin", "crlf"));
	cl_assert_equal_i(1, filter_for("foo.lf", "crlf"));

	cl_repo_set_bool(g_repo, "core.autocrlf", false);
	cl_assert_equal_i(0, filter_for("not_in_gitattributes", "crlf"));
	cl_assert_equal_i(1, filter_for("foo.txt", "crlf"));
	cl_assert_equal_i(0, filter_for("foo.bin", "crlf"));
	cl_assert_equal_i(1, filter_for("foo.lf", "crlf"));
}

void test_filter_query__unknown(void)
{
	cl_assert_equal_i(1, filter_for("foo.custom", "crlf"));
	cl_assert_equal_i(1, filter_for("foo.custom", "ident"));
	cl_assert_equal_i(0, filter_for("foo.custom", "custom"));
}

void test_filter_query__custom(void)
{
	git_filter custom = { GIT_FILTER_VERSION };

	cl_git_pass(git_filter_register(
		"custom", &custom, 42));

	cl_assert_equal_i(1, filter_for("foo.custom", "crlf"));
	cl_assert_equal_i(1, filter_for("foo.custom", "ident"));
	cl_assert_equal_i(1, filter_for("foo.custom", "custom"));

	git_filter_unregister("custom");
}
