|
|
@@ -1,5 +1,6 @@ |
|
|
|
#include "../../../__mocks__/SDL_keyboard.mock.h" |
|
|
|
#include "../../../__mocks__/SDL_joystick.mock.h" |
|
|
|
#include "../../../__mocks__/SDL_stdinc.mock.h" |
|
|
|
#include "../../../__mocks__/minIni.mock.h" |
|
|
|
#include "IZ_keyboard.h" |
|
|
|
#include "IZ_joystick.h" |
|
|
@@ -16,283 +17,267 @@ spec("input") { |
|
|
|
describe("joystick") { |
|
|
|
describe("HandleJoystickEvents") { |
|
|
|
static SDL_Event e; |
|
|
|
static IZ_JoystickState state; |
|
|
|
static IZ_Action action; |
|
|
|
static IZ_JoystickState state[PLAYERS]; |
|
|
|
static IZ_Action action[PLAYERS]; |
|
|
|
|
|
|
|
describe("on axis motion events") { |
|
|
|
before_each() { |
|
|
|
e.type = SDL_JOYAXISMOTION; |
|
|
|
state.config.axis_threshold = 8000u; |
|
|
|
} |
|
|
|
|
|
|
|
describe("on primary horizontal direction") { |
|
|
|
u8 p; |
|
|
|
for (p = 0; p < PLAYERS; p += 1) { |
|
|
|
describe("on axis motion events") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_HORIZONTAL1; |
|
|
|
e.type = SDL_JOYAXISMOTION; |
|
|
|
state[0].config.axis_threshold = 8000u; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_RIGHT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
describe("on primary horizontal direction") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_HORIZONTAL1; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_RIGHT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_LEFT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_LEFT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
describe("on secondary horizontal direction") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_HORIZONTAL2; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_RIGHT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_LEFT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state[p].config.axis_threshold);; |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
describe("on primary vertical direction") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_VERTICAL1; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_DOWN), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_UP), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state[p].config.axis_threshold);; |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("on secondary horizontal direction") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_HORIZONTAL2; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_RIGHT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_LEFT), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state.config.axis_threshold);; |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
describe("on secondary vertical direction") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_VERTICAL2; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_DOWN), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state[p].config.axis_threshold); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << IZ_ACTION_INDEX_UP), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state[p].config.axis_threshold);; |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("on primary vertical direction") { |
|
|
|
describe("on hat motion events") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_VERTICAL1; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_DOWN), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_UP), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state.config.axis_threshold);; |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("on secondary vertical direction") { |
|
|
|
before_each() { |
|
|
|
e.jaxis.axis = IZ_JOY_AXIS_DIRECTION_VERTICAL2; |
|
|
|
} |
|
|
|
|
|
|
|
it("handles positive motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_DOWN), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles negative motion") { |
|
|
|
e.jaxis.value = -GenerateAxisValueOutsideThreshold(state.config.axis_threshold); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << IZ_ACTION_INDEX_UP), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles neutral motion") { |
|
|
|
e.jaxis.value = GenerateAxisValueWithinThreshold(state.config.axis_threshold);; |
|
|
|
action = 0; |
|
|
|
|
|
|
|
printf("(axis value: %d) ", e.jaxis.value); |
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == 0, |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
e.type = SDL_JOYHATMOTION; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("on hat motion events") { |
|
|
|
before_each() { |
|
|
|
e.type = SDL_JOYHATMOTION; |
|
|
|
} |
|
|
|
|
|
|
|
for (u8 i = 0; i < 4; i += 1) { |
|
|
|
it("handles motion for %s action", ACTION_NAMES[i]) { |
|
|
|
e.jhat.value = (0x1u << i); |
|
|
|
action = 0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1u << i), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles motion for %s deactivation", ACTION_NAMES[i]) { |
|
|
|
e.jhat.value = 0; |
|
|
|
action = ~0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
!(action & (0x1 << i)), |
|
|
|
"Action not unset." |
|
|
|
); |
|
|
|
for (u8 i = 0; i < 4; i += 1) { |
|
|
|
it("handles motion for %s action", ACTION_NAMES[i]) { |
|
|
|
e.jhat.value = (0x1u << i); |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1u << i), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles motion for %s deactivation", ACTION_NAMES[i]) { |
|
|
|
e.jhat.value = 0; |
|
|
|
action[p] = ~0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
!(action[p] & (0x1 << i)), |
|
|
|
"Action not unset." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("on button events") { |
|
|
|
for (u8 i = 4; i < CONTROLS; i += 1) { |
|
|
|
it("handles %s action activation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_JOYBUTTONDOWN; |
|
|
|
e.jbutton.button = IZ_DEFAULT_JOYSTICK_STATE[0][i]; |
|
|
|
state.config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[0][i]; |
|
|
|
action = 0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1u << i), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles %s action deactivation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_JOYBUTTONUP; |
|
|
|
e.jbutton.button = IZ_DEFAULT_JOYSTICK_STATE[0][i]; |
|
|
|
state.config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[0][i]; |
|
|
|
action = ~0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
!(action & (0x1 << i)), |
|
|
|
"Action not unset." |
|
|
|
); |
|
|
|
describe("on button events") { |
|
|
|
for (u8 i = 4; i < CONTROLS; i += 1) { |
|
|
|
it("handles %s action activation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_JOYBUTTONDOWN; |
|
|
|
e.jbutton.button = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; |
|
|
|
state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1u << i), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles %s action deactivation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_JOYBUTTONUP; |
|
|
|
e.jbutton.button = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; |
|
|
|
state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; |
|
|
|
action[p] = ~0; |
|
|
|
|
|
|
|
IZ_HandleJoystickEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
!(action[p] & (0x1 << i)), |
|
|
|
"Action not unset." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("LoadJoystickConfig") { |
|
|
|
static IZ_JoystickConfig config; |
|
|
|
|
|
|
|
after_each() { |
|
|
|
mock_reset(ini_getl); |
|
|
|
} |
|
|
|
|
|
|
|
it("calls load method") { |
|
|
|
mock_set_expected_calls(ini_getl, CONTROLS - 4 + 1); |
|
|
|
|
|
|
|
IZ_LoadJoystickConfig("config.ini", &config, 0); |
|
|
|
|
|
|
|
check( |
|
|
|
mock_get_expected_calls(ini_getl) == mock_get_actual_calls(ini_getl), |
|
|
|
"Call count mismatch for ini_getl() (expected %u, received %u).", |
|
|
|
mock_get_expected_calls(ini_getl), |
|
|
|
mock_get_actual_calls(ini_getl) |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("SaveJoystickConfig") { |
|
|
|
static IZ_JoystickConfig config; |
|
|
|
static IZ_JoystickState state[PLAYERS]; |
|
|
|
|
|
|
|
after_each() { |
|
|
|
mock_reset(ini_putl); |
|
|
|
} |
|
|
|
|
|
|
|
before_each() { |
|
|
|
for (u8 i = 0; i < CONTROLS; i += 1) { |
|
|
|
config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[0][i]; |
|
|
|
for (u8 p = 0; p < PLAYERS; p += 1) { |
|
|
|
for (u8 i = 0; i < CONTROLS; i += 1) { |
|
|
|
state[p].config.control_mapping[i] = IZ_DEFAULT_JOYSTICK_STATE[p].config.control_mapping[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
it("calls save method") { |
|
|
|
mock_set_expected_calls(ini_putl, CONTROLS - 4 + 1); |
|
|
|
mock_set_expected_calls(ini_putl, ((CONTROLS - 4) + 2) * PLAYERS); |
|
|
|
|
|
|
|
IZ_SaveJoystickConfig("config.ini", &config, 0); |
|
|
|
IZ_SaveJoystickConfig("config.ini", &state); |
|
|
|
|
|
|
|
check( |
|
|
|
mock_get_expected_calls(ini_putl) == mock_get_actual_calls(ini_putl), |
|
|
@@ -307,76 +292,59 @@ spec("input") { |
|
|
|
describe("keyboard") { |
|
|
|
describe("HandleKeyboardEvents") { |
|
|
|
static SDL_Event e; |
|
|
|
static IZ_KeyboardState state; |
|
|
|
static IZ_Action action; |
|
|
|
|
|
|
|
for (u8 i = 0; i < CONTROLS; i += 1) { |
|
|
|
it("handles %s action activation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_KEYDOWN; |
|
|
|
e.key.keysym.sym = IZ_DEFAULT_KEYBOARD_STATE[0][i]; |
|
|
|
state.config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[0][i]; |
|
|
|
action = 0; |
|
|
|
|
|
|
|
IZ_HandleKeyboardEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action == (0x1 << i), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
it("handles %s action deactivation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_KEYUP; |
|
|
|
e.key.keysym.sym = IZ_DEFAULT_KEYBOARD_STATE[0][i]; |
|
|
|
state.config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[0][i]; |
|
|
|
action = ~0; |
|
|
|
|
|
|
|
IZ_HandleKeyboardEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
!(action & (0x1 << i)), |
|
|
|
"Action not unset." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
static IZ_KeyboardState state[PLAYERS]; |
|
|
|
static IZ_Action action[PLAYERS]; |
|
|
|
|
|
|
|
describe("LoadKeyboardConfig") { |
|
|
|
static IZ_KeyboardConfig config; |
|
|
|
|
|
|
|
after_each() { |
|
|
|
mock_reset(ini_gets); |
|
|
|
} |
|
|
|
for (u8 p = 0; p < PLAYERS; p += 1) { |
|
|
|
for (u8 i = 0; i < CONTROLS; i += 1) { |
|
|
|
it("handles %s action activation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_KEYDOWN; |
|
|
|
e.key.keysym.sym = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; |
|
|
|
state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; |
|
|
|
action[p] = 0; |
|
|
|
|
|
|
|
it("calls load method") { |
|
|
|
mock_set_expected_calls(ini_gets, CONTROLS); |
|
|
|
IZ_HandleKeyboardEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
action[p] == (0x1 << i), |
|
|
|
"Action not set." |
|
|
|
); |
|
|
|
} |
|
|
|
|
|
|
|
IZ_LoadKeyboardConfig("config.ini", &config, 0); |
|
|
|
it("handles %s action deactivation", ACTION_NAMES[i]) { |
|
|
|
e.type = SDL_KEYUP; |
|
|
|
e.key.keysym.sym = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; |
|
|
|
state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; |
|
|
|
action[p] = ~0; |
|
|
|
|
|
|
|
check( |
|
|
|
mock_get_expected_calls(ini_gets) == mock_get_actual_calls(ini_gets), |
|
|
|
"Call count mismatch for ini_gets() (expected %u, received %u).", |
|
|
|
mock_get_expected_calls(ini_gets), |
|
|
|
mock_get_actual_calls(ini_gets) |
|
|
|
); |
|
|
|
IZ_HandleKeyboardEvents(e, &state, &action); |
|
|
|
check( |
|
|
|
!(action[p] & (0x1 << i)), |
|
|
|
"Action not unset." |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
describe("SaveKeyboardConfig") { |
|
|
|
static IZ_KeyboardConfig config; |
|
|
|
static IZ_KeyboardState state[PLAYERS]; |
|
|
|
|
|
|
|
after_each() { |
|
|
|
mock_reset(ini_puts); |
|
|
|
} |
|
|
|
|
|
|
|
before_each() { |
|
|
|
for (u8 i = 0; i < CONTROLS; i += 1) { |
|
|
|
config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[0][i]; |
|
|
|
for (u8 p = 0; p < PLAYERS; p += 1) { |
|
|
|
for (u8 i = 0; i < CONTROLS; i += 1) { |
|
|
|
state[p].config.control_mapping[i] = IZ_DEFAULT_KEYBOARD_STATE[p].config.control_mapping[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
it("calls save method") { |
|
|
|
mock_set_expected_calls(ini_puts, CONTROLS); |
|
|
|
mock_set_expected_calls(ini_puts, CONTROLS * PLAYERS); |
|
|
|
|
|
|
|
IZ_SaveKeyboardConfig("config.ini", &config, 0); |
|
|
|
IZ_SaveKeyboardConfig("config.ini", &state); |
|
|
|
|
|
|
|
check( |
|
|
|
mock_get_expected_calls(ini_puts) == mock_get_actual_calls(ini_puts), |
|
|
|