require 'test/unit'
require 'fast/FastDebugger'
require 'ruby-debug-base'

module XoredDebugger    
    class FastDebuggerTest < Test::Unit::TestCase
        include DebugEventHandler         

        def test_catch
            @break_called = false
            @line_called = false
            @catch_called = false
            debugger = FastDebugger.new            
            debugger.handler = self
            debugger.start
            bp_manager = debugger.breakpoint_manager
            bp_manager.add_exception_breakpoint('RuntimeError', true)
            begin
                raise RuntimeError, 'Shoud be catched'
            rescue RuntimeError
            end
            debugger.terminate
            assert(!@break_called)
            assert(@line_called)
            assert(@catch_called)
        end   
        
        def test_not_catch
            @break_called = false
            @line_called = false
            @catch_called = false
            debugger = FastDebugger.new            
            debugger.handler = self
            debugger.start
            bp_manager = debugger.breakpoint_manager
            bp_manager.add_exception_breakpoint('ScriptError', true)
            begin
                raise RuntimeError, 'Shoud not be catched'
            rescue RuntimeError
            end
            debugger.terminate
            assert(!@break_called)
            assert(!@line_called)
            assert(!@catch_called)
        end  
                
        def test_line
            @break_called = false
            @line_called = false
            @catch_called = false
            debugger = FastDebugger.new            
            debugger.handler = self
            debugger.start
            bp_manager = debugger.breakpoint_manager
            bp_manager.add_line_breakpoint(__FILE__, __LINE__ + 1, true)
            a = 0 # At this line breakpoint handler will be called
            debugger.terminate
            assert(@break_called)
            assert(@line_called)
            assert(!@catch_called)
        end  
        
                
        def at_breakpoint(context)
            @break_called = true
        end
 
        def at_catchpoint(context, excpt)
            @catch_called = true
        end
 
        def at_line(context, file, line)
            @line_called = true
        end        	    	                 
    end
end
