Files
EVEngine/test/rpg_gamestate.cpp
T

86 lines
2.8 KiB
C++

#include "zeroerr/assert.h"
#include "zeroerr/unittest.h"
#include "rpg/GameState.h"
#include "rpg/RPG.h"
using namespace eve::rpg;
TEST_CASE("rpg.gameState.switchesAndVariables") {
GameState gs;
CHECK(!gs.isSwitchOn("door"));
gs.switchOn("door");
CHECK(gs.isSwitchOn("door"));
gs.switchOff("door");
CHECK(!gs.isSwitchOn("door"));
gs.setSwitch("flag", true);
CHECK(gs.isSwitchOn("flag"));
CHECK_EQ(gs.getVariable("gold"), 0.0);
gs.setVariable("gold", 100.0);
CHECK_EQ(gs.getVariable("gold"), 100.0);
gs.addVariable("gold", 25.0);
CHECK_EQ(gs.getVariable("gold"), 125.0);
gs.clear();
CHECK(!gs.isSwitchOn("flag"));
CHECK_EQ(gs.getVariable("gold"), 0.0);
}
TEST_CASE("rpg.gameState.selfVariablesScoped") {
GameState gs;
gs.setSelfVariable("map:1:event:3", "switchA", 1.0);
CHECK(gs.hasSelfVariable("map:1:event:3", "switchA"));
CHECK_EQ(gs.getSelfVariable("map:1:event:3", "switchA"), 1.0);
// 不同 scope 隔离
CHECK(!gs.hasSelfVariable("map:1:event:4", "switchA"));
CHECK_EQ(gs.getSelfVariable("map:1:event:3", "missing"), 0.0);
}
TEST_CASE("rpg.gameState.facadeAndGlobal") {
auto *rpg = RPG::create();
// 独立实例
GameState *gs = rpg->newGameState();
REQUIRE(gs != nullptr);
gs->setVariable("hp", 50.0);
gs->setSwitch("boss_alive", true);
CHECK_EQ(gs->getVariable("hp"), 50.0);
CHECK(gs->isSwitchOn("boss_alive"));
// 全局单例
GameState *g = rpg->globalGameState();
REQUIRE(g != nullptr);
g->clear();
g->setVariable("level", 7.0);
CHECK_EQ(GameState::global().getVariable("level"), 7.0);
}
TEST_CASE("rpg.gameState.versionedSnapshotRoundTripAndAtomicFailure") {
eve::rpg::GameState source;
source.switchOn("door.open");
source.setVariable("gold", 125.5);
source.setSelfVariable("map:1:event:3", "visits", 2.0);
auto encoded = source.snapshotJson();
REQUIRE(encoded.ok());
eve::rpg::GameState restored;
restored.setVariable("sentinel", 7.0);
auto applied = restored.restoreSnapshotJson(encoded.value());
REQUIRE(applied.ok());
CHECK(restored.isSwitchOn("door.open"));
CHECK_EQ(restored.getVariable("gold"), 125.5);
CHECK_EQ(restored.getSelfVariable("map:1:event:3", "visits"), 2.0);
CHECK_EQ(restored.getVariable("sentinel"), 0.0);
auto malformed = restored.restoreSnapshotJson(
R"({"schema":"eve.rpg.game-state","version":1,"switches":{},"variables":{"gold":"bad"},"selfVariables":{}})");
CHECK(!malformed.ok());
CHECK_EQ(restored.getVariable("gold"), 125.5);
auto future = restored.restoreSnapshotJson(
R"({"schema":"eve.rpg.game-state","version":2,"switches":{},"variables":{},"selfVariables":{}})");
CHECK(!future.ok());
CHECK_EQ(restored.getVariable("gold"), 125.5);
}