#ifdef TESTS_BUILD #include #include "../../../extern/catch.hpp" #include "../../../src/Battling/ScriptHandling/ScriptAggregator.hpp" using namespace CreatureLib; using namespace CreatureLib::Battling; class TestScript : public Script { private: ConstString _name; public: explicit TestScript(std::string name) : _name(std::move(name)){}; const ConstString& GetName() const noexcept override { return _name; } void TestMethod(int& runCount) { runCount++; } }; TEST_CASE("Script Aggregator properly iterates containing script.", "[Battling, Scripting]") { Script* script = new TestScript("test"); auto ran = 0; auto vec = Arbutils::Collections::List{&script}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { auto next = aggr.GetNext(); REQUIRE(next != nullptr); dynamic_cast(next)->TestMethod(ran); } CHECK(ran == 1); delete script; } TEST_CASE("Script Aggregator properly iterates multiple scripts.", "[Battling, Scripting]") { Script* script = new TestScript("test"); Script* script2 = new TestScript("test2"); Script* script3 = new TestScript("test3"); auto ran = 0; auto vec = Arbutils::Collections::List{&script, &script2, &script3}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { auto next = aggr.GetNext(); REQUIRE(next != nullptr); dynamic_cast(next)->TestMethod(ran); } CHECK(ran == 3); delete script; delete script2; delete script3; } TEST_CASE("Script Aggregator properly iterates Script Set.", "[Battling, Scripting]") { Script* script = new TestScript("test"); Script* script2 = new TestScript("test2"); Script* script3 = new TestScript("test3"); auto ran = 0; auto set = ScriptSet(); set.Add(script); set.Add(script2); set.Add(script3); auto vec = Arbutils::Collections::List{&set}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { auto next = aggr.GetNext(); REQUIRE(next != nullptr); dynamic_cast(next)->TestMethod(ran); } CHECK(ran == 3); } TEST_CASE("Script Aggregator properly iterates data of Script Set and Script.", "[Battling, Scripting]") { Script* script = new TestScript("test"); Script* script2 = new TestScript("test2"); Script* script3 = new TestScript("test3"); auto ran = 0; auto set = ScriptSet(); set.Add(script2); set.Add(script3); auto vec = Arbutils::Collections::List{&set, &script}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { auto next = aggr.GetNext(); REQUIRE(next != nullptr); dynamic_cast(next)->TestMethod(ran); } CHECK(ran == 3); delete script; } TEST_CASE("Script Aggregator properly iterates data of Script and Script Set.", "[Battling, Scripting]") { Script* script = new TestScript("test"); Script* script2 = new TestScript("test2"); Script* script3 = new TestScript("test3"); auto ran = 0; auto set = ScriptSet(); set.Add(script2); set.Add(script3); auto vec = Arbutils::Collections::List{&script, &set}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { auto next = aggr.GetNext(); REQUIRE(next != nullptr); dynamic_cast(next)->TestMethod(ran); } CHECK(ran == 3); delete script; } TEST_CASE("Script Aggregator properly iterates data of Script, Script Set and Script.", "[Battling, Scripting]") { Script* script = new TestScript("test"); Script* script2 = new TestScript("test2"); Script* script3 = new TestScript("test3"); Script* script4 = new TestScript("test4"); auto ran = 0; auto set = ScriptSet(); set.Add(script2); set.Add(script3); auto vec = Arbutils::Collections::List{&script, &set, &script4}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { auto next = aggr.GetNext(); REQUIRE(next != nullptr); dynamic_cast(next)->TestMethod(ran); } CHECK(ran == 4); delete script; delete script4; } TEST_CASE("Script Aggregator properly iterates when empty.", "[Battling, Scripting]") { auto ran = 0; auto vec = Arbutils::Collections::List{}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { throw CreatureException("Aggregator returned a script, but should have been empty."); } CHECK(ran == 0); } TEST_CASE("Script Aggregator properly iterates empty Script Set.", "[Battling, Scripting]") { auto ran = 0; auto set = ScriptSet(); auto vec = Arbutils::Collections::List{&set}; auto aggr = ScriptAggregator(vec); while (aggr.HasNext()) { auto next = aggr.GetNext(); REQUIRE(next == nullptr); ran++; } CHECK(ran == 1); } #endif