AngelscriptDebuggerServer/TestRunner/Runner.cpp

96 lines
3.1 KiB
C++

#include <angelscript.h>
#include "../src/AngelscriptDebugger.hpp"
#include "angelscript_addons/scriptarray/scriptarray.h"
#include "angelscript_addons/scriptbuilder/scriptbuilder.h"
#include "angelscript_addons/scripthelper/scripthelper.h"
#include "angelscript_addons/scriptstdstring/scriptstdstring.h"
#include <chrono>
#include <thread>
static void print(const std::string& s) { std::cout << s << std::endl; }
void MessageCallback(const asSMessageInfo* msg, void* param) {
const char* type = "ERR ";
if (msg->type == asMSGTYPE_WARNING)
type = "WARN";
else if (msg->type == asMSGTYPE_INFORMATION)
type = "INFO";
printf("%s (%d, %d) : %s : %s\n", msg->section, msg->row, msg->col, type, msg->message);
}
int main() {
AngelscriptDebugger debugger;
debugger.Run(8684);
std::cout << "Waiting for debugger to attach." << std::endl;
while (!debugger.HasDebuggerAttached()) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
std::cout << "Debugger attached." << std::endl;
asIScriptEngine* engine = asCreateScriptEngine();
engine->SetMessageCallback(asFUNCTION(MessageCallback), 0, asCALL_CDECL);
RegisterStdString(engine);
RegisterScriptArray(engine, true);
RegisterExceptionRoutines(engine);
assert(engine->RegisterGlobalFunction("void print(const string &in)", asFUNCTION(print), asCALL_CDECL) >= 0);
CScriptBuilder builder;
assert(builder.StartNewModule(engine, "TestModule") >= 0);
assert(builder.AddSectionFromMemory("TestScript", R"(
class TestClass {
int TestField = 45435;
TestClass@ RecursiveField;
TestClass(){
@RecursiveField = this;
}
void main(int a, int b, string d){
int c = a + b;
int[] arr = {20, 40, 80, 160};
print(formatInt(c));
print(d);
throw("Error message");
}
})") >= 0);
auto buildResult = builder.BuildModule();
if (buildResult < 0) {
std::cout << "Failed building module with error code: " << buildResult << std::endl;
return 1;
}
asIScriptModule* mod = engine->GetModule("TestModule");
asITypeInfo* type = mod->GetTypeInfoByDecl("TestClass");
asIScriptFunction* factory = type->GetFactoryByDecl("TestClass @TestClass()");
asIScriptContext* ctx = engine->CreateContext();
debugger.RegisterContext(ctx);
ctx->Prepare(factory);
ctx->Execute();
asIScriptObject* obj = *(asIScriptObject**)ctx->GetAddressOfReturnValue();
obj->AddRef();
asIScriptFunction* func = type->GetMethodByName("main");
assert(ctx->Prepare(func) == asSUCCESS);
ctx->SetObject(obj);
ctx->SetArgDWord(0, 100);
ctx->SetArgDWord(1, 684);
std::string s = "foobar";
ctx->SetArgObject(2, &s);
ctx->Execute();
while (ctx->GetState() != asEXECUTION_FINISHED && ctx->GetState() != asEXECUTION_EXCEPTION &&
ctx->GetState() != asEXECUTION_ABORTED && ctx->GetState() != asEXECUTION_ERROR) {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
ctx->Release();
obj->Release();
engine->ShutDownAndRelease();
debugger.Stop();
}