From f9ce8db77cd092789630f9aa439204fb0589e8cf Mon Sep 17 00:00:00 2001 From: mitchell Date: Tue, 12 Oct 2021 13:52:40 -0400 Subject: Updated debugger tests with watch variables (no break). Also cleaned up code. --- test/test.lua | 120 +++++++++++++++++++++++----------------------------------- 1 file changed, 48 insertions(+), 72 deletions(-) diff --git a/test/test.lua b/test/test.lua index 32bcde32..a45ae8c9 100644 --- a/test/test.lua +++ b/test/test.lua @@ -4213,7 +4213,11 @@ function test_debugger_ansi_c() debugger.use_status_buffers = false debugger.project_commands = {} -- reset require('debugger.gdb').logging = true - local function wait() + -- Runs the given debugger function with arguments and waits for or processes the response. + -- Most debugger functions have a callback that needs to be executed asynchronously or else + -- strange errors will occur. + local function run_and_wait(f, ...) + f(...) os.spawn('sleep 0.2'):wait() ui.update() end @@ -4228,84 +4232,66 @@ function test_debugger_ansi_c() debugger.toggle_breakpoint(nil, 8) assert(buffer:marker_get(8) > 0, 'breakpoint marker not set') textadept.run.compile_commands[filename] = textadept.run.compile_commands.ansi_c .. ' -g' - textadept.run.compile() - wait() + run_and_wait(textadept.run.compile) assert_equal(#_VIEWS, 2) local msg_buf = buffer assert(buffer:get_text():find('status: 0'), 'compile failed') ui.goto_view(-1) - debugger.start(nil, dir .. '/foo') - wait() - debugger.continue() - wait() + run_and_wait(debugger.start, nil, dir .. '/foo') + run_and_wait(debugger.continue) assert_equal(buffer.filename, filename) assert_equal(buffer:line_from_position(buffer.current_pos), 8) assert(buffer:marker_number_from_line(8, 2) > 0, 'current line marker not set') assert(not msg_buf:get_text():find('^start\n'), 'not at breakpoint') - debugger.restart() - wait() + run_and_wait(debugger.restart) assert_equal(buffer.filename, filename) assert_equal(buffer:line_from_position(buffer.current_pos), 8) assert(buffer:marker_number_from_line(8, 2) > 0, 'current line marker not set') assert(not msg_buf:get_text():find('^start\n'), 'not at breakpoint') - debugger.stop() - wait() + run_and_wait(debugger.stop) assert_equal(buffer:marker_number_from_line(8, 2), -1, 'still debugging') - debugger.start(nil, dir .. '/foo') - wait() - debugger.continue() - wait() + run_and_wait(debugger.start, nil, dir .. '/foo') + run_and_wait(debugger.continue) debugger.toggle_breakpoint() -- clear - debugger.step_over() - wait() + run_and_wait(debugger.step_over) assert_equal(buffer:line_from_position(buffer.current_pos), 9) assert(buffer:marker_get(9) > 0, 'current line marker not set') assert_equal(buffer:marker_get(8), 0) -- current line marker cleared -- TODO: gdb does not print program stdout to its stdout until the end when using the mi interface. -- assert(msg_buf:get_text():find('^start\n'), 'process stdout not captured') - debugger.step_over() - wait() + run_and_wait(debugger.step_over) assert_equal(buffer:line_from_position(buffer.current_pos), 10) - debugger.evaluate('i') - wait() + run_and_wait(debugger.evaluate, 'i') assert_equal(buffer.filename, filename) -- still in file being debugged assert(msg_buf:get_text():find('\n0\n'), 'evaluation of i failed') - debugger.step_into() - wait() + run_and_wait(debugger.step_into) assert_equal(buffer:line_from_position(buffer.current_pos), 3) - debugger.set_frame(2) - wait() + run_and_wait(debugger.set_frame, 2) assert_equal(buffer:line_from_position(buffer.current_pos), 10) - debugger.set_frame(1) - wait() + run_and_wait(debugger.set_frame, 1) assert_equal(buffer:line_from_position(buffer.current_pos), 3) buffer:search_anchor() local pos = buffer:search_next(buffer.FIND_MATCHCASE | buffer.FIND_WHOLEWORD, 'i') assert(pos > 0, "'i' not found") - debugger.inspect(pos) - wait() + run_and_wait(debugger.inspect, pos) assert(view:call_tip_active(), 'no call tip active') - debugger.step_out() - wait() + run_and_wait(debugger.step_out) -- assert(msg_buf:get_text():find('\nfoo 0\n'), 'process stdout not captured') assert_equal(buffer:line_from_position(buffer.current_pos), 9) debugger.set_watch('i') - debugger.continue() - wait() + run_and_wait(debugger.continue) assert_equal(buffer:line_from_position(buffer.current_pos), 9) assert(not msg_buf:get_text():find('\nfoo 1\n'), 'watch point failed') debugger.remove_watch(1) - debugger.step_over() - wait() + debugger.set_watch('&i', true) -- no break + run_and_wait(debugger.step_over) events.emit(events.MARGIN_CLICK, 2, buffer.current_pos, 0) -- simulate breakpoint margin click - debugger.continue() - wait() + run_and_wait(debugger.continue) assert_equal(buffer:line_from_position(buffer.current_pos), 10) -- assert(msg_buf:get_text():find('\nfoo 1\n'), 'set breakpoint failed') assert(not msg_buf:get_text():find('\nfoo 2\n'), 'set breakpoint failed') events.emit(events.MARGIN_CLICK, 2, buffer.current_pos, 0) -- simulate breakpoint margin click; clear - debugger.continue() - wait() + run_and_wait(debugger.continue) -- assert(msg_buf:get_text():find('\nfoo 2\n'), 'process stdout not captured') -- assert(msg_buf:get_text():find('\nfoo 3\n'), 'process stdout not captured') -- assert(msg_buf:get_text():find('\nend\n'), 'process stdout not captured') @@ -4326,7 +4312,11 @@ function test_debugger_lua() local project_commands = debugger.project_commands debugger.use_status_buffers = false debugger.project_commands = {} -- reset - local function wait() + -- Runs the given debugger function with arguments and waits for or processes the response. + -- Most debugger functions have a callback that needs to be executed asynchronously or else + -- strange errors or 'Unknown Error' will occur. + local function run_and_wait(f, ...) + f(...) for i = 1, 10 do os.spawn('sleep 0.1'):wait() ui.update() @@ -4338,26 +4328,21 @@ function test_debugger_lua() io.open_file(filename) debugger.toggle_breakpoint(nil, 5) assert(buffer:marker_get(5) > 0, 'breakpoint marker not set') - debugger.continue() -- start - wait() + run_and_wait(debugger.continue) -- start assert_equal(buffer.filename, filename) assert_equal(buffer:line_from_position(buffer.current_pos), 5) assert(buffer:marker_number_from_line(5, 2) > 0, 'current line marker not set') assert_equal(#_VIEWS, 1) - debugger.restart() - wait() + run_and_wait(debugger.restart) assert_equal(buffer.filename, filename) assert_equal(buffer:line_from_position(buffer.current_pos), 3) -- for whatever reason assert(buffer:marker_get(3) > 0, 'current line marker not set') assert_equal(#_VIEWS, 1) - debugger.stop() - wait() + run_and_wait(debugger.stop) assert_equal(buffer:marker_number_from_line(5, 2), -1, 'still debugging') - debugger.continue() -- start - wait() + run_and_wait(debugger.continue) -- start debugger.toggle_breakpoint() -- clear - debugger.step_over() - wait() + run_and_wait(debugger.step_over) assert_equal(#_VIEWS, 2) assert_equal(buffer.filename, filename) assert_equal(buffer:line_from_position(buffer.current_pos), 6) @@ -4365,47 +4350,38 @@ function test_debugger_lua() assert_equal(buffer:marker_get(5), 0) -- current line marker cleared local msg_buf = _VIEWS[#_VIEWS].buffer assert(msg_buf:get_text():find('^"start"\n'), 'process stdout not captured') - debugger.step_over() - wait() + run_and_wait(debugger.step_over) assert_equal(buffer:line_from_position(buffer.current_pos), 7) - debugger.evaluate("print('i', i)") - wait() + run_and_wait(debugger.evaluate, "print('i', i)") assert_equal(buffer.filename, filename) -- still in file being debugged assert(msg_buf:get_text():find('\n"i"%s1\n'), 'evaluation of i failed') - debugger.step_into() - wait() + run_and_wait(debugger.step_into) assert_equal(buffer:line_from_position(buffer.current_pos), 2) - debugger.set_frame(2) - wait() + run_and_wait(debugger.set_frame, 2) assert_equal(buffer:line_from_position(buffer.current_pos), 7) - debugger.set_frame(1) - wait() + run_and_wait(debugger.set_frame, 1) assert_equal(buffer:line_from_position(buffer.current_pos), 2) buffer:search_anchor() local pos = buffer:search_next(buffer.FIND_MATCHCASE | buffer.FIND_WHOLEWORD, 'i') assert(pos > 0, "'i' not found") - debugger.inspect(pos) - wait() + run_and_wait(debugger.inspect, pos) assert(view:call_tip_active(), 'no call tip active') - debugger.step_out() - wait() + run_and_wait(debugger.step_out) assert(msg_buf:get_text():find('\n"foo"%s1\n'), 'process stdout not captured') assert_equal(buffer:line_from_position(buffer.current_pos), 6) - debugger.set_watch('i') - debugger.continue() - wait() + run_and_wait(debugger.set_watch, 'i') + run_and_wait(debugger.continue) assert_equal(buffer:line_from_position(buffer.current_pos), 7) assert(not msg_buf:get_text():find('\n"foo"%s2\n'), 'watch point failed') - debugger.remove_watch(1) + run_and_wait(debugger.remove_watch, 1) + run_and_wait(debugger.set_watch, 'foo', true) -- no break events.emit(events.MARGIN_CLICK, 2, buffer.current_pos, 0) -- simulate breakpoint margin click - debugger.continue() - wait() + run_and_wait(debugger.continue) assert_equal(buffer:line_from_position(buffer.current_pos), 7) assert(msg_buf:get_text():find('\n"foo"%s2\n'), 'set breakpoint failed') assert(not msg_buf:get_text():find('\n"foo"%s3\n'), 'set breakpoint failed') events.emit(events.MARGIN_CLICK, 2, buffer.current_pos, 0) -- simulate breakpoint margin click; clear - debugger.continue() - wait() + run_and_wait(debugger.continue) assert(msg_buf:get_text():find('\n"foo"%s3\n'), 'process stdout not captured') assert(msg_buf:get_text():find('\n"foo"%s4\n'), 'process stdout not captured') assert(msg_buf:get_text():find('\n"end"\n'), 'process stdout not captured') -- cgit v1.2.3