From 7043b12f34c43049559c9265850cf264899e3ad1 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 23 Oct 2021 14:28:53 +0200 Subject: [PATCH] Adds support for debugger. --- CMakeLists.txt | 5 +++-- src/Tester/AngelScript/BattleFunctions.hpp | 8 ++++---- src/Tester/AngelScript/MiscMockFunctions.hpp | 6 +++--- src/Tester/AngelScript/TestFunctions.hpp | 6 +++--- src/Tester/Test.hpp | 12 +++++++++-- src/Tester/TestRunner.hpp | 21 +++++++++++++++++--- src/main.cpp | 4 ++-- 7 files changed, 43 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c61770e..c4a106a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") endif () -file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp) +file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp extern/AngelscriptDebugger/src/*.cpp) add_executable(PokemonScriptTester ${SRC_FILES}) target_precompile_headers(PokemonScriptTester PUBLIC src/Precompiled.hxx) add_definitions(-DLEVEL_U8) @@ -43,4 +43,5 @@ endif (WINDOWS) set(PRE_CONFIGURE_FILE "git.h.in") set(POST_CONFIGURE_FILE "src/git.h") include(git_watcher.cmake) -add_dependencies(PokemonScriptTester check_git) \ No newline at end of file +add_dependencies(PokemonScriptTester check_git) +target_include_directories(PokemonScriptTester PRIVATE extern/AngelscriptDebugger/extern/asio-1.18.2/include) diff --git a/src/Tester/AngelScript/BattleFunctions.hpp b/src/Tester/AngelScript/BattleFunctions.hpp index 75c4570..319f374 100644 --- a/src/Tester/AngelScript/BattleFunctions.hpp +++ b/src/Tester/AngelScript/BattleFunctions.hpp @@ -12,7 +12,7 @@ class BattleFunctions { static CreatureLib::Battling::CreatureParty* CreateSimpleParty(CScriptArray* species, u8 level) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); auto lib = Globals::Library.GetValue(); auto p1 = new PkmnLib::Battling::PokemonParty(species->GetSize()); @@ -34,7 +34,7 @@ class BattleFunctions { static PkmnLib::Battling::Battle* CreateSimpleBattle(u32 seed, const ArbUt::StringView& species1, const ArbUt::StringView& species2, u8 level) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); auto lib = Globals::Library.GetValue(); auto mon1 = PkmnLib::Battling::CreatePokemon(lib, species1, level) @@ -79,7 +79,7 @@ class BattleFunctions { static PkmnLib::Battling::Battle* CreateSimpleBattleFromParties(u32 seed, PkmnLib::Battling::PokemonParty* p1, PkmnLib::Battling::PokemonParty* p2) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); auto lib = Globals::Library.GetValue(); auto battle = new PkmnLib::Battling::Battle( @@ -109,7 +109,7 @@ class BattleFunctions { return false; } auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); auto learnedMove = new PkmnLib::Battling::LearnedMove(move.value(), CreatureLib::Battling::AttackLearnMethod::Unknown); diff --git a/src/Tester/AngelScript/MiscMockFunctions.hpp b/src/Tester/AngelScript/MiscMockFunctions.hpp index aa85d73..e0a71c0 100644 --- a/src/Tester/AngelScript/MiscMockFunctions.hpp +++ b/src/Tester/AngelScript/MiscMockFunctions.hpp @@ -8,7 +8,7 @@ class MiscMockFunctions { auto script = Globals::Library.GetValue()->GetScriptResolver()->LoadScript(ScriptCategory::Attack, name); if (script != nullptr) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); env->AddGarbage(script); } auto p = dynamic_cast(script); @@ -21,7 +21,7 @@ class MiscMockFunctions { PkmnLib::Battling::Pokemon* user, PkmnLib::Battling::Pokemon* target) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); auto move = Globals::Library.GetValue()->GetMoveLibrary()->TryGet(moveName); if (!move.has_value()) { @@ -41,7 +41,7 @@ class MiscMockFunctions { PkmnLib::Battling::Pokemon* user, u8 targetSide, u8 target) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); auto move = Globals::Library.GetValue()->GetMoveLibrary()->TryGet(moveName); if (!move.has_value()) { diff --git a/src/Tester/AngelScript/TestFunctions.hpp b/src/Tester/AngelScript/TestFunctions.hpp index a19d16d..fceb629 100644 --- a/src/Tester/AngelScript/TestFunctions.hpp +++ b/src/Tester/AngelScript/TestFunctions.hpp @@ -23,7 +23,7 @@ private: static bool Require(bool value) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); env->TotalRequirements += 1; if (!value) { env->FailedRequirements += 1; @@ -43,7 +43,7 @@ private: static bool RequireEqualsI32(i32 expected, i32 actual) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); env->TotalRequirements += 1; if (expected != actual) { env->FailedRequirements += 1; @@ -56,7 +56,7 @@ private: static bool RequireEqualsString(const std::string& expected, const std::string& actual) { auto* ctx = asGetActiveContext(); - TestEnvironment* env = static_cast(ctx->GetUserData()); + TestEnvironment* env = static_cast(ctx->GetUserData(684)); if (expected != actual) { env->FailedRequirements += 1; auto data = GetRequirementData(ctx); diff --git a/src/Tester/Test.hpp b/src/Tester/Test.hpp index a7e0cdb..b3e98a4 100644 --- a/src/Tester/Test.hpp +++ b/src/Tester/Test.hpp @@ -13,8 +13,17 @@ public: void Run(asIScriptContext* ctx) { ctx->PushState(); ctx->Prepare(_function); - ctx->SetUserData(_env.get()); + ctx->SetUserData(_env.get(), 684); auto e = ctx->Execute(); + if (e == asEXECUTION_SUSPENDED) { + auto s = ctx->GetState(); + while (s != asEXECUTION_FINISHED && s != asEXECUTION_EXCEPTION && s != asEXECUTION_ABORTED && + s != asEXECUTION_ERROR) { + s = ctx->GetState(); + continue; + } + } + _env->CollectGarbage(); if (e == asEXECUTION_EXCEPTION) { _errorMessage = ctx->GetExceptionString(); @@ -23,7 +32,6 @@ public: return; } ctx->PopState(); - Ensure(e == asEXECUTION_FINISHED); _result = TestResult::Success; } diff --git a/src/Tester/TestRunner.hpp b/src/Tester/TestRunner.hpp index fafc16c..e9d77e1 100644 --- a/src/Tester/TestRunner.hpp +++ b/src/Tester/TestRunner.hpp @@ -2,14 +2,17 @@ #define POKEMONSCRIPTTESTER_TESTRUNNER_HPP #include +#include +#include "../../extern/AngelscriptDebugger/src/AngelscriptDebugger.hpp" #include "../../extern/termcolor.hpp" #include "Test.hpp" class TestRunner { + AngelScriptResolver* _scriptResolver; ArbUt::Dictionary> _tests; public: - TestRunner(AngelScriptResolver* scriptResolver) { + TestRunner(AngelScriptResolver* scriptResolver) : _scriptResolver(scriptResolver) { const auto* module = scriptResolver->GetMainModule(); auto builder = scriptResolver->GetBuilder(); for (u32 i = 0; i < module->GetFunctionCount(); ++i) { @@ -30,8 +33,20 @@ public: } } - i32 RunAll(asIScriptEngine* engine) { - auto ctx = engine->CreateContext(); + i32 RunAll(bool waitForDebugger) { + auto ctx = _scriptResolver->GetContextPool()->RequestContext(); + ctx->SetUserData(_scriptResolver->GetUserdata()); + auto debugger = AngelscriptDebugger(); + debugger.Run(8684); + debugger.RegisterContext(ctx); + if (waitForDebugger) { + std::cout << "Waiting for debugger" << std::endl; + while (!debugger.HasDebuggerAttached()) { + continue; + } + sleep(1); + } + for (auto& test : _tests) { test.second->Run(ctx); } diff --git a/src/main.cpp b/src/main.cpp index f2888e3..b214869 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,6 +23,7 @@ int main(int argc, char** argv) { {"workdir"}); args::Flag logTimeFlag(parser, "time-log", "Whether to show time logging.", {'t', "time-log"}); args::Flag forceColorFlag(parser, "force-color", "Whether to force color text output.", {'c', "force-color"}); + args::Flag waitForDebuggerFlag(parser, "wait-for-debugger", "Whether to wait until a debugger is connected or not.", {'w', "wait-for-debugger"}); try { parser.ParseCLI(argc, argv); } catch (args::Help&) { @@ -71,9 +72,8 @@ int main(int argc, char** argv) { } auto* scriptResolver = dynamic_cast(Globals::Library.GetValue()->GetScriptResolver().get()); auto testRunner = TestRunner(scriptResolver); - auto* engine = scriptResolver->GetBuilder().GetEngine(); std::chrono::steady_clock::time_point beginTests = std::chrono::steady_clock::now(); - auto v = testRunner.RunAll(engine); + auto v = testRunner.RunAll(waitForDebuggerFlag.Get()); std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now(); std::cout << std::endl << "Total Run time: " << std::chrono::duration_cast(end - begin).count()