aboutsummaryrefslogtreecommitdiff
path: root/test/lua
diff options
context:
space:
mode:
authorRandy Palamar <randy@rnpnr.xyz>2024-05-21 19:53:22 -0600
committerRandy Palamar <randy@rnpnr.xyz>2024-05-21 19:53:22 -0600
commitb7074021b7bfb0932b889b9560dd22df31cef818 (patch)
tree0295b18de8fb8ea5289cbda95675687ae06025ff /test/lua
parentb7f8018a00be930e3f2b864949aec1f91291309c (diff)
parentefafa3c178268a4149fc3e432bc1174a013c16de (diff)
downloadvis-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/Makefile16
-rw-r--r--test/lua/README.md10
-rw-r--r--test/lua/cursor.in9
-rw-r--r--test/lua/cursor.lua105
-rw-r--r--test/lua/file-empty.in0
-rw-r--r--test/lua/file-empty.lua21
-rw-r--r--test/lua/lines.in5
-rw-r--r--test/lua/lines.lua93
-rw-r--r--test/lua/map-basic.lua65
-rwxr-xr-xtest/lua/test.sh45
-rw-r--r--test/lua/visrc.lua28
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)