Переглянути джерело

Update input tests

Ensure input test implementation is aligned to current input API.
master
TheoryOfNekomata 2 роки тому
джерело
коміт
901f7aef48
10 змінених файлів з 100 додано та 122 видалено
  1. +9
    -0
      CMakeLists.txt
  2. +9
    -4
      __mocks__/dependencies/SDL2/SDL_joystick.mock.h
  3. +15
    -0
      __mocks__/src/packages/config/IZ_config.mock.h
  4. +9
    -0
      __mocks__/src/packages/stdinc/IZ_string.mock.h
  5. +10
    -0
      src/packages/config/README.md
  6. +6
    -6
      src/packages/game/input/IZ_joystick.c
  7. +5
    -0
      src/packages/game/input/IZ_keyboard.c
  8. +5
    -0
      src/packages/game/input/IZ_midi.c
  9. +27
    -112
      src/packages/game/input/input.test.c
  10. +5
    -0
      src/packages/server/db/IZ_repo.c

+ 9
- 0
CMakeLists.txt Переглянути файл

@@ -225,7 +225,16 @@ add_executable(
src/packages/stdinc/IZ_string.h src/packages/stdinc/IZ_string.h
__mocks__/src/packages/stdinc/IZ_string.mock.h __mocks__/src/packages/stdinc/IZ_string.mock.h


src/packages/stdinc/IZ_stdlib.h
__mocks__/src/packages/stdinc/IZ_stdlib.mock.h

src/packages/game/input/input.test.c src/packages/game/input/input.test.c
__mocks__/src/packages/config/IZ_config.mock.h)

target_link_libraries(
game-test-input
SDL2main
SDL2
) )


add_executable( add_executable(


+ 9
- 4
__mocks__/dependencies/SDL2/SDL_joystick.mock.h Переглянути файл

@@ -2,15 +2,14 @@
#define SDL_JOYSTICK_MOCK_H #define SDL_JOYSTICK_MOCK_H


#include <bdd-for-c-mocks.h> #include <bdd-for-c-mocks.h>
#include <SDL_joystick.h>
#include "../../../src/packages/common/IZ_common.h" #include "../../../src/packages/common/IZ_common.h"


typedef struct _SDL_Joystick {} SDL_Joystick;

#define MOCK_OPEN_JOYSTICKS 1 #define MOCK_OPEN_JOYSTICKS 1


mock(SDL_JoystickOpen) SDL_Joystick* SDL_JoystickOpen(i32 device_index) { mock(SDL_JoystickOpen) SDL_Joystick* SDL_JoystickOpen(i32 device_index) {
static SDL_Joystick joystick; static void* joystick = (void*) 1;
mock_return(SDL_JoystickOpen) &joystick; mock_return(SDL_JoystickOpen) (SDL_Joystick*) &joystick;
} }


mock(SDL_NumJoysticks) i32 SDL_NumJoysticks(void) { mock(SDL_NumJoysticks) i32 SDL_NumJoysticks(void) {
@@ -25,4 +24,10 @@ mock(SDL_JoystickClose) void SDL_JoystickClose(SDL_Joystick* _joystick) {
mock_return(SDL_JoystickClose); mock_return(SDL_JoystickClose);
} }


mock(SDL_JoystickGetGUID) SDL_JoystickGUID SDL_JoystickGetGUID(SDL_Joystick* joystick) {
mock_return(SDL_JoystickGetGUID) (SDL_JoystickGUID) {
.data = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }
};
}

#endif #endif

+ 15
- 0
__mocks__/src/packages/config/IZ_config.mock.h Переглянути файл

@@ -0,0 +1,15 @@
#ifndef IZ_CONFIG_MOCK_H
#define IZ_CONFIG_MOCK_H

#include <bdd-for-c-mocks.h>
#include "../../../src/packages/config/IZ_config.h"

mock(IZ_ConfigInitialize) IZ_ConfigInitializeResult IZ_ConfigInitialize(IZ_ConfigItem[], const char*, u8, const char*[]) {
mock_return(IZ_ConfigInitialize) IZ_CONFIG_INITIALIZE_RESULT_OK;
}

mock(IZ_ConfigSave) IZ_ConfigSaveResult IZ_ConfigSave(IZ_ConfigItem[], const char*) {
mock_return(IZ_ConfigSave) 0;
}

#endif

+ 9
- 0
__mocks__/src/packages/stdinc/IZ_string.mock.h Переглянути файл

@@ -2,9 +2,18 @@
#define IZ_STRING_MOCK_C #define IZ_STRING_MOCK_C


#include <bdd-for-c-mocks.h> #include <bdd-for-c-mocks.h>
#include "../../../src/packages/compat/IZ_windows.h"


mock(IZ_memset) void* IZ_memset(void* dst, int c, size_t len) { mock(IZ_memset) void* IZ_memset(void* dst, int c, size_t len) {
mock_return(IZ_memset) 0; mock_return(IZ_memset) 0;
} }


mock(IZ_memcpy) errno_t IZ_memcpy(void* const dest, const rsize_t dest_size, const void* const source, const rsize_t source_size) {
mock_return(IZ_memcpy) 0;
}

mock(IZ_strlwr) errno_t IZ_strlwr(char* dest, const char* str, rsize_t str_size) {
mock_return(IZ_strlwr) 0;
}

#endif #endif

+ 10
- 0
src/packages/config/README.md Переглянути файл

@@ -0,0 +1,10 @@
## Procedure

Subsystem calls its initialize method.

1. Subsystem copies hardcoded default values to its in-memory state container.
2. Subsystem defines the available config items it has, and how it is connected to various config sources (i.e. specify its section and key in the config file, as well as supplying command line options connected to this config item).
3. Subsystem binds the config items with their respective sections and keys in the config file (i.e. correctly point the values to the respective internal state container of the app).
4. Subsystem retrieves the config file values as well as command line arguments (higher priority) supplied to the app upon invocation.
5. Subsystem checks if there are some volatile state data to retrieve and syncs it with the state.
6. Subsystem saves the state to the config file.

+ 6
- 6
src/packages/game/input/IZ_joystick.c Переглянути файл

@@ -302,16 +302,16 @@ IZ_ProcedureResult IZ_JoystickInitialize(IZ_JoystickState(* state)[IZ_PLAYERS],
IZ_memcpy(&(*state)[player_index].config.guid, sizeof(SDL_GUID), &joystick_guid, sizeof(SDL_GUID)); IZ_memcpy(&(*state)[player_index].config.guid, sizeof(SDL_GUID), &joystick_guid, sizeof(SDL_GUID));
//(*state)[player_index].config.guid = joystick_guid; //(*state)[player_index].config.guid = joystick_guid;


printf("[INPUT:JOYSTICK] Initialize event from GUID: "); // printf("[INPUT:JOYSTICK] Initialize event from GUID: ");
for (u8 zz = 0; zz < 16; zz += 1) { // for (u8 zz = 0; zz < 16; zz += 1) {
printf("%02x", (*state)[player_index].config.guid.data[zz]); // printf("%02x", (*state)[player_index].config.guid.data[zz]);
} // }
printf("\n"); // printf("\n");
} }


// Post config (after joystick GUIDs have been queried), this is unique to joysticks since they can be plugged in any // Post config (after joystick GUIDs have been queried), this is unique to joysticks since they can be plugged in any
// time. // time.
IZ_ConfigSaveResult post_config_save_result = IZ_ConfigSave(joystick_config_items, config_path); IZ_ConfigSaveResult post_config_save_result = IZ_JoystickSaveConfig(state, config_path);
if (post_config_save_result < 0) { if (post_config_save_result < 0) {
return -3; return -3;
} }


+ 5
- 0
src/packages/game/input/IZ_keyboard.c Переглянути файл

@@ -92,5 +92,10 @@ IZ_ProcedureResult IZ_KeyboardInitialize(IZ_KeyboardState(* state)[IZ_PLAYERS],
return -2; return -2;
} }


IZ_ConfigSaveResult post_config_save_result = IZ_KeyboardSaveConfig(state, config_path);
if (post_config_save_result < 0) {
return -3;
}

return 0; return 0;
} }

+ 5
- 0
src/packages/game/input/IZ_midi.c Переглянути файл

@@ -181,6 +181,11 @@ IZ_ProcedureResult IZ_MIDIInputInitialize(IZ_MIDIInputState(* state)[IZ_PLAYERS]
); );
} }


IZ_ConfigSaveResult post_config_save_result = IZ_MIDIInputSaveConfig(state, config_path);
if (post_config_save_result < 0) {
return -3;
}

return 0; return 0;
} }




+ 27
- 112
src/packages/game/input/input.test.c Переглянути файл

@@ -5,6 +5,8 @@
#include "../../../../__mocks__/dependencies/minIni/minIni.mock.h" #include "../../../../__mocks__/dependencies/minIni/minIni.mock.h"
#include "../../../../__mocks__/dependencies/portmidi/portmidi.mock.h" #include "../../../../__mocks__/dependencies/portmidi/portmidi.mock.h"
#include "../../../../__mocks__/src/packages/stdinc/IZ_string.mock.h" #include "../../../../__mocks__/src/packages/stdinc/IZ_string.mock.h"
#include "../../../../__mocks__/src/packages/stdinc/IZ_stdlib.mock.h"
#include "../../../../__mocks__/src/packages/config/IZ_config.mock.h"
#include "IZ_keyboard.h" #include "IZ_keyboard.h"
#include "IZ_joystick.h" #include "IZ_joystick.h"
#include "IZ_midi.h" #include "IZ_midi.h"
@@ -35,11 +37,11 @@ spec("input") {
} }


after_each() { after_each() {
mock_reset(ini_putl); mock_reset(IZ_ConfigSave);
} }


after_each() { after_each() {
mock_reset(ini_getl); mock_reset(IZ_ConfigInitialize);
} }


it("sets initial state") { it("sets initial state") {
@@ -50,29 +52,15 @@ spec("input") {
} }


it("calls load method") { it("calls load method") {
mock_set_expected_calls(ini_getl, ((IZ_CONTROLS - 4) + 2) * IZ_PLAYERS);

IZ_JoystickInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL); IZ_JoystickInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL);


check( check(mock_is_called(IZ_ConfigInitialize), "Config load function not called.");
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)
);
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_putl, ((IZ_CONTROLS - 4) + 2) * IZ_PLAYERS);

IZ_JoystickInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL); IZ_JoystickInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL);


check( check(mock_is_called(IZ_ConfigSave), "Config save function not called.");
mock_get_expected_calls(ini_putl) == mock_get_actual_calls(ini_putl),
"Call count mismatch for ini_putl() (expected %u, received %u).",
mock_get_expected_calls(ini_putl),
mock_get_actual_calls(ini_putl)
);
} }


it("opens device handles") { it("opens device handles") {
@@ -339,7 +327,7 @@ spec("input") {
static IZ_JoystickState state[IZ_PLAYERS]; static IZ_JoystickState state[IZ_PLAYERS];


after_each() { after_each() {
mock_reset(ini_putl); mock_reset(IZ_ConfigSave);
} }


before_each() { before_each() {
@@ -351,26 +339,19 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_putl, ((IZ_CONTROLS - 4) + 2) * IZ_PLAYERS);

IZ_JoystickSaveConfig(&state, IZ_CONFIG_GAME_PATH); IZ_JoystickSaveConfig(&state, IZ_CONFIG_GAME_PATH);


check( check(mock_is_called(IZ_ConfigSave), "Config save function not called.");
mock_get_expected_calls(ini_putl) == mock_get_actual_calls(ini_putl),
"Call count mismatch for ini_putl() (expected %u, received %u).",
mock_get_expected_calls(ini_putl),
mock_get_actual_calls(ini_putl)
);
} }
} }


describe("Teardown") { describe("Teardown") {
static SDL_Joystick device; static void* device = (void*) 1;
static IZ_JoystickState state[IZ_PLAYERS] = {}; static IZ_JoystickState state[IZ_PLAYERS] = {};


before_each() { before_each() {
for (u8 p = 0; p < IZ_PLAYERS; p += 1) { for (u8 p = 0; p < IZ_PLAYERS; p += 1) {
state[p].device = &device; state[p].device = device;
} }
} }


@@ -402,11 +383,11 @@ spec("input") {
// } // }


after_each() { after_each() {
mock_reset(ini_gets); mock_reset(IZ_ConfigInitialize);
} }


after_each() { after_each() {
mock_reset(ini_puts); mock_reset(IZ_ConfigSave);
} }


before_each() { before_each() {
@@ -424,29 +405,15 @@ spec("input") {
} }


it("calls load method") { it("calls load method") {
mock_set_expected_calls(ini_gets, IZ_CONTROLS * IZ_PLAYERS);

IZ_KeyboardInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL); IZ_KeyboardInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL);


check( check(mock_is_called(IZ_ConfigInitialize), "Config load function not called.");
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)
);
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, IZ_CONTROLS * IZ_PLAYERS);

IZ_KeyboardInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL); IZ_KeyboardInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL);


check( check(mock_is_called(IZ_ConfigSave), "Config save function not called.");
mock_get_expected_calls(ini_puts) == mock_get_actual_calls(ini_puts),
"Call count mismatch for ini_puts() (expected %u, received %u).",
mock_get_expected_calls(ini_puts),
mock_get_actual_calls(ini_puts)
);
} }
} }


@@ -492,7 +459,7 @@ spec("input") {
static IZ_KeyboardState state[IZ_PLAYERS] = {}; static IZ_KeyboardState state[IZ_PLAYERS] = {};


after_each() { after_each() {
mock_reset(ini_puts); mock_reset(IZ_ConfigSave);
} }


before_each() { before_each() {
@@ -504,16 +471,9 @@ spec("input") {
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, IZ_CONTROLS * IZ_PLAYERS); IZ_KeyboardSaveConfig(&state, IZ_CONFIG_GAME_PATH);

IZ_KeyboardSaveConfig(IZ_CONFIG_GAME_PATH, &state);


check( check(mock_is_called(IZ_ConfigSave), "Config save function not called.");
mock_get_expected_calls(ini_puts) == mock_get_actual_calls(ini_puts),
"Call count mismatch for ini_puts() (expected %u, received %u).",
mock_get_expected_calls(ini_puts),
mock_get_actual_calls(ini_puts)
);
} }
} }
} }
@@ -535,19 +495,19 @@ spec("input") {
} }


after_each() { after_each() {
mock_reset(ini_puts); mock_reset(IZ_ConfigSave);
} }


after_each() { after_each() {
mock_reset(ini_gets); mock_reset(IZ_ConfigInitialize);
} }


after_each() { after_each() {
mock_reset(ini_putl); mock_reset(IZ_ConfigSave);
} }


after_each() { after_each() {
mock_reset(ini_getl); mock_reset(IZ_ConfigInitialize);
} }


it("sets initial state") { it("sets initial state") {
@@ -558,45 +518,15 @@ spec("input") {
} }


it("calls load method") { it("calls load method") {
mock_set_expected_calls(ini_gets, IZ_CONTROLS * IZ_PLAYERS);
mock_set_expected_calls(ini_getl, 2 * IZ_PLAYERS);

IZ_MIDIInputInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL); IZ_MIDIInputInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL);


check( check(mock_is_called(IZ_ConfigInitialize), "Config load function not called.");
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)
);

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)
);
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, IZ_CONTROLS * IZ_PLAYERS);
mock_set_expected_calls(ini_putl, 2 * IZ_PLAYERS);

IZ_MIDIInputInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL); IZ_MIDIInputInitialize(&state, IZ_CONFIG_GAME_PATH, 0, NULL);


check( check(mock_is_called(IZ_ConfigSave), "Config save function not called.");
mock_get_expected_calls(ini_puts) == mock_get_actual_calls(ini_puts),
"Call count mismatch for ini_puts() (expected %u, received %u).",
mock_get_expected_calls(ini_puts),
mock_get_actual_calls(ini_puts)
);

check(
mock_get_expected_calls(ini_putl) == mock_get_actual_calls(ini_putl),
"Call count mismatch for ini_putl() (expected %u, received %u).",
mock_get_expected_calls(ini_putl),
mock_get_actual_calls(ini_putl)
);
} }


it("opens device handles") { it("opens device handles") {
@@ -617,32 +547,17 @@ spec("input") {
static IZ_MIDIInputState state[IZ_PLAYERS]; static IZ_MIDIInputState state[IZ_PLAYERS];


after_each() { after_each() {
mock_reset(ini_puts); mock_reset(IZ_ConfigSave);
} }


after_each() { after_each() {
mock_reset(ini_putl); mock_reset(IZ_ConfigSave);
} }


it("calls save method") { it("calls save method") {
mock_set_expected_calls(ini_puts, IZ_CONTROLS * IZ_PLAYERS); IZ_MIDIInputSaveConfig(&state, IZ_CONFIG_GAME_PATH);
mock_set_expected_calls(ini_putl, 2 * IZ_PLAYERS);


IZ_MIDIInputSaveConfig(IZ_CONFIG_GAME_PATH, &state); check(mock_is_called(IZ_ConfigSave), "Config save function not called.");

check(
mock_get_expected_calls(ini_puts) == mock_get_actual_calls(ini_puts),
"Call count mismatch for ini_puts() (expected %u, received %u).",
mock_get_expected_calls(ini_puts),
mock_get_actual_calls(ini_puts)
);

check(
mock_get_expected_calls(ini_putl) == mock_get_actual_calls(ini_putl),
"Call count mismatch for ini_putl() (expected %u, received %u).",
mock_get_expected_calls(ini_putl),
mock_get_actual_calls(ini_putl)
);
} }
} }




+ 5
- 0
src/packages/server/db/IZ_repo.c Переглянути файл

@@ -46,6 +46,11 @@ IZ_ProcedureResult IZ_RepoInitialize(IZ_RepoState* state, const char* config_pat
IZ_strcat(config_path_dir, 128, "/"); IZ_strcat(config_path_dir, 128, "/");
IZ_strcat(config_path_dir, 128, state->config.path); IZ_strcat(config_path_dir, 128, state->config.path);
sqlite3_open_v2(config_path_dir, &state->db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL); sqlite3_open_v2(config_path_dir, &state->db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);

IZ_ConfigSaveResult post_config_save_result = IZ_RepoSaveConfig(state, config_path);
if (post_config_save_result < 0) {
return -3;
}
return 0; return 0;
} }




||||||
x
 
000:0
Завантаження…
Відмінити
Зберегти