#include "test-tool.h"
#include "t/unit-tests/test-lib.h"

/*
 * The purpose of this "unit test" is to verify a few invariants of the unit
 * test framework itself, as well as to provide examples of output from actually
 * failing tests. As such, it is intended that this test fails, and thus it
 * should not be run as part of `make unit-tests`. Instead, we verify it behaves
 * as expected in the integration test t0080-unit-test-output.sh
 */

/* Used to store the return value of check_int(). */
static int check_res;

/* Used to store the return value of TEST(). */
static int test_res;

static void t_res(int expect)
{
	check_int(check_res, ==, expect);
	check_int(test_res, ==, expect);
}

static void t_todo(int x)
{
	check_res = TEST_TODO(check(x));
}

static void t_skip(void)
{
	check(0);
	test_skip("missing prerequisite");
	check(1);
}

static int do_skip(void)
{
	test_skip("missing prerequisite");
	return 1;
}

static void t_skip_todo(void)
{
	check_res = TEST_TODO(do_skip());
}

static void t_todo_after_fail(void)
{
	check(0);
	TEST_TODO(check(0));
}

static void t_fail_after_todo(void)
{
	check(1);
	TEST_TODO(check(0));
	check(0);
}

static void t_messages(void)
{
	check_str("\thello\\", "there\"\n");
	check_str("NULL", NULL);
	check_char('a', ==, '\n');
	check_char('\\', ==, '\'');
	check_char('\a', ==, '\v');
	check_char('\x00', ==, '\x01');
}

static void t_empty(void)
{
	; /* empty */
}

int cmd__example_tap(int argc UNUSED, const char **argv UNUSED)
{
	check(1);

	test_res = TEST(check_res = check_int(1, ==, 1), "passing test");
	TEST(t_res(1), "passing test and assertion return 1");
	test_res = TEST(check_res = check_int(1, ==, 2), "failing test");
	TEST(t_res(0), "failing test and assertion return 0");
	test_res = TEST(t_todo(0), "passing TEST_TODO()");
	TEST(t_res(1), "passing TEST_TODO() returns 1");
	test_res = TEST(t_todo(1), "failing TEST_TODO()");
	TEST(t_res(0), "failing TEST_TODO() returns 0");
	test_res = TEST(t_skip(), "test_skip()");
	TEST(check_int(test_res, ==, 1), "skipped test returns 1");
	test_res = TEST(t_skip_todo(), "test_skip() inside TEST_TODO()");
	TEST(t_res(1), "test_skip() inside TEST_TODO() returns 1");
	test_res = TEST(t_todo_after_fail(), "TEST_TODO() after failing check");
	TEST(check_int(test_res, ==, 0), "TEST_TODO() after failing check returns 0");
	test_res = TEST(t_fail_after_todo(), "failing check after TEST_TODO()");
	TEST(check_int(test_res, ==, 0), "failing check after TEST_TODO() returns 0");
	TEST(t_messages(), "messages from failing string and char comparison");
	test_res = TEST(t_empty(), "test with no checks");
	TEST(check_int(test_res, ==, 0), "test with no checks returns 0");

	if_test ("if_test passing test")
		check_int(1, ==, 1);
	if_test ("if_test failing test")
		check_int(1, ==, 2);
	if_test ("if_test passing TEST_TODO()")
		TEST_TODO(check(0));
	if_test ("if_test failing TEST_TODO()")
		TEST_TODO(check(1));
	if_test ("if_test test_skip()") {
		check(0);
		test_skip("missing prerequisite");
		check(1);
	}
	if_test ("if_test test_skip() inside TEST_TODO()")
		TEST_TODO((test_skip("missing prerequisite"), 1));
	if_test ("if_test TEST_TODO() after failing check") {
		check(0);
		TEST_TODO(check(0));
	}
	if_test ("if_test failing check after TEST_TODO()") {
		check(1);
		TEST_TODO(check(0));
		check(0);
	}
	if_test ("if_test messages from failing string and char comparison") {
		check_str("\thello\\", "there\"\n");
		check_str("NULL", NULL);
		check_char('a', ==, '\n');
		check_char('\\', ==, '\'');
		check_char('\a', ==, '\v');
		check_char('\x00', ==, '\x01');
	}
	if_test ("if_test test with no checks")
		; /* nothing */

	return test_done();
}
