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); | ||
|  |    } | ||
|  | } |