mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00: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:
		
							
								
								
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -25,5 +25,22 @@ src/testdir/*.failed | |||||||
| src/testdir/X* | src/testdir/X* | ||||||
| src/testdir/valgrind.* | 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 make targets | ||||||
| local.mk | local.mk | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								Makefile
									
									
									
									
									
								
							| @@ -11,11 +11,20 @@ build/bin/nvim: deps | |||||||
| test: build/bin/nvim | test: build/bin/nvim | ||||||
| 	cd src/testdir && make | 	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: | .deps/usr/lib/libuv.a: | ||||||
| 	sh -e scripts/compile-libuv.sh | 	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 | cmake: clean deps | ||||||
| 	mkdir build | 	mkdir build | ||||||
| 	cd build && cmake $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) ../ | 	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 ) | file( GLOB OS_SOURCES os/*.c ) | ||||||
|  |  | ||||||
| add_executable (nvim ${NEOVIM_SOURCES} ${OS_SOURCES}) | add_executable (nvim ${NEOVIM_SOURCES} ${OS_SOURCES}) | ||||||
|  | add_library (nvim-test SHARED ${NEOVIM_SOURCES} ${OS_SOURCES})  | ||||||
|  |  | ||||||
| # The libraries we link against for nvim | # The libraries we link against for nvim | ||||||
| set(NVIM_LINK_LIBRARIES m ${LibUV_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) | set(NVIM_LINK_LIBRARIES m ${LibUV_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) | ||||||
| @@ -28,19 +29,23 @@ if (LibIntl_FOUND) | |||||||
| endif() | endif() | ||||||
|  |  | ||||||
| target_link_libraries (nvim ${NVIM_LINK_LIBRARIES}) | target_link_libraries (nvim ${NVIM_LINK_LIBRARIES}) | ||||||
|  | target_link_libraries (nvim-test ${NVIM_LINK_LIBRARIES}) | ||||||
|  |  | ||||||
| include(CheckLibraryExists) | include(CheckLibraryExists) | ||||||
| check_library_exists(termcap tgetent "" HAVE_LIBTERMCAP) | check_library_exists(termcap tgetent "" HAVE_LIBTERMCAP) | ||||||
|  |  | ||||||
| if (HAVE_LIBTERMCAP) | if (HAVE_LIBTERMCAP) | ||||||
|   target_link_libraries(nvim termcap) |   target_link_libraries(nvim termcap) | ||||||
|  |   target_link_libraries(nvim-test termcap) | ||||||
| else() | else() | ||||||
|   check_library_exists(curses tgetent "" HAVE_LIBCURSES) |   check_library_exists(curses tgetent "" HAVE_LIBCURSES) | ||||||
|   if (HAVE_LIBCURSES) |   if (HAVE_LIBCURSES) | ||||||
|     target_link_libraries(nvim curses) |     target_link_libraries(nvim curses) | ||||||
|  |     target_link_libraries(nvim-test curses) | ||||||
|   else() |   else() | ||||||
|     find_package(Curses REQUIRED) |     find_package(Curses REQUIRED) | ||||||
|     target_link_libraries(nvim ${CURSES_LIBRARIES}) |     target_link_libraries(nvim ${CURSES_LIBRARIES}) | ||||||
|  |     target_link_libraries(nvim-test ${CURSES_LIBRARIES}) | ||||||
|   endif() |   endif() | ||||||
| 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) | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user
	 Thiago de Arruda
					Thiago de Arruda