mirror of
https://github.com/neovim/neovim.git
synced 2024-12-19 10:45:16 -07:00
Add basic infrastructure for unit testing
Tests will be written using the [moonscript](http://moonscript.org/) language, a lua 'dialect' that is whitespace-significant and has a syntax similar to coffeescript. The test framework used is [busted](http://olivinelabs.com/busted/), a bdd framework for lua/moonscript. Luajit has a nice ffi module, which lets lua programs link shared libraries and call it's functions without writing any C code. To take advantage of this fact for testing C functions, a new target was added to CMakeLists.txt, which compiles neovim as a shared library that is loaded by the process running the tests. This commit adds necessary code for downloading and installing a lua package manager(luarocks) locally. It wasn't added as a subtree because there are quite a few blobs in its source tree.
This commit is contained in:
parent
05b9e11584
commit
d04ca90f5c
17
.gitignore
vendored
17
.gitignore
vendored
@ -25,5 +25,22 @@ src/testdir/*.failed
|
||||
src/testdir/X*
|
||||
src/testdir/valgrind.*
|
||||
|
||||
# luarocks, not added as a subtree because of the large number of blobs
|
||||
third-party/luarocks
|
||||
|
||||
# luajit files
|
||||
third-party/luajit/src/host/buildvm
|
||||
third-party/luajit/src/host/buildvm_arch.h
|
||||
third-party/luajit/src/host/minilua
|
||||
third-party/luajit/src/jit/vmdef.lua
|
||||
third-party/luajit/src/libluajit.a
|
||||
third-party/luajit/src/lj_bcdef.h
|
||||
third-party/luajit/src/lj_ffdef.h
|
||||
third-party/luajit/src/lj_folddef.h
|
||||
third-party/luajit/src/lj_libdef.h
|
||||
third-party/luajit/src/lj_recdef.h
|
||||
third-party/luajit/src/lj_vm.s
|
||||
third-party/luajit/src/luajit
|
||||
|
||||
# local make targets
|
||||
local.mk
|
||||
|
11
Makefile
11
Makefile
@ -11,11 +11,20 @@ build/bin/nvim: deps
|
||||
test: build/bin/nvim
|
||||
cd src/testdir && make
|
||||
|
||||
deps: .deps/usr/lib/libuv.a
|
||||
unittest: build/bin/nvim
|
||||
sh -e scripts/unittest.sh
|
||||
|
||||
deps: .deps/usr/lib/libuv.a .deps/usr/lib/libluajit-5.1.a .deps/usr/bin/busted
|
||||
|
||||
.deps/usr/lib/libuv.a:
|
||||
sh -e scripts/compile-libuv.sh
|
||||
|
||||
.deps/usr/lib/libluajit-5.1.a:
|
||||
sh -e scripts/compile-lua.sh
|
||||
|
||||
.deps/usr/bin/busted:
|
||||
sh -e scripts/setup-test-tools.sh
|
||||
|
||||
cmake: clean deps
|
||||
mkdir build
|
||||
cd build && cmake $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) ../
|
||||
|
6
scripts/compile-lua.sh
Normal file
6
scripts/compile-lua.sh
Normal file
@ -0,0 +1,6 @@
|
||||
. scripts/common.sh
|
||||
|
||||
lua_dir="$pkgroot/third-party/luajit"
|
||||
|
||||
cd "$lua_dir"
|
||||
make PREFIX="$prefix" install
|
22
scripts/setup-test-tools.sh
Normal file
22
scripts/setup-test-tools.sh
Normal file
@ -0,0 +1,22 @@
|
||||
. scripts/common.sh
|
||||
|
||||
luarocks_ver=v2.1.2
|
||||
luarocks_repo=keplerproject/luarocks
|
||||
luarocks_sha1=69ea9b641a5066b1f316847494d8c63a4693977d
|
||||
luarocks_dir="$pkgroot/third-party/luarocks"
|
||||
|
||||
github_download "$luarocks_repo" "$luarocks_ver" "$luarocks_dir" \
|
||||
"$luarocks_sha1"
|
||||
|
||||
cd "$luarocks_dir"
|
||||
|
||||
./configure --prefix="$prefix" --force-config --with-lua="$prefix" \
|
||||
--with-lua-include="$prefix/include/luajit-2.0" \
|
||||
--lua-suffix="jit"
|
||||
|
||||
make bootstrap
|
||||
|
||||
# install tools for testing
|
||||
luarocks install moonrocks --server=http://rocks.moonscript.org
|
||||
moonrocks install moonscript
|
||||
moonrocks install busted
|
6
scripts/unittest.sh
Normal file
6
scripts/unittest.sh
Normal file
@ -0,0 +1,6 @@
|
||||
. scripts/common.sh
|
||||
|
||||
(cd "$pkgroot/build" && make) || exit 1
|
||||
eval "$(luarocks path)"
|
||||
|
||||
busted --pattern=.moon ./test
|
@ -13,6 +13,7 @@ list(APPEND NEOVIM_SOURCES "${PROJECT_BINARY_DIR}/config/auto/pathdef.c")
|
||||
file( GLOB OS_SOURCES os/*.c )
|
||||
|
||||
add_executable (nvim ${NEOVIM_SOURCES} ${OS_SOURCES})
|
||||
add_library (nvim-test SHARED ${NEOVIM_SOURCES} ${OS_SOURCES})
|
||||
|
||||
# The libraries we link against for nvim
|
||||
set(NVIM_LINK_LIBRARIES m ${LibUV_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
||||
@ -28,19 +29,23 @@ if (LibIntl_FOUND)
|
||||
endif()
|
||||
|
||||
target_link_libraries (nvim ${NVIM_LINK_LIBRARIES})
|
||||
target_link_libraries (nvim-test ${NVIM_LINK_LIBRARIES})
|
||||
|
||||
include(CheckLibraryExists)
|
||||
check_library_exists(termcap tgetent "" HAVE_LIBTERMCAP)
|
||||
|
||||
if (HAVE_LIBTERMCAP)
|
||||
target_link_libraries(nvim termcap)
|
||||
target_link_libraries(nvim-test termcap)
|
||||
else()
|
||||
check_library_exists(curses tgetent "" HAVE_LIBCURSES)
|
||||
if (HAVE_LIBCURSES)
|
||||
target_link_libraries(nvim curses)
|
||||
target_link_libraries(nvim-test curses)
|
||||
else()
|
||||
find_package(Curses REQUIRED)
|
||||
target_link_libraries(nvim ${CURSES_LIBRARIES})
|
||||
target_link_libraries(nvim-test ${CURSES_LIBRARIES})
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
35
test/unit/helpers.moon
Normal file
35
test/unit/helpers.moon
Normal file
@ -0,0 +1,35 @@
|
||||
ffi = require 'ffi'
|
||||
|
||||
-- load neovim shared library
|
||||
libnvim = ffi.load './build/src/libnvim-test.so'
|
||||
|
||||
-- Luajit ffi parser only understands function signatures.
|
||||
-- This helper function normalizes headers, passes to ffi and returns the
|
||||
-- library pointer
|
||||
cimport = (path) ->
|
||||
-- Can't parse some of vim types, perhaps need to define those before
|
||||
-- automatically importing to ffi
|
||||
|
||||
-- header_file = io.open path, 'rb'
|
||||
-- header = header_file\read '*a'
|
||||
-- header_file.close!
|
||||
-- header = string.gsub header, '#include[^\n]*\n', ''
|
||||
-- header = string.gsub header, '#ifndef[^\n]*\n', ''
|
||||
-- header = string.gsub header, '#define[^\n]*\n', ''
|
||||
-- header = string.gsub header, '#endif[^\n]*\n', ''
|
||||
-- ffi.cdef header
|
||||
|
||||
return libnvim
|
||||
|
||||
-- take a pointer to a C-allocated string and return an interned
|
||||
-- version while also freeing the memory
|
||||
internalize = (cdata) ->
|
||||
ffi.gc cdata, ffi.C.free
|
||||
return ffi.string cdata
|
||||
|
||||
return {
|
||||
cimport: cimport
|
||||
internalize: internalize
|
||||
eq: (expected, actual) -> assert.are.same expected, actual
|
||||
ffi: ffi
|
||||
}
|
38
test/unit/misc1.moon
Normal file
38
test/unit/misc1.moon
Normal file
@ -0,0 +1,38 @@
|
||||
{:cimport, :internalize, :eq, :ffi} = require 'test.unit.helpers'
|
||||
|
||||
misc1 = cimport './src/misc1.h'
|
||||
cstr = ffi.typeof 'char[?]'
|
||||
|
||||
-- TODO extract constants from vim.h
|
||||
|
||||
describe 'misc1 function', ->
|
||||
describe 'fullpathcmp', ->
|
||||
ffi.cdef 'int fullpathcmp(char *s1, char *s2, int checkname);'
|
||||
fullpathcmp = (s1, s2, cn) ->
|
||||
s1 = cstr (string.len s1) + 1, s1
|
||||
s2 = cstr (string.len s2) + 1, s2
|
||||
misc1.fullpathcmp s1, s2, cn or 0
|
||||
|
||||
f1 = 'f1.o'
|
||||
f2 = 'f2.o'
|
||||
f3 = 'test/f1.o'
|
||||
FPC_SAME = 1
|
||||
FPC_DIFF = 2
|
||||
FPC_NOTX = 4
|
||||
FPC_DIFFX = 6
|
||||
FPC_SAMEX = 7
|
||||
|
||||
before_each ->
|
||||
-- create the three files that will be used in this spec
|
||||
(io.open f1, 'w').close!
|
||||
(io.open f2, 'w').close!
|
||||
(io.open f3, 'w').close!
|
||||
|
||||
after_each ->
|
||||
os.remove f1
|
||||
os.remove f2
|
||||
os.remove f3
|
||||
|
||||
it 'returns FPC_SAME when passed the same file', ->
|
||||
eq FPC_SAME, (fullpathcmp f1, f1)
|
||||
|
Loading…
Reference in New Issue
Block a user