aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorGravatar mitchell <70453897+orbitalquark@users.noreply.github.com>2020-10-29 12:44:03 -0400
committerGravatar mitchell <70453897+orbitalquark@users.noreply.github.com>2020-10-29 12:44:03 -0400
commit314e2041cd55f412d0f8d1c46209f04ddaf13ad3 (patch)
treefe22029667b5bf024f975c99392d0c4a73aae164 /test
parent9809b072113fa6c39c65e323c5cb1bd2149fa46c (diff)
Added more unit tests.
Diffstat (limited to 'test')
-rw-r--r--test/modules/debugger/ansi_c/foo.c13
-rw-r--r--test/modules/debugger/lua/foo.lua9
-rw-r--r--test/test.lua203
3 files changed, 225 insertions, 0 deletions
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 <stdio.h>
+
+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()