#include "blame_helpers.h"

void hunk_message(size_t idx, const git_blame_hunk *hunk, const char *fmt, ...)
{
	va_list arglist;

	printf("Hunk %"PRIuZ" (line %"PRIuZ" +%"PRIuZ"): ", idx,
			hunk->final_start_line_number, hunk->lines_in_hunk-1);

	va_start(arglist, fmt);
	vprintf(fmt, arglist);
	va_end(arglist);

	printf("\n");
}

void check_blame_hunk_index(git_repository *repo, git_blame *blame, int idx,
		size_t start_line, size_t len, char boundary, const char *commit_id, const char *orig_path)
{
	char expected[GIT_OID_HEXSZ+1] = {0}, actual[GIT_OID_HEXSZ+1] = {0};
	const git_blame_hunk *hunk = git_blame_get_hunk_byindex(blame, idx);
	cl_assert(hunk);

	if (!strncmp(commit_id, "0000", 4)) {
		strcpy(expected, "0000000000000000000000000000000000000000");
	} else {
		git_object *obj;
		cl_git_pass(git_revparse_single(&obj, repo, commit_id));
		git_oid_fmt(expected, git_object_id(obj));
		git_object_free(obj);
	}

	if (hunk->final_start_line_number != start_line) {
		hunk_message(idx, hunk, "mismatched start line number: expected %d, got %d",
				start_line, hunk->final_start_line_number);
	}
	cl_assert_equal_i(hunk->final_start_line_number, start_line);

	if (hunk->lines_in_hunk != len) {
		hunk_message(idx, hunk, "mismatched line count: expected %d, got %d",
				len, hunk->lines_in_hunk);
	}
	cl_assert_equal_i(hunk->lines_in_hunk, len);

	git_oid_fmt(actual, &hunk->final_commit_id);
	if (strcmp(expected, actual)) {
		hunk_message(idx, hunk, "has mismatched original id (got %s, expected %s)\n",
				actual, expected);
	}
	cl_assert_equal_s(actual, expected);
	cl_assert_equal_oid(&hunk->final_commit_id, &hunk->orig_commit_id);


	if (strcmp(hunk->orig_path, orig_path)) {
		hunk_message(idx, hunk, "has mismatched original path (got '%s', expected '%s')\n",
				hunk->orig_path, orig_path);
	}
	cl_assert_equal_s(hunk->orig_path, orig_path);

	if (hunk->boundary != boundary) {
		hunk_message(idx, hunk, "doesn't match boundary flag (got %d, expected %d)\n",
				hunk->boundary, boundary);
	}
	cl_assert_equal_i(boundary, hunk->boundary);
}


