CreatureLib/tests/BattleTests/ScriptTests/ScriptAggregatorTests.cpp

201 lines
7.4 KiB
C++
Raw Normal View History

2019-11-10 18:55:01 +00:00
#ifdef TESTS_BUILD
2022-02-05 12:59:15 +00:00
#include <doctest.h>
2019-11-10 18:55:01 +00:00
#include "../../../src/Battling/ScriptHandling/ScriptAggregator.hpp"
using namespace CreatureLib;
using namespace CreatureLib::Battling;
class TestScript : public BattleScript {
private:
2020-06-26 15:08:23 +00:00
ArbUt::StringView _name;
2019-11-10 18:55:01 +00:00
public:
explicit TestScript(const ArbUt::StringView& name) : BattleScript(nullptr), _name(name){};
2019-11-10 18:55:01 +00:00
const ArbUt::StringView& GetName() const noexcept override { return _name; }
void TestMethod(int& runCount) { runCount++; }
BattleScript* Clone(const ArbUt::OptionalBorrowedPtr<void>&) override { return new TestScript(_name); }
2019-11-10 18:55:01 +00:00
};
TEST_CASE("Script Aggregator properly iterates containing script.") {
auto script = std::make_unique<TestScript>("test");
2019-11-10 18:55:01 +00:00
auto ran = 0;
auto vec = ArbUt::List<ScriptWrapper>{
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script))};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
2019-11-10 18:55:01 +00:00
}
CHECK(ran == 1);
2019-11-10 18:55:01 +00:00
}
TEST_CASE("Script Aggregator properly iterates multiple scripts.") {
auto script = std::make_unique<TestScript>("test");
auto script2 = std::make_unique<TestScript>("test2");
auto script3 = std::make_unique<TestScript>("test3");
2019-11-10 18:55:01 +00:00
auto ran = 0;
auto vec = ArbUt::List<ScriptWrapper>{
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script)),
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script2)),
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script3))};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
2019-11-10 18:55:01 +00:00
}
CHECK(ran == 3);
2019-11-10 18:55:01 +00:00
}
TEST_CASE("Script Aggregator properly iterates Script Set.") {
BattleScript* script = new TestScript("test");
BattleScript* script2 = new TestScript("test2");
BattleScript* script3 = new TestScript("test3");
2019-11-10 18:55:01 +00:00
auto ran = 0;
auto set = ScriptSet();
set.Add(script);
set.Add(script2);
set.Add(script3);
2020-05-26 16:31:06 +00:00
auto vec = ArbUt::List<ScriptWrapper>{ScriptWrapper::FromSet(&set)};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
2019-11-10 18:55:01 +00:00
}
CHECK(ran == 3);
2019-11-10 18:55:01 +00:00
}
TEST_CASE("Script Aggregator properly iterates Script Set when removing from it.") {
BattleScript* script = new TestScript("test");
BattleScript* script2 = new TestScript("test2");
BattleScript* script3 = new TestScript("test3");
auto ran = 0;
auto set = ScriptSet();
set.Add(script);
set.Add(script2);
set.Add(script3);
auto vec = ArbUt::List<ScriptWrapper>{ScriptWrapper::FromSet(&set)};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (ran <= 2) {
aggr.GetNext(next);
next.As<TestScript>()->TestMethod(ran);
}
set.Remove("test3"_cnc);
REQUIRE_FALSE(aggr.GetNext(next));
}
TEST_CASE("Script Aggregator properly iterates data of Script Set and Script.") {
auto script = std::make_unique<TestScript>("test");
BattleScript* script2 = new TestScript("test2");
BattleScript* script3 = new TestScript("test3");
2019-11-10 18:55:01 +00:00
auto ran = 0;
auto set = ScriptSet();
set.Add(script2);
set.Add(script3);
auto vec = ArbUt::List<ScriptWrapper>{
ScriptWrapper::FromSet(&set),
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script))};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
2019-11-10 18:55:01 +00:00
}
CHECK(ran == 3);
2019-11-10 18:55:01 +00:00
}
TEST_CASE("Script Aggregator properly iterates data of Script and Script Set.") {
auto script = std::make_unique<TestScript>("test");
BattleScript* script2 = new TestScript("test2");
BattleScript* script3 = new TestScript("test3");
2019-11-10 18:55:01 +00:00
auto ran = 0;
auto set = ScriptSet();
set.Add(script2);
set.Add(script3);
auto vec = ArbUt::List<ScriptWrapper>{
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script)),
ScriptWrapper::FromSet(&set)};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
2019-11-10 18:55:01 +00:00
}
CHECK(ran == 3);
2019-11-10 18:55:01 +00:00
}
TEST_CASE("Script Aggregator properly iterates data of Script, Script Set and Script.") {
auto script = std::make_unique<TestScript>("test");
BattleScript* script2 = new TestScript("test2");
BattleScript* script3 = new TestScript("test3");
auto script4 = std::make_unique<TestScript>("test4");
2019-11-10 18:55:01 +00:00
auto ran = 0;
auto set = ScriptSet();
set.Add(script2);
set.Add(script3);
auto vec = ArbUt::List<ScriptWrapper>{
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script)),
ScriptWrapper::FromSet(&set),
ScriptWrapper::FromScript(reinterpret_cast<ArbUt::OptionalUniquePtr<BattleScript>*>(&script4))};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
2019-11-10 18:55:01 +00:00
}
CHECK(ran == 4);
2019-11-10 18:55:01 +00:00
}
TEST_CASE("Script Aggregator properly iterates multiple script sets.") {
BattleScript* script1 = new TestScript("test");
BattleScript* script2 = new TestScript("test2");
BattleScript* script3 = new TestScript("test3");
auto set1 = ScriptSet();
set1.Add(script2);
set1.Add(script3);
auto set2 = ScriptSet();
set2.Add(script1);
auto vec = ArbUt::List<ScriptWrapper>{
ScriptWrapper::FromSet(&set1),
ScriptWrapper::FromSet(&set2),
};
auto aggr = ScriptAggregator(vec);
auto ran = 0;
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
}
CHECK(ran == 3);
aggr.Reset();
ran = 0;
while (aggr.GetNext(next)) {
next.As<TestScript>()->TestMethod(ran);
}
CHECK(ran == 3);
}
TEST_CASE("Script Aggregator properly iterates when empty.") {
2019-11-10 18:55:01 +00:00
auto ran = 0;
2020-05-26 16:31:06 +00:00
auto vec = ArbUt::List<ScriptWrapper>{};
auto aggr = ScriptAggregator(vec);
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
REQUIRE_FALSE(aggr.GetNext(next));
CHECK(ran == 0);
2019-11-10 18:55:01 +00:00
}
TEST_CASE("Script Aggregator properly iterates empty Script Set.") {
2019-11-10 18:55:01 +00:00
auto ran = 0;
auto set = ScriptSet();
2020-05-26 16:31:06 +00:00
auto vec = ArbUt::List<ScriptWrapper>{ScriptWrapper::FromSet(&set)};
auto aggr = ScriptAggregator(vec);
aggr.Reset();
ArbUt::BorrowedPtr<CreatureLib::Battling::BattleScript> next = (CreatureLib::Battling::BattleScript*)1;
while (aggr.GetNext(next)) {
2019-11-10 18:55:01 +00:00
ran++;
}
CHECK(ran == 0);
2019-11-10 18:55:01 +00:00
}
#endif