From 314e2041cd55f412d0f8d1c46209f04ddaf13ad3 Mon Sep 17 00:00:00 2001 From: mitchell <70453897+orbitalquark@users.noreply.github.com> Date: Thu, 29 Oct 2020 12:44:03 -0400 Subject: Added more unit tests. --- test/modules/debugger/ansi_c/foo.c | 13 +++ test/modules/debugger/lua/foo.lua | 9 ++ test/test.lua | 203 +++++++++++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+) create mode 100644 test/modules/debugger/ansi_c/foo.c create mode 100644 test/modules/debugger/lua/foo.lua (limited to 'test') diff --git a/test/modules/debugger/ansi_c/foo.c b/test/modules/debugger/ansi_c/foo.c new file mode 100644 index 00000000..d166eb47 --- /dev/null +++ b/test/modules/debugger/ansi_c/foo.c @@ -0,0 +1,13 @@ +#include + +void foo(int i) { + printf("foo %d\n", i); +} + +int main() { + printf("start\n"); + for (int i = 0; i < 4; i++) + foo(i); + printf("end\n"); + return 0; +} diff --git a/test/modules/debugger/lua/foo.lua b/test/modules/debugger/lua/foo.lua new file mode 100644 index 00000000..e941ebb8 --- /dev/null +++ b/test/modules/debugger/lua/foo.lua @@ -0,0 +1,9 @@ +function foo(i) + print('foo', i) +end + +print('start') +for i = 1, 4 do + foo(i) +end +print('end') diff --git a/test/test.lua b/test/test.lua index 563cdb3f..cc545257 100644 --- a/test/test.lua +++ b/test/test.lua @@ -3858,6 +3858,209 @@ function test_ctags_lua() os.execute('rm -r ' .. dir) end +function test_debugger_ansi_c() + local debugger = require('debugger') + require('debugger.ansi_c').logging = true + local function wait() + os.spawn('sleep 0.2'):wait() + ui.update() + end + local tabs = ui.tabs + ui.tabs = false + local dir = os.tmpname() + os.remove(dir) + lfs.mkdir(dir) + local filename = dir .. '/foo.c' + os.execute(string.format('cp %s/test/modules/debugger/ansi_c/foo.c %s', _HOME, filename)) + io.open_file(filename) + 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() + 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() + 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() + 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() + assert_equal(buffer:marker_number_from_line(8, 2), -1, 'still debugging') + debugger.start(nil, dir .. '/foo') + wait() + debugger.continue() + wait() + debugger.toggle_breakpoint() -- clear + debugger.step_over() + wait() + 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() + assert_equal(buffer:line_from_position(buffer.current_pos), 10) + debugger.evaluate('i') + wait() + 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() + assert_equal(buffer:line_from_position(buffer.current_pos), 4) + debugger.set_frame(2) + wait() + assert_equal(buffer:line_from_position(buffer.current_pos), 10) + debugger.set_frame(1) + wait() + assert_equal(buffer:line_from_position(buffer.current_pos), 4) + 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() + assert(buffer:call_tip_active(), 'no call tip active') + debugger.step_out() + wait() + --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() + 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() + events.emit(events.MARGIN_CLICK, 2, buffer.current_pos, 0) -- simulate breakpoint margin click + debugger.continue() + wait() + 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() + --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') + for i = 1, buffer.line_count do assert_equal(buffer:marker_get(i), 0) end + ui.goto_view(1) + buffer:close(true) + view:unsplit() + buffer:close(true) + os.execute('rm -r ' .. dir) + ui.tabs = tabs +end + +function test_debugger_lua() + local debugger = require('debugger') + local function wait() + for i = 1, 10 do + os.spawn('sleep 0.1'):wait() + ui.update() + end + end + local tabs = ui.tabs + ui.tabs = false + local filename = _HOME .. '/test/modules/debugger/lua/foo.lua' + io.open_file(filename) + debugger.toggle_breakpoint(nil, 5) + assert(buffer:marker_get(5) > 0, 'breakpoint marker not set') + debugger.continue() -- start + wait() + 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() + 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() + assert_equal(buffer:marker_number_from_line(5, 2), -1, 'still debugging') + debugger.continue() -- start + wait() + debugger.toggle_breakpoint() -- clear + debugger.step_over() + wait() + assert_equal(#_VIEWS, 2) + assert_equal(buffer.filename, filename) + assert_equal(buffer:line_from_position(buffer.current_pos), 6) + assert(buffer:marker_get(6) > 0, 'current line marker not set') + 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() + assert_equal(buffer:line_from_position(buffer.current_pos), 7) + debugger.evaluate("print('i', i)") + wait() + 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() + assert_equal(buffer:line_from_position(buffer.current_pos), 2) + -- TODO: set_frame is not implemented in the Lua debugger. + --debugger.set_frame(2) + --wait() + --assert_equal(buffer:line_from_position(buffer.current_pos), 7) + --debugger.set_frame(1) + --wait() + --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() + assert(buffer:call_tip_active(), 'no call tip active') + debugger.step_out() + wait() + 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() + 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) + events.emit(events.MARGIN_CLICK, 2, buffer.current_pos, 0) -- simulate breakpoint margin click + debugger.continue() + wait() + 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() + 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') + for i = 1, buffer.line_count do assert_equal(buffer:marker_get(i), 0) end + ui.goto_view(1) + buffer:close(true) + view:unsplit() + buffer:close(true) + ui.tabs = tabs +end + function test_export_interactive() local export = require('export') buffer.new() -- cgit v1.2.3