def test_next_is_step_if_not_a_call(self): space = ObjSpace() interp = MockInterpreter(space) interp.setup_debugger(self.read_fd1, self.write_fd2) c = Connection(self.read_fd2, self.write_fd1) c.write(Message("next", None)) ok(c) ok(c) c.write(Message("next", None)) ok(c) ok(c) c.write(Message("continue", None)) ok(c) interp.debugger.run_debugger_loop(interp) interp.echo = interp.print_expr # <= hack self.run(interp, """ echo 'fff'; $a = 5; """) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter <main>"]) assert c.read() == Message("linechange", ["<input>", "2", "<main>", "echo 'fff';"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['string(3) "fff"']) assert c.read() == Message("linechange", ["<input>", "3", "<main>", "$a = 5;"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['Continuing']) assert not c.more_pending_messages() assert not interp.debugger.conn.more_pending_messages() assert not interp.msgs interp.shutdown()
def test_next_skips_all_nested_calls(self): space = ObjSpace() interp = MockInterpreter(space) interp.setup_debugger(self.read_fd1, self.write_fd2) c = Connection(self.read_fd2, self.write_fd1) c.write(Message("next", None)); ok(c); ok(c) c.write(Message("next", None)); ok(c) c.write(Message("continue", None)); ok(c) interp.debugger.run_debugger_loop(interp) interp.echo = interp.print_expr # <= hack self.run(interp, """ function F() { return G(); } function G() { return 42; } $a = F(); $a++; """) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter <main>"]) assert c.read() == Message("linechange", ["<input>", "8", "<main>", "$a = F();"]) assert c.read() == Message(">", None) assert c.read() == Message("linechange", ["<input>", "9", "<main>", "$a++;"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['Continuing']) assert not c.more_pending_messages() assert not interp.debugger.conn.more_pending_messages() assert not interp.msgs interp.shutdown()
def test_next_passes_over_calls_on_the_same_line(self): space = ObjSpace() interp = MockInterpreter(space) interp.setup_debugger(self.read_fd1, self.write_fd2) c = Connection(self.read_fd2, self.write_fd1) c.write(Message("next", None)); ok(c); ok(c) c.write(Message("next", None)); ok(c); ok(c); ok(c) c.write(Message("continue", None)); ok(c) interp.debugger.run_debugger_loop(interp) interp.echo = interp.print_expr # <= hack self.run(interp, """ function F() { echo 'fff'; } F(); F(); $a = 5; """) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter <main>"]) assert c.read() == Message("linechange", ["<input>", "5", "<main>", "F(); F();"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['string(3) "fff"']) assert c.read() == Message("echo", ['string(3) "fff"']) assert c.read() == Message("linechange", ["<input>", "6", "<main>", "$a = 5;"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['Continuing']) assert not c.more_pending_messages() assert not interp.debugger.conn.more_pending_messages() assert not interp.msgs interp.shutdown()
def test_step_precise_position(self): space = ObjSpace() interp = MockInterpreter(space) interp.setup_debugger(self.read_fd1, self.write_fd2) c = Connection(self.read_fd2, self.write_fd1) c.write(Message("step", None)); ok(c); ok(c) c.write(Message("step", None)); ok(c) c.write(Message("step", None)); ok(c); ok(c) c.write(Message("continue", None)); ok(c); ok(c) interp.debugger.run_debugger_loop(interp) interp.echo = interp.print_expr # <= hack self.run(interp, """ $a = 5; echo 'foobar'; echo 'baz'; """) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter <main>"]) assert c.read() == Message("linechange", ["<input>", "2", "<main>", "$a = 5;"]) assert c.read() == Message(">", None) assert c.read() == Message("linechange", ["<input>", "3", "<main>", "echo 'foobar';"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['string(6) "foobar"']) assert c.read() == Message("linechange", ["<input>", "4", "<main>", "echo 'baz';"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['Continuing']) assert c.read() == Message("echo", ['string(3) "baz"']) assert not c.more_pending_messages() assert not interp.debugger.conn.more_pending_messages() assert not interp.msgs interp.shutdown()
def test_step_enter_leave(self): space = ObjSpace() interp = MockInterpreter(space) interp.setup_debugger(self.read_fd1, self.write_fd2) c = Connection(self.read_fd2, self.write_fd1) c.write(Message("step", None)); ok(c); ok(c) c.write(Message("step", None)); ok(c) c.write(Message("step", None)); ok(c); ok(c) c.write(Message("backtrace", None)); ok(c) c.write(Message("step", None)); ok(c); ok(c); ok(c); ok(c) c.write(Message("step", None)); ok(c); ok(c); ok(c) c.write(Message("step", None)); ok(c); ok(c) c.write(Message("continue", None)); ok(c); ok(c) interp.debugger.run_debugger_loop(interp) interp.echo = interp.print_expr # <= hack self.run(interp, """ function F() { echo 'fff'; } F(); F(); F(); """) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter <main>"]) assert c.read() == Message("linechange", ["<input>", "2", "<main>", "function F() {"]) assert c.read() == Message(">", None) assert c.read() == Message("linechange", ["<input>", "5", "<main>", "F(); F();"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter F"]) assert c.read() == Message("linechange", ["<input>", "3", "F", " echo 'fff';"]) assert c.read() == Message(">", None) exp_traceback = ["<input>", "F", "3", " echo 'fff';", "<input>", "<main>", "5", "F(); F();"] assert c.read() == Message("traceback", exp_traceback) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['string(3) "fff"']) assert c.read() == Message("echo", ["leave F"]) assert c.read() == Message("echo", ["enter F"]) assert c.read() == Message("linechange", ["<input>", "3", "F", " echo 'fff';"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['string(3) "fff"']) assert c.read() == Message("echo", ["leave F"]) assert c.read() == Message("linechange", ["<input>", "6", "<main>", "F();"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter F"]) assert c.read() == Message("linechange", ["<input>", "3", "F", " echo 'fff';"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['Continuing']) assert c.read() == Message("echo", ['string(3) "fff"']) assert not c.more_pending_messages() assert not interp.debugger.conn.more_pending_messages() assert not interp.msgs interp.shutdown()
def test_next_skips_all_nested_calls(self): space = ObjSpace() interp = MockInterpreter(space) interp.setup_debugger(self.read_fd1, self.write_fd2) c = Connection(self.read_fd2, self.write_fd1) c.write(Message("next", None)); ok(c); ok(c) c.write(Message("next", None)); ok(c) c.write(Message("next", None)); ok(c) c.write(Message("next", None)); ok(c) c.write(Message("continue", None)); ok(c) interp.debugger.run_debugger_loop(interp) interp.echo = interp.print_expr # <= hack self.run(interp, """ function F() { return G(); } function G() { return 42; } $a = F(); $a++; """) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter <main>"]) assert c.read() == Message("linechange", ["<input>", "2", "<main>", "function F() {"]) assert c.read() == Message(">", None) assert c.read() == Message("linechange", ["<input>", "5", "<main>", "function G() {"]) assert c.read() == Message(">", None) assert c.read() == Message("linechange", ["<input>", "8", "<main>", "$a = F();"]) assert c.read() == Message(">", None) assert c.read() == Message("linechange", ["<input>", "9", "<main>", "$a++;"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['Continuing']) assert not c.more_pending_messages() assert not interp.debugger.conn.more_pending_messages() assert not interp.msgs interp.shutdown()
def test_next_passes_over_calls_on_the_same_line(self): space = ObjSpace() interp = MockInterpreter(space) interp.setup_debugger(self.read_fd1, self.write_fd2) c = Connection(self.read_fd2, self.write_fd1) c.write(Message("next", None)); ok(c); ok(c) c.write(Message("next", None)); ok(c) c.write(Message("next", None)); ok(c); ok(c); ok(c) c.write(Message("continue", None)); ok(c) interp.debugger.run_debugger_loop(interp) interp.echo = interp.print_expr # <= hack self.run(interp, """ function F() { echo 'fff'; } F(); F(); $a = 5; """) assert c.read() == Message(">", None) assert c.read() == Message("echo", ["enter <main>"]) assert c.read() == Message("linechange", ["<input>", "2", "<main>", "function F() {"]) assert c.read() == Message(">", None) assert c.read() == Message("linechange", ["<input>", "5", "<main>", "F(); F();"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['string(3) "fff"']) assert c.read() == Message("echo", ['string(3) "fff"']) assert c.read() == Message("linechange", ["<input>", "6", "<main>", "$a = 5;"]) assert c.read() == Message(">", None) assert c.read() == Message("echo", ['Continuing']) assert not c.more_pending_messages() assert not interp.debugger.conn.more_pending_messages() assert not interp.msgs interp.shutdown()