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