forked from LeenkxTeam/LNXSDK
157 lines
4.4 KiB
Haxe
157 lines
4.4 KiB
Haxe
import cpp.vm.Debugger;
|
|
#if haxe4
|
|
import sys.thread.Thread;
|
|
#else
|
|
import cpp.vm.Thread;
|
|
#end
|
|
|
|
typedef DebuggerContext = { className : String,
|
|
functionName : String,
|
|
fileName : String,
|
|
lineNumber : Int };
|
|
|
|
typedef DebuggerTest = { setup:Void->Void,
|
|
test:DebuggerContext->Bool,
|
|
name:String,
|
|
resume:Int->Void };
|
|
|
|
class TestDebugger
|
|
{
|
|
public static var ok = true;
|
|
public static var finished = false;
|
|
static var jobs:Array<DebuggerTest>;
|
|
static var currentTest:DebuggerContext->Bool;
|
|
static var currentName:String;
|
|
static var currentResume:Void->Void;
|
|
|
|
|
|
public static function setup()
|
|
{
|
|
Debugger.enableCurrentThreadDebugging(false);
|
|
var mainThread = Thread.current();
|
|
Thread.create( function() {
|
|
startDebugger();
|
|
mainThread.sendMessage("setup");
|
|
});
|
|
|
|
var message = Thread.readMessage(true);
|
|
Sys.println("Debugger : " + message);
|
|
Debugger.enableCurrentThreadDebugging(true);
|
|
|
|
}
|
|
|
|
static function handleThreadEvent(threadNumber : Int, event : Int,
|
|
stackFrame : Int,
|
|
className : String,
|
|
functionName : String,
|
|
fileName : String, lineNumber : Int)
|
|
{
|
|
if (event==Debugger.THREAD_STOPPED)
|
|
{
|
|
var ctx = { className:className, functionName:functionName, fileName:fileName, lineNumber:lineNumber };
|
|
|
|
if (!currentTest(ctx))
|
|
{
|
|
ok = false;
|
|
Sys.println('Test failed : $currentName - got $ctx');
|
|
Sys.exit(-1);
|
|
}
|
|
else
|
|
{
|
|
nextTest(threadNumber);
|
|
}
|
|
}
|
|
}
|
|
|
|
static function cont(id:Int)
|
|
{
|
|
Debugger.continueThreads(-1,1);
|
|
}
|
|
|
|
static function step(id:Int)
|
|
{
|
|
Debugger.stepThread(id,Debugger.STEP_INTO,1);
|
|
}
|
|
|
|
|
|
static function stepOver(id:Int)
|
|
{
|
|
Debugger.stepThread(id,Debugger.STEP_OVER,1);
|
|
}
|
|
|
|
|
|
static function stepOut(id:Int)
|
|
{
|
|
Debugger.stepThread(id,Debugger.STEP_OUT,1);
|
|
}
|
|
|
|
static function nextTest(threadId:Int)
|
|
{
|
|
var test = jobs.shift();
|
|
if (test==null)
|
|
{
|
|
finished = true;
|
|
currentName = null;
|
|
currentTest = null;
|
|
currentResume = null;
|
|
Debugger.setEventNotificationHandler(null);
|
|
cont(-1);
|
|
}
|
|
else
|
|
{
|
|
currentName = test.name;
|
|
currentTest = test.test;
|
|
test.setup();
|
|
Sys.println(' $currentName...');
|
|
test.resume(threadId);
|
|
}
|
|
}
|
|
|
|
|
|
static function startDebugger()
|
|
{
|
|
Debugger.setEventNotificationHandler(handleThreadEvent);
|
|
jobs = [
|
|
{ setup:function() Debugger.addClassFunctionBreakpoint("App","breakMe"),
|
|
test:function(ctx) return !App.hasRunBreakMe,
|
|
name:"Set function breakpoint App.breakMe",
|
|
resume:cont },
|
|
{ setup:function() Debugger.addClassFunctionBreakpoint("App","breakMe2"),
|
|
test:function(ctx) return App.hasRunBreakMe && !App.hasRunBreakMe2,
|
|
name:"Set function breakpoint App.breakMe2",
|
|
resume:cont},
|
|
{ setup:function() Debugger.addFileLineBreakpoint("Lines.hx",7),
|
|
test:function(ctx) return Lines.line==-1,
|
|
name:"Set line breakpoint Lines.hx:7",
|
|
resume:cont},
|
|
{ setup:function() { },
|
|
test:function(ctx) return Lines.line==7,
|
|
name:"Step from Lines.hx:7",
|
|
resume:step},
|
|
{ setup:function() { },
|
|
test:function(ctx) return Lines.line==18,
|
|
name:"Step over callFunction",
|
|
resume:stepOver},
|
|
{ setup:function() { },
|
|
test:function(ctx) return Lines.line==9,
|
|
name:"Step over line 9",
|
|
resume:step},
|
|
{ setup:function() { },
|
|
test:function(ctx) return Lines.line==9,
|
|
name:"step into callFunction",
|
|
resume:step},
|
|
{ setup:function() { },
|
|
test:function(ctx) return Lines.line==18,
|
|
name:"step out of callFunction",
|
|
resume:stepOut },
|
|
{ setup:function() { },
|
|
test:function(ctx) return Lines.line==12,
|
|
name:"step out of Lines",
|
|
resume:stepOut },
|
|
|
|
|
|
];
|
|
nextTest(-1);
|
|
}
|
|
}
|