diff options
| author | Randy Palamar <randy@rnpnr.xyz> | 2024-05-21 19:53:22 -0600 |
|---|---|---|
| committer | Randy Palamar <randy@rnpnr.xyz> | 2024-05-21 19:53:22 -0600 |
| commit | b7074021b7bfb0932b889b9560dd22df31cef818 (patch) | |
| tree | 0295b18de8fb8ea5289cbda95675687ae06025ff /test/lua | |
| parent | b7f8018a00be930e3f2b864949aec1f91291309c (diff) | |
| parent | efafa3c178268a4149fc3e432bc1174a013c16de (diff) | |
| download | vis-b7074021b7bfb0932b889b9560dd22df31cef818.tar.gz vis-b7074021b7bfb0932b889b9560dd22df31cef818.tar.xz | |
Merge vis-tests into test directory
Going forward all tests should be submitted here directly.
Diffstat (limited to 'test/lua')
| -rw-r--r-- | test/lua/Makefile | 16 | ||||
| -rw-r--r-- | test/lua/README.md | 10 | ||||
| -rw-r--r-- | test/lua/cursor.in | 9 | ||||
| -rw-r--r-- | test/lua/cursor.lua | 105 | ||||
| -rw-r--r-- | test/lua/file-empty.in | 0 | ||||
| -rw-r--r-- | test/lua/file-empty.lua | 21 | ||||
| -rw-r--r-- | test/lua/lines.in | 5 | ||||
| -rw-r--r-- | test/lua/lines.lua | 93 | ||||
| -rw-r--r-- | test/lua/map-basic.lua | 65 | ||||
| -rwxr-xr-x | test/lua/test.sh | 45 | ||||
| -rw-r--r-- | test/lua/visrc.lua | 28 |
11 files changed, 397 insertions, 0 deletions
diff --git a/test/lua/Makefile b/test/lua/Makefile new file mode 100644 index 0000000..a7afc80 --- /dev/null +++ b/test/lua/Makefile @@ -0,0 +1,16 @@ +all: clean ../../vis test + +../../vis: ../../*.[ch] + @echo Compiling vis + @$(MAKE) -C ../.. + +clean: + @rm -f *.out *.err *.busted + +test: + @./test.sh + +%: %.in + @./test.sh $@ + +.PHONY: all clean test diff --git a/test/lua/README.md b/test/lua/README.md new file mode 100644 index 0000000..5b9a1e6 --- /dev/null +++ b/test/lua/README.md @@ -0,0 +1,10 @@ +Unit Test for Vis' Lua API +-------------------------- + +The tests use the [busted unit testing framework](https://olivinelabs.com/busted/). + +Each `*.lua` file is sourced from a new `vis` instance which loads the +correspending `*.in` file. + +Use the `test.sh` shell script to run an individual test or type `make` +to run all tests. diff --git a/test/lua/cursor.in b/test/lua/cursor.in new file mode 100644 index 0000000..f24e0a2 --- /dev/null +++ b/test/lua/cursor.in @@ -0,0 +1,9 @@ +1: abc +2: def +3: ghi +4: jkl +5: mno +6: pqr +7: stu +8: vwx +9: yz_ diff --git a/test/lua/cursor.lua b/test/lua/cursor.lua new file mode 100644 index 0000000..8ea3404 --- /dev/null +++ b/test/lua/cursor.lua @@ -0,0 +1,105 @@ +require 'busted.runner'() + +local win = vis.win + +-- check that selection position remains unchanged after an invalid adjustment +local invalid_pos = function(place) + local pos = win.selection.pos + local line = win.selection.line + local col = win.selection.col + win.selection:to(line, col) + assert.has_error(place) + assert.are.equal(pos, win.selection.pos) + assert.are.equal(line, win.selection.line) + assert.are.equal(col, win.selection.col) +end + +describe("win.selection", function() + + it("initial position", function() + assert.are.equal(0, win.selection.pos) + end) + + it("initial line", function() + assert.are.equal(1, win.selection.line) + end) + + it("initial column", function() + assert.are.equal(1, win.selection.col) + end) +end) + +describe("win.selection.pos", function() + + it("= 0", function() + win.selection.pos = 0 + assert.are.equal(0, win.selection.pos) + assert.are.equal(1, win.selection.line) + assert.are.equal(1, win.selection.col) + end) + + it("= beyond end of file", function() + win.selection.pos = win.file.size + local pos = win.selection.pos + local line = win.selection.line + local col = win.selection.col + win.selection.pos = 0 + -- selection is placed on last valid position + win.selection.pos = win.file.size+1 + assert.are.equal(pos, win.selection.pos) + assert.are.equal(line, win.selection.line) + assert.are.equal(col, win.selection.col) + end) + +end) + +describe("win.selection.to", function() + + it("(5, 3)", function() + win.selection:to(5, 3) + assert.are.equal(30, win.selection.pos) + assert.are.equal(5, win.selection.line) + assert.are.equal(3, win.selection.col) + end) + + it("(0, 0) invalid position", function() + -- is that what we want? + win.selection:to(0, 0) + assert.are.equal(0, win.selection.pos) + assert.are.equal(1, win.selection.line) + assert.are.equal(1, win.selection.col) + end) + + it("invalid position, negative line", function() + invalid_pos(function() win.selection:to(-1, 0) end) + end) + + it("invalid position, negative column", function() + invalid_pos(function() win.selection:to(0, -1) end) + end) + + it("invalid position, non-integer line", function() + invalid_pos(function() win.selection:to(1.5, 1) end) + end) + + it("invalid position, non-integer column", function() + invalid_pos(function() win.selection:to(1, 1.5) end) + end) + +--[[ + it("move beyond end of file", function() + win.selection.pos = win.file.size + local pos = win.selection.pos + local line = win.selection.line + local col = win.selection.col + win.selection.pos = 0 + -- selection is placed on last valid position + win.selection:to(#win.file.lines+2, 1000) + assert.are.equal(pos, win.selection.pos) + assert.are.equal(line, win.selection.line) + assert.are.equal(col, win.selection.col) + end) +--]] + +end) + diff --git a/test/lua/file-empty.in b/test/lua/file-empty.in new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/test/lua/file-empty.in diff --git a/test/lua/file-empty.lua b/test/lua/file-empty.lua new file mode 100644 index 0000000..69ec17d --- /dev/null +++ b/test/lua/file-empty.lua @@ -0,0 +1,21 @@ +require 'busted.runner'() + +local file = vis.win.file + +describe("empty file", function() + + it("has size zero", function() + assert.are.equal(0, file.size) + end) + + it("has zero lines", function() + assert.are.equal(0, #file.lines) + end) + + it("has lines[1] == ''", function() + -- is that what we want? + assert.are.equal("", file.lines[1]) + end) + +end) + diff --git a/test/lua/lines.in b/test/lua/lines.in new file mode 100644 index 0000000..1c35362 --- /dev/null +++ b/test/lua/lines.in @@ -0,0 +1,5 @@ +1 + +3 +
+5 diff --git a/test/lua/lines.lua b/test/lua/lines.lua new file mode 100644 index 0000000..745e8b0 --- /dev/null +++ b/test/lua/lines.lua @@ -0,0 +1,93 @@ +require 'busted.runner'() + +local file = vis.win.file + +describe("file.lines_iterator()", function() + + it("same as file.lines[]", function() + local i = 1 + local iterator_lines = {} + for line in file:lines_iterator() do + iterator_lines[i] = line + i = i + 1 + end + local array_lines = {} + for j = 1, #file.lines do + array_lines[j] = file.lines[j] + end + assert.are.same(array_lines, iterator_lines) + end) +end) + +describe("get file.lines[]", function() + + it("#lines", function() + assert.are.equals(5, #file.lines) + end) + + it("get lines[0]", function() + -- is that what we want? + assert.are.equals(file.lines[0], file.lines[1]) + end) + + it("get lines[1]", function() + assert.are.equals("1", file.lines[1]) + end) + + it("get empty \n line", function() + assert.are.equals("", file.lines[2]) + end) + + it("get empty \r\n line", function() + assert.are.equals("\r", file.lines[4]) + end) + + it("get lines[#lines]", function() + assert.are.equals("5", file.lines[#file.lines]) + end) + + it("get lines[#lines+1]", function() + -- is that what we want? + assert.are.equals("5", file.lines[#file.lines]) + end) + +end) + +describe("set file.lines[]", function() + + it("replace empty \n line", function() + local new = "line 2" + file.lines[2] = new + assert.are.equals(new, file.lines[2]) + end) + +--[[ + it("replace empty \r\n line", function() + local new = "line 4" + file.lines[4] = new + assert.are.equals(new, file.lines[4]) + end) +--]] + + it("set lines[0], add new line at start", function() + local lines = #file.lines + local new_first = "new first line" + local old_first = file.lines[1] + file.lines[0] = new_first + assert.are.equals(lines+1, #file.lines) + assert.are.equals(new_first, file.lines[1]) + assert.are.equals(old_first, file.lines[2]) + end) + + it("set lines[#lines+1], add new line at end", function() + local lines = #file.lines + local new_last = "new last line" + local old_last = file.lines[#file.lines] + file.lines[#file.lines+1] = new_last + assert.are.equals(lines+1, #file.lines) + assert.are.equals(new_last, file.lines[#file.lines]) + assert.are.equals(old_last, file.lines[lines]) + end) + +end) + diff --git a/test/lua/map-basic.lua b/test/lua/map-basic.lua new file mode 100644 index 0000000..b0ce941 --- /dev/null +++ b/test/lua/map-basic.lua @@ -0,0 +1,65 @@ +require 'busted.runner'() + +vis:map(vis.modes.NORMAL, "K", function() + vis:feedkeys("iNormal Mode<Escape>") +end) + +vis:map(vis.modes.INSERT, "K", function() + vis:feedkeys("Insert Mode<Escape>") +end) + +vis:map(vis.modes.VISUAL, "K", function() + vis:feedkeys("<Escape>iVisual Mode<Escape>") +end) + +vis:map(vis.modes.VISUAL_LINE, "K", function() + vis:feedkeys("<Escape>iVisual Line Mode<Escape>") +end) + +vis:map(vis.modes.REPLACE, "K", function() + vis:feedkeys("Replace Mode<Escape>") +end) + +local win = vis.win +local file = win.file + +describe("map", function() + + before_each(function() + win.selection.pos = 0 + end) + + after_each(function() + file:delete(0, file.size) + end) + + local same = function(expected) + local data = file:content(0, file.size) + assert.are.same(expected, data) + end + + it("normal mode", function() + vis:feedkeys("K") + same("Normal Mode") + end) + + it("insert mode", function() + vis:feedkeys("iK") + same("Insert Mode") + end) + + it("visual mode", function() + vis:feedkeys("vK") + same("Visual Mode") + end) + + it("visual line mode", function() + vis:feedkeys("VK") + same("Visual Line Mode") + end) + + it("replace mode", function() + vis:feedkeys("RK") + same("Replace Mode") + end) +end) diff --git a/test/lua/test.sh b/test/lua/test.sh new file mode 100755 index 0000000..4d885de --- /dev/null +++ b/test/lua/test.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +export VIS_PATH=. +[ -z "$VIS" ] && VIS="../../vis" +$VIS -v + +if ! $VIS -v | grep '+lua' >/dev/null 2>&1; then + echo "vis compiled without lua support, skipping tests" + exit 0 +fi + +type busted >/dev/null 2>&1 || { + echo "busted(1) not found, skipping tests" + exit 0 +} + +TESTS_OK=0 +TESTS_RUN=0 + +if [ $# -gt 0 ]; then + test_files=$* +else + test_files="$(find . -type f -name '*.lua' -a ! -name visrc.lua)" +fi + +for t in $test_files; do + TESTS_RUN=$((TESTS_RUN + 1)) + t=${t%.lua} + t=${t#./} + printf "%-30s" "$t" + $VIS "$t.in" < /dev/null 2> /dev/null > "$t.busted" + + if [ $? -ne 0 ]; then + printf "FAIL\n" + cat "$t.busted" + else + TESTS_OK=$((TESTS_OK + 1)) + printf "OK\n" + fi +done + +printf "Tests ok %d/%d\n" $TESTS_OK $TESTS_RUN + +# set exit status +[ $TESTS_OK -eq $TESTS_RUN ] diff --git a/test/lua/visrc.lua b/test/lua/visrc.lua new file mode 100644 index 0000000..16aa8b9 --- /dev/null +++ b/test/lua/visrc.lua @@ -0,0 +1,28 @@ +package.path = '../../lua/?.lua;'..package.path +dofile("../../lua/vis.lua") + +-- redirect output to stdout, stderr is used by the vis UI +io.stderr = io.stdout + +-- make sure we gracefully terminate, cleanup terminal state etc. +os.exit = function(status) + vis:exit(status) +end + +vis.events.subscribe(vis.events.WIN_OPEN, function(win) + -- test.in file passed to vis + local in_file = win.file.name + if in_file then + -- use the corresponding test.lua file + lua_file = string.gsub(in_file, '%.in$', '.lua') + local ok, msg = pcall(dofile, lua_file) + if not ok then + if type(msg) == 'string' then + print(msg) + end + vis:exit(1) + return + end + end + vis:exit(0) +end) |
