test: cover manualObjective and statObjective
This commit is contained in:
1 parent
dcba0c8da0
commit
5f13d20936
1 file changed
+157
@@ -0,0 +1,157 @@
|
||||
#include "testHarness.h"
|
||||
#include "vf/Scoreboard.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
using namespace vf;
|
||||
|
||||
namespace {
|
||||
|
||||
ScoreObjective manualObjective(const std::string& name) {
|
||||
ScoreObjective objective;
|
||||
objective.name = name;
|
||||
objective.displayName = name;
|
||||
return objective;
|
||||
}
|
||||
|
||||
ScoreObjective statObjective(const std::string& name, StatKind kind, int subject = -1) {
|
||||
ScoreObjective objective = manualObjective(name);
|
||||
objective.criterion = ScoreObjective::Criterion::Statistic;
|
||||
objective.statKind = kind;
|
||||
objective.statSubject = subject;
|
||||
return objective;
|
||||
}
|
||||
|
||||
ScoreTeam makeTeam(const std::string& name, ScoreTeam::Color color) {
|
||||
ScoreTeam team;
|
||||
team.name = name;
|
||||
team.displayName = name;
|
||||
team.color = color;
|
||||
return team;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
VF_TEST(statSheetsTallyEveryKindWithAndWithoutASubject) {
|
||||
StatSheet sheet;
|
||||
CHECK_EQ(sheet.revision(), 0);
|
||||
CHECK_EQ(sheet.total(StatKind::Deaths), 0);
|
||||
|
||||
sheet.add(StatKind::Deaths, 1);
|
||||
sheet.add(StatKind::PlayTicks, 12000);
|
||||
sheet.add(StatKind::DistanceWalked, 450);
|
||||
sheet.add(StatKind::DistanceSprinted, 1200);
|
||||
sheet.addBlockBroken(Block::Stone, 40);
|
||||
sheet.addBlockBroken(Block::Dirt, 7);
|
||||
sheet.addItemUsed(ItemId::IronPickaxe, 3);
|
||||
sheet.addMobKilled(Species::Zombie, 2);
|
||||
sheet.addMobKilled(Species::Creeper);
|
||||
|
||||
CHECK_EQ(sheet.total(StatKind::Deaths), 1);
|
||||
CHECK_EQ(sheet.total(StatKind::PlayTicks), 12000);
|
||||
CHECK_EQ(sheet.blocksBroken(Block::Stone), 40);
|
||||
CHECK_EQ(sheet.blocksBroken(Block::Sand), 0);
|
||||
CHECK_EQ(sheet.total(StatKind::BlocksBroken), 47);
|
||||
CHECK_EQ(sheet.itemsUsed(ItemId::IronPickaxe), 3);
|
||||
CHECK_EQ(sheet.mobsKilled(Species::Zombie), 2);
|
||||
CHECK_EQ(sheet.mobsKilled(Species::Creeper), 1);
|
||||
CHECK_EQ(sheet.total(StatKind::MobsKilled), 3);
|
||||
CHECK_EQ(sheet.distanceTravelled(), 1650);
|
||||
CHECK_EQ(sheet.distinctSubjects(StatKind::BlocksBroken), 2);
|
||||
CHECK_EQ(sheet.distinctSubjects(StatKind::Deaths), 1);
|
||||
|
||||
long long before = sheet.revision();
|
||||
sheet.add(StatKind::Deaths, 0);
|
||||
CHECK_EQ(sheet.revision(), before);
|
||||
sheet.add(StatKind::Deaths, 1);
|
||||
CHECK_EQ(sheet.revision(), before + 1);
|
||||
CHECK_EQ(sheet.total(StatKind::Deaths), 2);
|
||||
|
||||
std::vector<StatCounter> counters = sheet.counters();
|
||||
CHECK_EQ(counters.size(), static_cast<std::size_t>(9));
|
||||
for (std::size_t i = 1u; i < counters.size(); ++i) {
|
||||
bool ordered = counters[i - 1u].kind < counters[i].kind ||
|
||||
(counters[i - 1u].kind == counters[i].kind &&
|
||||
counters[i - 1u].subject < counters[i].subject);
|
||||
CHECK(ordered);
|
||||
}
|
||||
|
||||
sheet.clear();
|
||||
CHECK_EQ(sheet.counters().size(), static_cast<std::size_t>(0));
|
||||
CHECK_EQ(sheet.total(StatKind::BlocksBroken), 0);
|
||||
CHECK(sheet.revision() > before);
|
||||
|
||||
for (int i = 0; i < static_cast<int>(StatKind::Count); ++i) {
|
||||
StatKind kind = static_cast<StatKind>(i);
|
||||
StatKind reparsed = StatKind::Count;
|
||||
CHECK(parseStatKindName(statKindName(kind), reparsed));
|
||||
CHECK(reparsed == kind);
|
||||
}
|
||||
StatKind unknown = StatKind::Count;
|
||||
CHECK(!parseStatKindName("blocksPlaced", unknown));
|
||||
CHECK(statKindHasSubject(StatKind::BlocksBroken));
|
||||
CHECK(!statKindHasSubject(StatKind::Deaths));
|
||||
CHECK(statKindIsDistance(StatKind::DistanceFallen));
|
||||
CHECK(!statKindIsDistance(StatKind::PlayTicks));
|
||||
}
|
||||
|
||||
VF_TEST(anAutomaticObjectiveFollowsTheStatSheetWithNoUpdateStep) {
|
||||
Scoreboard board;
|
||||
CHECK(board.addObjective(statObjective("mined", StatKind::BlocksBroken)));
|
||||
CHECK(board.addObjective(statObjective("stone", StatKind::BlocksBroken,
|
||||
static_cast<int>(Block::Stone))));
|
||||
CHECK(board.addObjective(statObjective("deaths", StatKind::Deaths)));
|
||||
|
||||
CHECK_EQ(board.score("mined", "foksiu"), 0);
|
||||
CHECK(!board.tracked("mined", "foksiu"));
|
||||
|
||||
board.stats("foksiu").addBlockBroken(Block::Stone, 12);
|
||||
CHECK(board.tracked("mined", "foksiu"));
|
||||
CHECK_EQ(board.score("mined", "foksiu"), 12);
|
||||
CHECK_EQ(board.score("stone", "foksiu"), 12);
|
||||
|
||||
board.stats("foksiu").addBlockBroken(Block::Dirt, 5);
|
||||
CHECK_EQ(board.score("mined", "foksiu"), 17);
|
||||
CHECK_EQ(board.score("stone", "foksiu"), 12);
|
||||
|
||||
board.stats("foksiu").add(StatKind::Deaths, 1);
|
||||
CHECK_EQ(board.score("deaths", "foksiu"), 1);
|
||||
CHECK_EQ(board.score("mined", "foksiu"), 17);
|
||||
|
||||
// An automatic objective refuses to be written by hand.
|
||||
CHECK(!board.setScore("mined", "foksiu", 999));
|
||||
CHECK(!board.addScore("mined", "foksiu", 1));
|
||||
CHECK_EQ(board.score("mined", "foksiu"), 17);
|
||||
|
||||
CHECK(!board.addObjective(statObjective("mined", StatKind::Deaths)));
|
||||
CHECK_EQ(board.objectiveNames().size(), static_cast<std::size_t>(3));
|
||||
CHECK(board.objective("mined")->automatic());
|
||||
CHECK(board.objective("nothing") == nullptr);
|
||||
CHECK_EQ(board.score("nothing", "foksiu"), 0);
|
||||
}
|
||||
|
||||
VF_TEST(manualObjectivesOnlyMoveWhenSomethingSetsThem) {
|
||||
Scoreboard board;
|
||||
CHECK(board.addObjective(manualObjective("bounty")));
|
||||
CHECK(!board.addObjective(manualObjective("")));
|
||||
|
||||
CHECK(!board.tracked("bounty", "foksiu"));
|
||||
CHECK(board.setScore("bounty", "foksiu", 10));
|
||||
CHECK(board.tracked("bounty", "foksiu"));
|
||||
CHECK_EQ(board.score("bounty", "foksiu"), 10);
|
||||
CHECK(board.addScore("bounty", "foksiu", -4));
|
||||
CHECK_EQ(board.score("bounty", "foksiu"), 6);
|
||||
CHECK(board.addScore("bounty", "newcomer", 3));
|
||||
CHECK_EQ(board.score("bounty", "newcomer"), 3);
|
||||
|
||||
CHECK(!board.setScore("absent", "foksiu", 1));
|
||||
CHECK(board.resetScore("bounty", "foksiu"));
|
||||
CHECK(!board.resetScore("bounty", "foksiu"));
|
||||
CHECK(!board.tracked("bounty", "foksiu"));
|
||||
CHECK_EQ(board.score("bounty", "foksiu"), 0);
|
||||
|
||||
board.stats("newcomer").add(StatKind::Deaths, 2);
|
||||
board.resetPlayer("newcomer");
|
||||
CHECK(!board.tracked("bounty", "newcomer"));
|
||||
CHECK(board.statsFor("newcomer") == nullptr);
|
||||
|
||||
Reference in new issue
Block a user