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