make check TESTS="..." support for filenames and infix matches (#7536)
This commit is contained in:
parent
98a51bc97a
commit
7b5844762d
2
Makefile
2
Makefile
@ -300,7 +300,7 @@ $(TESTELF): $(OBJ_DIR)/ld_script_test.ld $(OBJS) $(TEST_OBJS) libagbsyscall tool
|
|||||||
@echo "cd $(OBJ_DIR) && $(LD) -T ld_script_test.ld -o ../../$@ <objects> <test-objects> <lib>"
|
@echo "cd $(OBJ_DIR) && $(LD) -T ld_script_test.ld -o ../../$@ <objects> <test-objects> <lib>"
|
||||||
@cd $(OBJ_DIR) && $(LD) $(TESTLDFLAGS) -T ld_script_test.ld -o ../../$@ $(OBJS_REL) $(TEST_OBJS_REL) $(LIB)
|
@cd $(OBJ_DIR) && $(LD) $(TESTLDFLAGS) -T ld_script_test.ld -o ../../$@ $(OBJS_REL) $(TEST_OBJS_REL) $(LIB)
|
||||||
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) -d0 --silent
|
$(FIX) $@ -t"$(TITLE)" -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) -d0 --silent
|
||||||
$(PATCHELF) $(TESTELF) gTestRunnerArgv "$(TESTS)\0"
|
$(PATCHELF) $(TESTELF) gTestRunnerArgv "$(TESTS:%*=%)\0"
|
||||||
|
|
||||||
ifeq ($(GITHUB_REPOSITORY_OWNER),rh-hideout)
|
ifeq ($(GITHUB_REPOSITORY_OWNER),rh-hideout)
|
||||||
TEST_SKIP_IS_FAIL := \x01
|
TEST_SKIP_IS_FAIL := \x01
|
||||||
|
|||||||
@ -2,8 +2,13 @@
|
|||||||
*
|
*
|
||||||
* To run all the tests use:
|
* To run all the tests use:
|
||||||
* make check -j
|
* make check -j
|
||||||
* To run specific tests, e.g. Spikes ones, use:
|
* To run specific tests, e.g. Spikes ones, use either:
|
||||||
* make check TESTS="Spikes"
|
* make check TESTS="Spikes"
|
||||||
|
* make check TESTS="*Spikes*"
|
||||||
|
* The first runs tests with names that start with Spikes, whereas the
|
||||||
|
* second runs tests with names that include Spikes anywhere in them.
|
||||||
|
* To run tests from a specific file, e.g. 'test/battle/move_effect/spikes.c', use:
|
||||||
|
* make check TESTS="test/battle/move_effect/spikes.c"
|
||||||
* To build a ROM (pokemerald-test.elf) that can be opened in mgba to
|
* To build a ROM (pokemerald-test.elf) that can be opened in mgba to
|
||||||
* view specific tests, e.g. Spikes ones, use:
|
* view specific tests, e.g. Spikes ones, use:
|
||||||
* make pokeemerald-test.elf TESTS="Spikes"
|
* make pokeemerald-test.elf TESTS="Spikes"
|
||||||
|
|||||||
@ -37,10 +37,18 @@ struct Test
|
|||||||
u16 sourceLine;
|
u16 sourceLine;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum TestFilterMode
|
||||||
|
{
|
||||||
|
TEST_FILTER_MODE_TEST_NAME_PREFIX,
|
||||||
|
TEST_FILTER_MODE_TEST_NAME_INFIX,
|
||||||
|
TEST_FILTER_MODE_FILENAME_EXACT,
|
||||||
|
};
|
||||||
|
|
||||||
struct TestRunnerState
|
struct TestRunnerState
|
||||||
{
|
{
|
||||||
u8 state;
|
u8 state;
|
||||||
u8 exitCode;
|
u8 exitCode;
|
||||||
|
enum TestFilterMode filterMode:8;
|
||||||
const char *skipFilename;
|
const char *skipFilename;
|
||||||
u32 failedAssumptionsBlockLine;
|
u32 failedAssumptionsBlockLine;
|
||||||
const struct Test *test;
|
const struct Test *test;
|
||||||
|
|||||||
@ -34,6 +34,25 @@ static void Intr_Timer2(void);
|
|||||||
extern const struct Test __start_tests[];
|
extern const struct Test __start_tests[];
|
||||||
extern const struct Test __stop_tests[];
|
extern const struct Test __stop_tests[];
|
||||||
|
|
||||||
|
static enum TestFilterMode DetectFilterMode(const char *pattern)
|
||||||
|
{
|
||||||
|
size_t n = strlen(pattern);
|
||||||
|
if (n > 2 && pattern[n-2] == '.' && pattern[n-1] == 'c')
|
||||||
|
return TEST_FILTER_MODE_FILENAME_EXACT;
|
||||||
|
else if (pattern[0] == '*') // TODO: Support '*pattern*'.
|
||||||
|
return TEST_FILTER_MODE_TEST_NAME_INFIX;
|
||||||
|
else
|
||||||
|
return TEST_FILTER_MODE_TEST_NAME_PREFIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool32 ExactMatch(const char *pattern, const char *string)
|
||||||
|
{
|
||||||
|
if (string == NULL)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return strcmp(pattern, string) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
static bool32 PrefixMatch(const char *pattern, const char *string)
|
static bool32 PrefixMatch(const char *pattern, const char *string)
|
||||||
{
|
{
|
||||||
if (string == NULL)
|
if (string == NULL)
|
||||||
@ -50,6 +69,14 @@ static bool32 PrefixMatch(const char *pattern, const char *string)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool32 InfixMatch(const char *pattern, const char *string)
|
||||||
|
{
|
||||||
|
if (string == NULL)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
return strstr(string, &pattern[1]) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
STATE_INIT,
|
STATE_INIT,
|
||||||
@ -171,6 +198,8 @@ top:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gTestRunnerState.filterMode = DetectFilterMode(gTestRunnerArgv);
|
||||||
|
|
||||||
MoveSaveBlocks_ResetHeap();
|
MoveSaveBlocks_ResetHeap();
|
||||||
ClearSav1();
|
ClearSav1();
|
||||||
ClearSav2();
|
ClearSav2();
|
||||||
@ -231,11 +260,17 @@ top:
|
|||||||
gTestRunnerState.state = STATE_EXIT;
|
gTestRunnerState.state = STATE_EXIT;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (gTestRunnerState.test->runner != &gAssumptionsRunner
|
if (gTestRunnerState.test->runner != &gAssumptionsRunner)
|
||||||
&& !PrefixMatch(gTestRunnerArgv, gTestRunnerState.test->name))
|
{
|
||||||
++gTestRunnerState.test;
|
if ((gTestRunnerState.filterMode == TEST_FILTER_MODE_TEST_NAME_PREFIX && !PrefixMatch(gTestRunnerArgv, gTestRunnerState.test->name))
|
||||||
else
|
|| (gTestRunnerState.filterMode == TEST_FILTER_MODE_TEST_NAME_INFIX && !InfixMatch(gTestRunnerArgv, gTestRunnerState.test->name))
|
||||||
break;
|
|| (gTestRunnerState.filterMode == TEST_FILTER_MODE_FILENAME_EXACT && !ExactMatch(gTestRunnerArgv, gTestRunnerState.test->filename)))
|
||||||
|
{
|
||||||
|
++gTestRunnerState.test;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Test_MgbaPrintf(":N%s", gTestRunnerState.test->name);
|
Test_MgbaPrintf(":N%s", gTestRunnerState.test->name);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user