Made the speed tie test use PASSES_RANDOMLY (#5092)
* Made the speed tie test use PASSES_RANDOMLY * Hack to allow results with PASSES_RANDOMLY --------- Co-authored-by: Hedara <hedara90@gmail.com> Co-authored-by: Martin Griffin <martinrgriffin@gmail.com>
This commit is contained in:
parent
a8cd459370
commit
cfa7316ea0
2 changed files with 48 additions and 47 deletions
|
@ -80,57 +80,57 @@ SINGLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie
|
|||
}
|
||||
}
|
||||
|
||||
DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie [doubles]")
|
||||
DOUBLE_BATTLE_TEST("Turn order is determined randomly if priority and Speed tie [doubles]", u32 permutations)
|
||||
{
|
||||
struct BattlePokemon *order[4] = { NULL, NULL, NULL, NULL };
|
||||
u32 a, b, c, d;
|
||||
|
||||
// TODO: Test all of these in a single PASSES_RANDOMLY pass rather
|
||||
// than 24 PARAMETRIZEd passes.
|
||||
PARAMETRIZE { a = 0; b = 1; c = 2; d = 3; }
|
||||
PARAMETRIZE { a = 0; b = 1; c = 3; d = 2; }
|
||||
PARAMETRIZE { a = 0; b = 2; c = 1; d = 3; }
|
||||
PARAMETRIZE { a = 0; b = 2; c = 3; d = 1; }
|
||||
PARAMETRIZE { a = 0; b = 3; c = 1; d = 2; }
|
||||
PARAMETRIZE { a = 0; b = 3; c = 2; d = 1; }
|
||||
PARAMETRIZE { a = 1; b = 0; c = 2; d = 3; }
|
||||
PARAMETRIZE { a = 1; b = 0; c = 3; d = 2; }
|
||||
PARAMETRIZE { a = 1; b = 2; c = 0; d = 3; }
|
||||
PARAMETRIZE { a = 1; b = 2; c = 3; d = 0; }
|
||||
PARAMETRIZE { a = 1; b = 3; c = 0; d = 2; }
|
||||
PARAMETRIZE { a = 1; b = 3; c = 2; d = 0; }
|
||||
PARAMETRIZE { a = 2; b = 0; c = 1; d = 3; }
|
||||
PARAMETRIZE { a = 2; b = 0; c = 3; d = 1; }
|
||||
PARAMETRIZE { a = 2; b = 1; c = 0; d = 3; }
|
||||
PARAMETRIZE { a = 2; b = 1; c = 3; d = 0; }
|
||||
PARAMETRIZE { a = 2; b = 3; c = 0; d = 1; }
|
||||
PARAMETRIZE { a = 2; b = 3; c = 1; d = 0; }
|
||||
PARAMETRIZE { a = 3; b = 0; c = 1; d = 2; }
|
||||
PARAMETRIZE { a = 3; b = 0; c = 2; d = 1; }
|
||||
PARAMETRIZE { a = 3; b = 1; c = 0; d = 2; }
|
||||
PARAMETRIZE { a = 3; b = 1; c = 2; d = 0; }
|
||||
PARAMETRIZE { a = 3; b = 2; c = 0; d = 1; }
|
||||
PARAMETRIZE { a = 3; b = 2; c = 1; d = 0; }
|
||||
|
||||
order[a] = playerLeft;
|
||||
order[b] = playerRight;
|
||||
order[c] = opponentLeft;
|
||||
order[d] = opponentRight;
|
||||
|
||||
PASSES_RANDOMLY(1, 24, RNG_SPEED_TIE);
|
||||
PARAMETRIZE {} // Hack to make permutations legal.
|
||||
PASSES_RANDOMLY(24, 24, RNG_SPEED_TIE);
|
||||
|
||||
ASSUME(gMovesInfo[MOVE_ENDEAVOR].effect == EFFECT_ENDEAVOR);
|
||||
ASSUME(gMovesInfo[MOVE_LIFE_DEW].effect == EFFECT_JUNGLE_HEALING);
|
||||
ASSUME(gMovesInfo[MOVE_CRUSH_GRIP].effect == EFFECT_VARY_POWER_BASED_ON_HP);
|
||||
ASSUME(gMovesInfo[MOVE_SUPER_FANG].effect == EFFECT_SUPER_FANG);
|
||||
GIVEN {
|
||||
PLAYER(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
PLAYER(SPECIES_WOBBUFFET) { MaxHP(480); HP(360); Defense(100); Speed(1); }
|
||||
PLAYER(SPECIES_WYNAUT) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Speed(1); }
|
||||
OPPONENT(SPECIES_WOBBUFFET) { Attack(100); Speed(1); }
|
||||
OPPONENT(SPECIES_WYNAUT) { Speed(1); }
|
||||
} WHEN {
|
||||
TURN { MOVE(playerLeft, MOVE_SPLASH); MOVE(playerRight, MOVE_SPLASH); MOVE(opponentLeft, MOVE_SPLASH); MOVE(opponentRight, MOVE_SPLASH); }
|
||||
} SCENE {
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[0]);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[1]);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[2]);
|
||||
ANIMATION(ANIM_TYPE_MOVE, MOVE_SPLASH, order[3]);
|
||||
TURN { MOVE(playerLeft, MOVE_ENDEAVOR, target: opponentLeft); MOVE(playerRight, MOVE_LIFE_DEW); MOVE(opponentLeft, MOVE_CRUSH_GRIP, target: playerLeft, WITH_RNG(RNG_DAMAGE_MODIFIER, 0)); MOVE(opponentRight, MOVE_SUPER_FANG, target: playerLeft); }
|
||||
} THEN {
|
||||
// This tests for unique combinatins of HP values depending on which order the moves are executed in
|
||||
// The unique outcomes arise from the specific attacks and HP, Def, and Atk values chosen
|
||||
// The switch is then set up in such a way that the only way for this test to pass exactly one is for each HP combination to occur exactly once
|
||||
#define HP_PAIR(a, b) ((a) * 1000 + (b))
|
||||
switch (HP_PAIR(playerLeft->hp, opponentLeft->hp))
|
||||
{
|
||||
case HP_PAIR(188, 360): results[i].permutations += 1 << 0; break;
|
||||
case HP_PAIR(189, 360): results[i].permutations += 1 << 1; break;
|
||||
case HP_PAIR(261, 360): results[i].permutations += 1 << 2; break;
|
||||
case HP_PAIR(235, 360): results[i].permutations += 1 << 3; break;
|
||||
case HP_PAIR(262, 360): results[i].permutations += 1 << 4; break;
|
||||
case HP_PAIR(202, 360): results[i].permutations += 1 << 5; break;
|
||||
case HP_PAIR(189, 378): results[i].permutations += 1 << 6; break;
|
||||
case HP_PAIR(189, 189): results[i].permutations += 1 << 7; break;
|
||||
case HP_PAIR(189, 480): results[i].permutations += 1 << 8; break;
|
||||
case HP_PAIR(188, 480): results[i].permutations += 1 << 9; break;
|
||||
case HP_PAIR(188, 240): results[i].permutations += 1 << 10; break;
|
||||
case HP_PAIR(188, 188): results[i].permutations += 1 << 11; break;
|
||||
case HP_PAIR(262, 262): results[i].permutations += 1 << 12; break;
|
||||
case HP_PAIR(262, 142): results[i].permutations += 1 << 13; break;
|
||||
case HP_PAIR(202, 403): results[i].permutations += 1 << 14; break;
|
||||
case HP_PAIR(202, 202): results[i].permutations += 1 << 15; break;
|
||||
case HP_PAIR(262, 283): results[i].permutations += 1 << 16; break;
|
||||
case HP_PAIR(202, 283): results[i].permutations += 1 << 17; break;
|
||||
case HP_PAIR(235, 180): results[i].permutations += 1 << 18; break;
|
||||
case HP_PAIR(261, 180): results[i].permutations += 1 << 19; break;
|
||||
case HP_PAIR(235, 235): results[i].permutations += 1 << 20; break;
|
||||
case HP_PAIR(235, 300): results[i].permutations += 1 << 21; break;
|
||||
case HP_PAIR(261, 141): results[i].permutations += 1 << 22; break;
|
||||
case HP_PAIR(261, 261): results[i].permutations += 1 << 23; break;
|
||||
}
|
||||
#undef HP_PAIR
|
||||
} FINALLY {
|
||||
EXPECT_EQ(results[i].permutations, (1 << 24) - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1327,7 +1327,7 @@ void TestRunner_Battle_AfterLastTurn(void)
|
|||
}
|
||||
|
||||
STATE->runThen = TRUE;
|
||||
STATE->runFinally = STATE->runParameter + 1 == STATE->parameters;
|
||||
STATE->runFinally = STATE->runParameter + 1 == STATE->parameters && STATE->runTrial + 1 >= STATE->trials;
|
||||
InvokeTestFunction(test);
|
||||
STATE->runThen = FALSE;
|
||||
STATE->runFinally = FALSE;
|
||||
|
@ -1369,6 +1369,7 @@ static inline rng_value_t MakeRngValue(const u16 seed)
|
|||
return ISO_RANDOMIZE1(seed);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void CB2_BattleTest_NextTrial(void)
|
||||
{
|
||||
ClearFlagAfterTest();
|
||||
|
@ -1452,7 +1453,7 @@ void Randomly(u32 sourceLine, u32 passes, u32 trials, struct RandomlyContext ctx
|
|||
{
|
||||
const struct BattleTest *test = GetBattleTest();
|
||||
INVALID_IF(STATE->trials != 0, "PASSES_RANDOMLY can only be used once per test");
|
||||
INVALID_IF(test->resultsSize > 0, "PASSES_RANDOMLY is incompatible with results");
|
||||
INVALID_IF(test->resultsSize > 0 && STATE->parametersCount > 1, "PASSES_RANDOMLY is incompatible with results");
|
||||
INVALID_IF(passes > trials, "%d passes specified, but only %d trials", passes, trials);
|
||||
STATE->rngTag = ctx.tag;
|
||||
STATE->rngTrialOffset = 0;
|
||||
|
|
Loading…
Reference in a new issue