diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 92e8170fa..ab918a5eb 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -666,6 +666,13 @@ void SpawnLightning(Missile &missile, int dam) } // namespace +#ifdef BUILD_TESTING +void TestRotateBlockedMissile(Missile &missile) +{ + RotateBlockedMissile(missile); +} +#endif + bool IsMissileBlockedByTile(Point tile) { if (!InDungeonBounds(tile)) { diff --git a/Source/missiles.h b/Source/missiles.h index ba79d7333..3b8084a0f 100644 --- a/Source/missiles.h +++ b/Source/missiles.h @@ -431,4 +431,8 @@ void ProcessMissiles(); void missiles_process_charge(); void RedoMissileFlags(); +#ifdef BUILD_TESTING +void TestRotateBlockedMissile(Missile &missile); +#endif + } // namespace devilution diff --git a/test/missiles_test.cpp b/test/missiles_test.cpp index fa716b486..afbea3652 100644 --- a/test/missiles_test.cpp +++ b/test/missiles_test.cpp @@ -1,9 +1,31 @@ #include +#include "engine/random.hpp" #include "missiles.h" using namespace devilution; +TEST(Missiles, RotateBlockedMissileArrow) +{ + Player &player = Players[0]; + // missile can be a copy or a reference, there's no nullptr check and the functions that use it don't expect the instance to be part of a global structure so it doesn't really matter for this use. + Missile missile = *AddMissile({ 0, 0 }, { 0, 0 }, Direction::South, MIS_ARROW, TARGET_MONSTERS, player.getId(), 0, 0); + EXPECT_EQ(missile._miAnimFrame, 1); + + SetRndSeed(0); + TestRotateBlockedMissile(missile); + EXPECT_EQ(missile._miAnimFrame, 16); + + SetRndSeed(3210); + TestRotateBlockedMissile(missile); + EXPECT_EQ(missile._miAnimFrame, 1); + + missile._miAnimFrame = 5; + SetRndSeed(1234); + TestRotateBlockedMissile(missile); + EXPECT_EQ(missile._miAnimFrame, 6); +} + TEST(Missiles, GetDirection8) { EXPECT_EQ(Direction::South, GetDirection({ 0, 0 }, { 15, 15 }));