#include "gamemath/ActionInput.h"
#include "unittest/TestSuite.h"

static void testIsActionActive(void) {
	ActionInputState state = ActionInputState_allNeutral;
	
	TestCase_assertBoolFalse(ActionInput_isActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 2));
	
	bool changed = ActionInput_start(&state, 1);
	TestCase_assertBoolTrue(changed);
	TestCase_assertBoolFalse(ActionInput_isActive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 2));
	
	changed = ActionInput_start(&state, 0);
	TestCase_assertBoolTrue(changed);
	TestCase_assertBoolTrue(ActionInput_isActive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 2));
	
	changed = ActionInput_start(&state, 0);
	TestCase_assertBoolFalse(changed);
	TestCase_assertBoolTrue(ActionInput_isActive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 2));
	
	changed = ActionInput_stop(&state, 1);
	TestCase_assertBoolTrue(changed);
	TestCase_assertBoolTrue(ActionInput_isActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 2));
	
	changed = ActionInput_stop(&state, 2);
	TestCase_assertBoolFalse(changed);
	TestCase_assertBoolTrue(ActionInput_isActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 2));
	
	changed = ActionInput_start(&state, 2);
	TestCase_assertBoolTrue(changed);
	TestCase_assertBoolTrue(ActionInput_isActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 1));
	TestCase_assertBoolTrue(ActionInput_isActive(state, 2));
	
	ActionInput_clear(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 1));
	TestCase_assertBoolTrue(ActionInput_isActive(state, 2));
	
	ActionInput_clear(&state, 2);
	TestCase_assertBoolFalse(ActionInput_isActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isActive(state, 2));
}

static void testIsActionDirty(void) {
	ActionInputState state = ActionInputState_allNeutral;
	
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 0));
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 1));
	
	ActionInput_start(&state, 0);
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 0));
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 1));
	
	ActionInput_start(&state, 0);
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 0));
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 1));
	
	ActionInput_start(&state, 1);
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 0));
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 1));
	
	ActionInput_processed(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 0));
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 1));
	
	ActionInput_processed(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 0));
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 1));
	
	ActionInput_start(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 0));
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 1));
	
	ActionInput_stop(&state, 0);
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 0));
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 1));
	
	ActionInput_stop(&state, 1);
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 0));
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 1));
	
	ActionInput_clear(&state, 1);
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 0));
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 1));
	
	ActionInput_stop(&state, 1);
	TestCase_assertBoolTrue(ActionInput_isDirty(state, 0));
	TestCase_assertBoolFalse(ActionInput_isDirty(state, 1));
}

static void testNewly(void) {
	ActionInputState state = ActionInputState_allNeutral;
	
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_start(&state, 0);
	TestCase_assertBoolTrue(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_start(&state, 1);
	TestCase_assertBoolTrue(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_processed(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_start(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_stop(&state, 1);
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolTrue(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_stop(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolTrue(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_processed(&state, 1);
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_stop(&state, 0);
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
	
	ActionInput_stop(&state, 1);
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 0));
	TestCase_assertBoolTrue(ActionInput_isNewlyInactive(state, 0));
	TestCase_assertBoolFalse(ActionInput_isNewlyActive(state, 1));
	TestCase_assertBoolFalse(ActionInput_isNewlyInactive(state, 1));
}

TEST_SUITE(ActionInputTest,
           testIsActionActive,
           testIsActionDirty,
           testNewly)
