/*

	9unit
	Copyright (C) Jonathan Lamothe <jonathan@jlamothe.net>

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU Lesser General Public License as
	published by the Free Software Foundation, either version 3 of the
	License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful, but
	WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
	Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public
	License along with this program.  If not, see
	<http://www.gnu.org/licenses/>.

*/

#include <u.h>
#include <libc.h>

#include "../9unit.h"
#include "util.h"
#include "run-test.h"

// Internal Prototypes

static void test_passing(TestState *);
static void test_failing(TestState *);
static void mk_sample_state(TestState *);
decl_test(always_passes);
decl_test(always_fails);

// Public Functions

void
test_run_test(TestState *s)
{
	print("run_test()\n");
	test_passing(s);
	test_failing(s);
}

// Internal Functions

static void
test_passing(TestState *s)
{
	TestState expected, actual;
	print("\tpassing\n");

	// expected result
	memset(&expected, 0, sizeof(TestState));
	expected.passed = 2;
	expected.failed = 2;
	expected.pending = 3;
	expected.run = 7;

	// actual result
	mk_sample_state(&actual);
	run_test(&actual, always_passes);

	compare_states(
		s,
		"\t\t",
		"ERROR: run_test(): passing:",
		&expected,
		&actual
	);
}

static void
test_failing(TestState *s)
{
	TestState expected, actual;
	print("\tfailing\n");

	// expected result
	memset(&expected, 0, sizeof(TestState));
	expected.passed = 1;
	expected.failed = 3;
	expected.pending = 3;
	expected.run = 7;

	// actual result
	mk_sample_state(&actual);
	run_test(&actual, always_fails);

	compare_states(
		s,
		"\t\t",
		"ERROR: run_test(): failing:",
		&expected,
		&actual
	);
}

static void
mk_sample_state(TestState *s)
{
	memset(s, 0, sizeof(TestState));
	s->passed = 1;
	s->failed = 2;
	s->pending = 3;
	s->run = 6;
}

decl_test(always_passes)
{
	return test_success;
}

decl_test(always_fails)
{
	return test_failure;
}

//jl