mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	Merge pull request #17537 from bfredl/neolua
refactor(tests): run unittests using main nvim binary - delete separate nvim-test build
This commit is contained in:
		
							
								
								
									
										1
									
								
								.github/workflows/env.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/env.sh
									
									
									
									
										vendored
									
									
								
							| @@ -26,7 +26,6 @@ BUILD_FLAGS="CMAKE_FLAGS=-DCI_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_ | |||||||
|  |  | ||||||
| case "$FLAVOR" in | case "$FLAVOR" in | ||||||
|   asan) |   asan) | ||||||
|     BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON" |  | ||||||
|     cat <<EOF >> "$GITHUB_ENV" |     cat <<EOF >> "$GITHUB_ENV" | ||||||
| CLANG_SANITIZER=ASAN_UBSAN | CLANG_SANITIZER=ASAN_UBSAN | ||||||
| ASAN_OPTIONS=detect_leaks=1:check_initialization_order=1:log_path=$GITHUB_WORKSPACE/build/log/asan:intercept_tls_get_addr=0 | ASAN_OPTIONS=detect_leaks=1:check_initialization_order=1:log_path=$GITHUB_WORKSPACE/build/log/asan:intercept_tls_get_addr=0 | ||||||
|   | |||||||
| @@ -370,7 +370,7 @@ endif() | |||||||
| if(BUSTED_PRG) | if(BUSTED_PRG) | ||||||
|   get_target_property(TEST_INCLUDE_DIRS main_lib INTERFACE_INCLUDE_DIRECTORIES) |   get_target_property(TEST_INCLUDE_DIRS main_lib INTERFACE_INCLUDE_DIRECTORIES) | ||||||
|  |  | ||||||
|   set(UNITTEST_PREREQS nvim-test) |   set(UNITTEST_PREREQS nvim) | ||||||
|   set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test pwsh-test streams-test tty-test ${GENERATED_HELP_TAGS}) |   set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test pwsh-test streams-test tty-test ${GENERATED_HELP_TAGS}) | ||||||
|   set(BENCHMARK_PREREQS nvim tty-test) |   set(BENCHMARK_PREREQS nvim tty-test) | ||||||
|  |  | ||||||
| @@ -380,6 +380,7 @@ if(BUSTED_PRG) | |||||||
|       COMMAND ${CMAKE_COMMAND} |       COMMAND ${CMAKE_COMMAND} | ||||||
|         -DBUSTED_PRG=${BUSTED_PRG} |         -DBUSTED_PRG=${BUSTED_PRG} | ||||||
|         -DLUA_PRG=${LUA_PRG} |         -DLUA_PRG=${LUA_PRG} | ||||||
|  |         -DNVIM_PRG=$<TARGET_FILE:nvim> | ||||||
|         -DWORKING_DIR=${CMAKE_CURRENT_SOURCE_DIR} |         -DWORKING_DIR=${CMAKE_CURRENT_SOURCE_DIR} | ||||||
|         -DBUSTED_OUTPUT_TYPE=${BUSTED_OUTPUT_TYPE} |         -DBUSTED_OUTPUT_TYPE=${BUSTED_OUTPUT_TYPE} | ||||||
|         -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test |         -DTEST_DIR=${CMAKE_CURRENT_SOURCE_DIR}/test | ||||||
| @@ -394,11 +395,6 @@ if(BUSTED_PRG) | |||||||
|     message(WARNING "disabling unit tests: no Luajit FFI in ${LUA_PRG}") |     message(WARNING "disabling unit tests: no Luajit FFI in ${LUA_PRG}") | ||||||
|   endif() |   endif() | ||||||
|  |  | ||||||
|   if(LUA_HAS_FFI) |  | ||||||
|     set(TEST_LIBNVIM_PATH $<TARGET_FILE:nvim-test>) |  | ||||||
|   else() |  | ||||||
|     set(TEST_LIBNVIM_PATH "") |  | ||||||
|   endif() |  | ||||||
|   configure_file( |   configure_file( | ||||||
|     ${CMAKE_SOURCE_DIR}/test/cmakeconfig/paths.lua.in |     ${CMAKE_SOURCE_DIR}/test/cmakeconfig/paths.lua.in | ||||||
|     ${CMAKE_BINARY_DIR}/test/cmakeconfig/paths.lua.gen) |     ${CMAKE_BINARY_DIR}/test/cmakeconfig/paths.lua.gen) | ||||||
|   | |||||||
| @@ -16,8 +16,7 @@ build_make() { | |||||||
| } | } | ||||||
|  |  | ||||||
| build_deps() { | build_deps() { | ||||||
|   if test "${FUNCTIONALTEST}" = "functionaltest-lua" \ |   if test "${FUNCTIONALTEST}" = "functionaltest-lua" ; then | ||||||
|      || test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then |  | ||||||
|     DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON" |     DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON" | ||||||
|   fi |   fi | ||||||
|  |  | ||||||
| @@ -66,13 +65,6 @@ build_nvim() { | |||||||
|     if ! top_make libnvim ; then |     if ! top_make libnvim ; then | ||||||
|       exit 1 |       exit 1 | ||||||
|     fi |     fi | ||||||
|  |  | ||||||
|     if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then |  | ||||||
|       echo "Building nvim-test." |  | ||||||
|       if ! top_make nvim-test ; then |  | ||||||
|         exit 1 |  | ||||||
|       fi |  | ||||||
|     fi |  | ||||||
|   fi |   fi | ||||||
|  |  | ||||||
|   # Invoke nvim to trigger *San early. |   # Invoke nvim to trigger *San early. | ||||||
|   | |||||||
| @@ -71,8 +71,16 @@ if(NOT DEFINED ENV{TEST_TIMEOUT} OR "$ENV{TEST_TIMEOUT}" STREQUAL "") | |||||||
| endif() | endif() | ||||||
|  |  | ||||||
| set(ENV{SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_NAME})  # used by test/helpers.lua. | set(ENV{SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_NAME})  # used by test/helpers.lua. | ||||||
|  |  | ||||||
|  | # TODO: eventually always use NVIM_PRG as the runner | ||||||
|  | if("${TEST_TYPE}" STREQUAL "unit") | ||||||
|  |   set(RUNNER_PRG ${NVIM_PRG} -ll ${WORKING_DIR}/test/busted_runner.lua) | ||||||
|  | else() | ||||||
|  |   set(RUNNER_PRG ${BUSTED_PRG}) | ||||||
|  | endif() | ||||||
|  |  | ||||||
| execute_process( | execute_process( | ||||||
|   COMMAND ${BUSTED_PRG} -v -o test.busted.outputHandlers.${BUSTED_OUTPUT_TYPE} |   COMMAND ${RUNNER_PRG} -v -o test.busted.outputHandlers.${BUSTED_OUTPUT_TYPE} | ||||||
|     --lazy --helper=${TEST_DIR}/${TEST_TYPE}/preload.lua |     --lazy --helper=${TEST_DIR}/${TEST_TYPE}/preload.lua | ||||||
|     --lpath=${BUILD_DIR}/?.lua |     --lpath=${BUILD_DIR}/?.lua | ||||||
|     --lpath=${WORKING_DIR}/runtime/lua/?.lua |     --lpath=${WORKING_DIR}/runtime/lua/?.lua | ||||||
|   | |||||||
| @@ -239,6 +239,14 @@ argument. | |||||||
| 		Disables |shada| unless |-i| was given. | 		Disables |shada| unless |-i| was given. | ||||||
| 		Disables swapfile (like |-n|). | 		Disables swapfile (like |-n|). | ||||||
|  |  | ||||||
|  | 							*-ll* | ||||||
|  | -ll {script} [args] | ||||||
|  | 		Execute a lua script, similarly to |-l|, but the editor is not | ||||||
|  | 		initialized. This gives a lua enviroment similar to a worker | ||||||
|  | 		thread. See |lua-loop-threading|. | ||||||
|  |  | ||||||
|  | 		Unlike `-l` no prior arguments are allowed. | ||||||
|  |  | ||||||
| 							*-b* | 							*-b* | ||||||
| -b		Binary mode.  File I/O will only recognize <NL> to separate | -b		Binary mode.  File I/O will only recognize <NL> to separate | ||||||
| 		lines.  The 'expandtab' option will be reset.  The 'textwidth' | 		lines.  The 'expandtab' option will be reset.  The 'textwidth' | ||||||
|   | |||||||
| @@ -42,8 +42,11 @@ function vim._load_package(name) | |||||||
|   return nil |   return nil | ||||||
| end | end | ||||||
|  |  | ||||||
|  | -- TODO(bfredl): dedicated state for this? | ||||||
|  | if vim.api then | ||||||
|   -- Insert vim._load_package after the preloader at position 2 |   -- Insert vim._load_package after the preloader at position 2 | ||||||
|   table.insert(package.loaders, 2, vim._load_package) |   table.insert(package.loaders, 2, vim._load_package) | ||||||
|  | end | ||||||
|  |  | ||||||
| -- builtin functions which always should be available | -- builtin functions which always should be available | ||||||
| require('vim.shared') | require('vim.shared') | ||||||
| @@ -78,6 +81,6 @@ function vim.empty_dict() | |||||||
| end | end | ||||||
|  |  | ||||||
| -- only on main thread: functions for interacting with editor state | -- only on main thread: functions for interacting with editor state | ||||||
| if not vim.is_thread() then | if vim.api and not vim.is_thread() then | ||||||
|   require('vim._editor') |   require('vim._editor') | ||||||
| end | end | ||||||
|   | |||||||
| @@ -52,7 +52,7 @@ if(PREFER_LUA) | |||||||
|   find_package(Lua 5.1 EXACT REQUIRED) |   find_package(Lua 5.1 EXACT REQUIRED) | ||||||
|   target_include_directories(main_lib SYSTEM BEFORE INTERFACE ${LUA_INCLUDE_DIR}) |   target_include_directories(main_lib SYSTEM BEFORE INTERFACE ${LUA_INCLUDE_DIR}) | ||||||
|   target_link_libraries(main_lib INTERFACE ${LUA_LIBRARIES}) |   target_link_libraries(main_lib INTERFACE ${LUA_LIBRARIES}) | ||||||
|   # Passive (not REQUIRED): if LUAJIT_FOUND is not set, nvim-test is skipped. |   # Passive (not REQUIRED): if LUAJIT_FOUND is not set, fixtures for unittests is skipped. | ||||||
|   find_package(LuaJit) |   find_package(LuaJit) | ||||||
| else() | else() | ||||||
|   find_package(LuaJit REQUIRED) |   find_package(LuaJit REQUIRED) | ||||||
| @@ -679,6 +679,14 @@ if(UNIX) | |||||||
|   endif() |   endif() | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|  | if(NOT LUAJIT_FOUND) | ||||||
|  |   message(STATUS "luajit not found, skipping unit tests") | ||||||
|  | elseif(CMAKE_BUILD_TYPE MATCHES Debug) | ||||||
|  |   glob_wrapper(UNIT_TEST_FIXTURES ${PROJECT_SOURCE_DIR}/test/unit/fixtures/*.c) | ||||||
|  |   list(APPEND NVIM_SOURCES ${UNIT_TEST_FIXTURES}) | ||||||
|  |   target_compile_definitions(main_lib INTERFACE UNIT_TESTING) | ||||||
|  | endif() | ||||||
|  |  | ||||||
| target_sources(nvim PRIVATE ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS} | target_sources(nvim PRIVATE ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS} | ||||||
|   ${NVIM_GENERATED_SOURCES} ${NVIM_SOURCES} ${NVIM_HEADERS} |   ${NVIM_GENERATED_SOURCES} ${NVIM_SOURCES} ${NVIM_HEADERS} | ||||||
|   ${EXTERNAL_SOURCES} ${EXTERNAL_HEADERS}) |   ${EXTERNAL_SOURCES} ${EXTERNAL_HEADERS}) | ||||||
| @@ -837,27 +845,6 @@ set_target_properties( | |||||||
| target_compile_definitions(libnvim PRIVATE MAKE_LIB) | target_compile_definitions(libnvim PRIVATE MAKE_LIB) | ||||||
| target_link_libraries(libnvim PRIVATE main_lib PUBLIC libuv_lib) | target_link_libraries(libnvim PRIVATE main_lib PUBLIC libuv_lib) | ||||||
|  |  | ||||||
| if(NOT LUAJIT_FOUND) |  | ||||||
|   message(STATUS "luajit not found, skipping nvim-test (unit tests) target") |  | ||||||
| else() |  | ||||||
|   glob_wrapper(UNIT_TEST_FIXTURES ${PROJECT_SOURCE_DIR}/test/unit/fixtures/*.c) |  | ||||||
|   add_library( |  | ||||||
|     nvim-test |  | ||||||
|     MODULE |  | ||||||
|     EXCLUDE_FROM_ALL |  | ||||||
|     ${NVIM_SOURCES} ${NVIM_GENERATED_SOURCES} |  | ||||||
|     ${NVIM_HEADERS} ${NVIM_GENERATED_FOR_SOURCES} ${NVIM_GENERATED_FOR_HEADERS} |  | ||||||
|     ${EXTERNAL_SOURCES} ${EXTERNAL_HEADERS} |  | ||||||
|     ${UNIT_TEST_FIXTURES} |  | ||||||
|   ) |  | ||||||
|   target_link_libraries(nvim-test PRIVATE ${LUAJIT_LIBRARIES} main_lib PUBLIC libuv_lib) |  | ||||||
|   if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") |  | ||||||
|     target_link_libraries(nvim-test PRIVATE "-framework CoreServices") |  | ||||||
|   endif() |  | ||||||
|   target_include_directories(nvim-test PRIVATE ${LUAJIT_INCLUDE_DIRS}) |  | ||||||
|   target_compile_definitions(nvim-test PRIVATE UNIT_TESTING) |  | ||||||
| endif() |  | ||||||
|  |  | ||||||
| if(CLANG_ASAN_UBSAN) | if(CLANG_ASAN_UBSAN) | ||||||
|   message(STATUS "Enabling Clang address sanitizer and undefined behavior sanitizer for nvim.") |   message(STATUS "Enabling Clang address sanitizer and undefined behavior sanitizer for nvim.") | ||||||
|   if(CI_BUILD) |   if(CI_BUILD) | ||||||
|   | |||||||
| @@ -64,6 +64,7 @@ | |||||||
| #include "nvim/window.h" | #include "nvim/window.h" | ||||||
|  |  | ||||||
| static int in_fast_callback = 0; | static int in_fast_callback = 0; | ||||||
|  | static bool in_script = false; | ||||||
|  |  | ||||||
| // Initialized in nlua_init(). | // Initialized in nlua_init(). | ||||||
| static lua_State *global_lstate = NULL; | static lua_State *global_lstate = NULL; | ||||||
| @@ -133,8 +134,13 @@ static void nlua_error(lua_State *const lstate, const char *const msg) | |||||||
|     str = lua_tolstring(lstate, -1, &len); |     str = lua_tolstring(lstate, -1, &len); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   if (in_script) { | ||||||
|  |     os_errmsg(str); | ||||||
|  |     os_errmsg("\n"); | ||||||
|  |   } else { | ||||||
|     msg_ext_set_kind("lua_error"); |     msg_ext_set_kind("lua_error"); | ||||||
|     semsg_multiline(msg, (int)len, str); |     semsg_multiline(msg, (int)len, str); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   lua_pop(lstate, 1); |   lua_pop(lstate, 1); | ||||||
| } | } | ||||||
| @@ -534,7 +540,7 @@ int nlua_get_global_ref_count(void) | |||||||
|   return nlua_global_refs->ref_count; |   return nlua_global_refs->ref_count; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void nlua_common_vim_init(lua_State *lstate, bool is_thread) | static void nlua_common_vim_init(lua_State *lstate, bool is_thread, bool is_standalone) | ||||||
|   FUNC_ATTR_NONNULL_ARG(1) |   FUNC_ATTR_NONNULL_ARG(1) | ||||||
| { | { | ||||||
|   nlua_ref_state_t *ref_state = nlua_new_ref_state(lstate, is_thread); |   nlua_ref_state_t *ref_state = nlua_new_ref_state(lstate, is_thread); | ||||||
| @@ -567,7 +573,9 @@ static void nlua_common_vim_init(lua_State *lstate, bool is_thread) | |||||||
|   lua_setfield(lstate, -2, "_empty_dict_mt"); |   lua_setfield(lstate, -2, "_empty_dict_mt"); | ||||||
|  |  | ||||||
|   // vim.loop |   // vim.loop | ||||||
|   if (is_thread) { |   if (is_standalone) { | ||||||
|  |     // do nothing, use libluv like in a standalone interpreter | ||||||
|  |   } else if (is_thread) { | ||||||
|     luv_set_callback(lstate, nlua_luv_thread_cb_cfpcall); |     luv_set_callback(lstate, nlua_luv_thread_cb_cfpcall); | ||||||
|     luv_set_thread(lstate, nlua_luv_thread_cfpcall); |     luv_set_thread(lstate, nlua_luv_thread_cfpcall); | ||||||
|     luv_set_cthread(lstate, nlua_luv_thread_cfcpcall); |     luv_set_cthread(lstate, nlua_luv_thread_cfcpcall); | ||||||
| @@ -606,7 +614,7 @@ static int nlua_module_preloader(lua_State *lstate) | |||||||
|   return 1; |   return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool nlua_init_packages(lua_State *lstate) | static bool nlua_init_packages(lua_State *lstate, bool is_standalone) | ||||||
|   FUNC_ATTR_NONNULL_ALL |   FUNC_ATTR_NONNULL_ALL | ||||||
| { | { | ||||||
|   // put builtin packages in preload |   // put builtin packages in preload | ||||||
| @@ -618,7 +626,7 @@ static bool nlua_init_packages(lua_State *lstate) | |||||||
|     lua_pushcclosure(lstate, nlua_module_preloader, 1);  // [package, preload, cclosure] |     lua_pushcclosure(lstate, nlua_module_preloader, 1);  // [package, preload, cclosure] | ||||||
|     lua_setfield(lstate, -2, def.name);  // [package, preload] |     lua_setfield(lstate, -2, def.name);  // [package, preload] | ||||||
|  |  | ||||||
|     if (nlua_disable_preload && strequal(def.name, "vim.inspect")) { |     if ((nlua_disable_preload && !is_standalone) && strequal(def.name, "vim.inspect")) { | ||||||
|       break; |       break; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -769,7 +777,7 @@ static bool nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL | |||||||
|   lua_pushcfunction(lstate, &nlua_ui_detach); |   lua_pushcfunction(lstate, &nlua_ui_detach); | ||||||
|   lua_setfield(lstate, -2, "ui_detach"); |   lua_setfield(lstate, -2, "ui_detach"); | ||||||
|  |  | ||||||
|   nlua_common_vim_init(lstate, false); |   nlua_common_vim_init(lstate, false, false); | ||||||
|  |  | ||||||
|   // patch require() (only for --startuptime) |   // patch require() (only for --startuptime) | ||||||
|   if (time_fd != NULL) { |   if (time_fd != NULL) { | ||||||
| @@ -788,7 +796,7 @@ static bool nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL | |||||||
|  |  | ||||||
|   lua_setglobal(lstate, "vim"); |   lua_setglobal(lstate, "vim"); | ||||||
|  |  | ||||||
|   if (!nlua_init_packages(lstate)) { |   if (!nlua_init_packages(lstate, false)) { | ||||||
|     return false; |     return false; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -813,6 +821,9 @@ void nlua_init(char **argv, int argc, int lua_arg0) | |||||||
|   luaL_openlibs(lstate); |   luaL_openlibs(lstate); | ||||||
|   if (!nlua_state_init(lstate)) { |   if (!nlua_state_init(lstate)) { | ||||||
|     os_errmsg(_("E970: Failed to initialize builtin lua modules\n")); |     os_errmsg(_("E970: Failed to initialize builtin lua modules\n")); | ||||||
|  | #ifdef EXITFREE | ||||||
|  |     nlua_common_free_all_mem(lstate); | ||||||
|  | #endif | ||||||
|     os_exit(1); |     os_exit(1); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -823,10 +834,29 @@ void nlua_init(char **argv, int argc, int lua_arg0) | |||||||
| } | } | ||||||
|  |  | ||||||
| static lua_State *nlua_thread_acquire_vm(void) | static lua_State *nlua_thread_acquire_vm(void) | ||||||
|  | { | ||||||
|  |   return nlua_init_state(true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void nlua_run_script(char **argv, int argc, int lua_arg0) | ||||||
|  |   FUNC_ATTR_NORETURN | ||||||
|  | { | ||||||
|  |   in_script = true; | ||||||
|  |   global_lstate = nlua_init_state(false); | ||||||
|  |   luv_set_thread_cb(nlua_thread_acquire_vm, nlua_common_free_all_mem); | ||||||
|  |   nlua_init_argv(global_lstate, argv, argc, lua_arg0); | ||||||
|  |   bool lua_ok = nlua_exec_file(argv[lua_arg0 - 1]); | ||||||
|  | #ifdef EXITFREE | ||||||
|  |   nlua_free_all_mem(); | ||||||
|  | #endif | ||||||
|  |   exit(lua_ok ? 0 : 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | lua_State *nlua_init_state(bool thread) | ||||||
| { | { | ||||||
|   // If it is called from the main thread, it will attempt to rebuild the cache. |   // If it is called from the main thread, it will attempt to rebuild the cache. | ||||||
|   const uv_thread_t self = uv_thread_self(); |   const uv_thread_t self = uv_thread_self(); | ||||||
|   if (uv_thread_equal(&main_thread, &self)) { |   if (!in_script && uv_thread_equal(&main_thread, &self)) { | ||||||
|     runtime_search_path_validate(); |     runtime_search_path_validate(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -835,9 +865,11 @@ static lua_State *nlua_thread_acquire_vm(void) | |||||||
|   // Add in the lua standard libraries |   // Add in the lua standard libraries | ||||||
|   luaL_openlibs(lstate); |   luaL_openlibs(lstate); | ||||||
|  |  | ||||||
|  |   if (!in_script) { | ||||||
|     // print |     // print | ||||||
|     lua_pushcfunction(lstate, &nlua_print); |     lua_pushcfunction(lstate, &nlua_print); | ||||||
|     lua_setglobal(lstate, "print"); |     lua_setglobal(lstate, "print"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   lua_pushinteger(lstate, 0); |   lua_pushinteger(lstate, 0); | ||||||
|   lua_setfield(lstate, LUA_REGISTRYINDEX, "nlua.refcount"); |   lua_setfield(lstate, LUA_REGISTRYINDEX, "nlua.refcount"); | ||||||
| @@ -845,18 +877,20 @@ static lua_State *nlua_thread_acquire_vm(void) | |||||||
|   // vim |   // vim | ||||||
|   lua_newtable(lstate); |   lua_newtable(lstate); | ||||||
|  |  | ||||||
|   nlua_common_vim_init(lstate, true); |   nlua_common_vim_init(lstate, thread, in_script); | ||||||
|  |  | ||||||
|   nlua_state_add_stdlib(lstate, true); |   nlua_state_add_stdlib(lstate, true); | ||||||
|  |  | ||||||
|  |   if (!in_script) { | ||||||
|     lua_createtable(lstate, 0, 0); |     lua_createtable(lstate, 0, 0); | ||||||
|     lua_pushcfunction(lstate, nlua_thr_api_nvim__get_runtime); |     lua_pushcfunction(lstate, nlua_thr_api_nvim__get_runtime); | ||||||
|     lua_setfield(lstate, -2, "nvim__get_runtime"); |     lua_setfield(lstate, -2, "nvim__get_runtime"); | ||||||
|     lua_setfield(lstate, -2, "api"); |     lua_setfield(lstate, -2, "api"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   lua_setglobal(lstate, "vim"); |   lua_setglobal(lstate, "vim"); | ||||||
|  |  | ||||||
|   nlua_init_packages(lstate); |   nlua_init_packages(lstate, in_script); | ||||||
|  |  | ||||||
|   lua_getglobal(lstate, "package"); |   lua_getglobal(lstate, "package"); | ||||||
|   lua_getfield(lstate, -1, "loaded"); |   lua_getfield(lstate, -1, "loaded"); | ||||||
|   | |||||||
| @@ -239,6 +239,14 @@ int main(int argc, char **argv) | |||||||
|  |  | ||||||
|   argv0 = argv[0]; |   argv0 = argv[0]; | ||||||
|  |  | ||||||
|  |   if (argc > 1 && STRICMP(argv[1], "-ll") == 0) { | ||||||
|  |     if (argc == 2) { | ||||||
|  |       print_mainerr(err_arg_missing, argv[1]); | ||||||
|  |       exit(1); | ||||||
|  |     } | ||||||
|  |     nlua_run_script(argv, argc, 3); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   char *fname = NULL;     // file name from command line |   char *fname = NULL;     // file name from command line | ||||||
|   mparm_T params;         // various parameters passed between |   mparm_T params;         // various parameters passed between | ||||||
|                           // main() and other functions. |                           // main() and other functions. | ||||||
| @@ -2110,6 +2118,12 @@ static int execute_env(char *env) | |||||||
| /// @param str     string to append to the primary error message, or NULL | /// @param str     string to append to the primary error message, or NULL | ||||||
| static void mainerr(const char *errstr, const char *str) | static void mainerr(const char *errstr, const char *str) | ||||||
|   FUNC_ATTR_NORETURN |   FUNC_ATTR_NORETURN | ||||||
|  | { | ||||||
|  |   print_mainerr(errstr, str); | ||||||
|  |   os_exit(1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void print_mainerr(const char *errstr, const char *str) | ||||||
| { | { | ||||||
|   char *prgname = path_tail(argv0); |   char *prgname = path_tail(argv0); | ||||||
|  |  | ||||||
| @@ -2126,8 +2140,6 @@ static void mainerr(const char *errstr, const char *str) | |||||||
|   os_errmsg(_("\nMore info with \"")); |   os_errmsg(_("\nMore info with \"")); | ||||||
|   os_errmsg(prgname); |   os_errmsg(prgname); | ||||||
|   os_errmsg(" -h\"\n"); |   os_errmsg(" -h\"\n"); | ||||||
|  |  | ||||||
|   os_exit(1); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /// Prints version information for "nvim -v" or "nvim --version". | /// Prints version information for "nvim -v" or "nvim --version". | ||||||
|   | |||||||
| @@ -1182,7 +1182,7 @@ static size_t check_node(MarkTree *b, mtnode_t *x, mtpos_t *last, bool *last_rig | |||||||
|         assert(x->ptr[i] != x->ptr[j]); |         assert(x->ptr[i] != x->ptr[j]); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } else { |   } else if (x->n > 0) { | ||||||
|     *last = x->key[x->n - 1].pos; |     *last = x->key[x->n - 1].pos; | ||||||
|   } |   } | ||||||
|   return n_keys; |   return n_keys; | ||||||
|   | |||||||
| @@ -117,14 +117,6 @@ static const struct kitty_key_map_entry { | |||||||
|  |  | ||||||
| static Map(KittyKey, cstr_t) kitty_key_map = MAP_INIT; | static Map(KittyKey, cstr_t) kitty_key_map = MAP_INIT; | ||||||
|  |  | ||||||
| #ifndef UNIT_TESTING |  | ||||||
| typedef enum { |  | ||||||
|   kIncomplete = -1, |  | ||||||
|   kNotApplicable = 0, |  | ||||||
|   kComplete = 1, |  | ||||||
| } HandleState; |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef INCLUDE_GENERATED_DECLARATIONS | #ifdef INCLUDE_GENERATED_DECLARATIONS | ||||||
| # include "tui/input.c.generated.h" | # include "tui/input.c.generated.h" | ||||||
| #endif | #endif | ||||||
| @@ -584,7 +576,7 @@ static void set_bg(char *bgvalue) | |||||||
| // ignored in the calculations. | // ignored in the calculations. | ||||||
| // | // | ||||||
| // [1] https://en.wikipedia.org/wiki/Luma_%28video%29 | // [1] https://en.wikipedia.org/wiki/Luma_%28video%29 | ||||||
| static HandleState handle_background_color(TermInput *input) | HandleState handle_background_color(TermInput *input) | ||||||
| { | { | ||||||
|   if (input->waiting_for_bg_response <= 0) { |   if (input->waiting_for_bg_response <= 0) { | ||||||
|     return kNotApplicable; |     return kNotApplicable; | ||||||
| @@ -669,12 +661,6 @@ static HandleState handle_background_color(TermInput *input) | |||||||
|   } |   } | ||||||
|   return kComplete; |   return kComplete; | ||||||
| } | } | ||||||
| #ifdef UNIT_TESTING |  | ||||||
| HandleState ut_handle_background_color(TermInput *input) |  | ||||||
| { |  | ||||||
|   return handle_background_color(input); |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| static void handle_raw_buffer(TermInput *input, bool force) | static void handle_raw_buffer(TermInput *input, bool force) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -40,18 +40,14 @@ typedef struct term_input { | |||||||
|   TUIData *tui_data; |   TUIData *tui_data; | ||||||
| } TermInput; | } TermInput; | ||||||
|  |  | ||||||
| #ifdef INCLUDE_GENERATED_DECLARATIONS |  | ||||||
| # include "tui/input.h.generated.h" |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifdef UNIT_TESTING |  | ||||||
| typedef enum { | typedef enum { | ||||||
|   kIncomplete = -1, |   kIncomplete = -1, | ||||||
|   kNotApplicable = 0, |   kNotApplicable = 0, | ||||||
|   kComplete = 1, |   kComplete = 1, | ||||||
| } HandleState; | } HandleState; | ||||||
|  |  | ||||||
| HandleState ut_handle_background_color(TermInput *input); | #ifdef INCLUDE_GENERATED_DECLARATIONS | ||||||
|  | # include "tui/input.h.generated.h" | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #endif  // NVIM_TUI_INPUT_H | #endif  // NVIM_TUI_INPUT_H | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								test/busted_runner.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/busted_runner.lua
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | require 'busted.runner'({ standalone = false }) | ||||||
| @@ -6,7 +6,6 @@ for p in ("${TEST_INCLUDE_DIRS}" .. ";"):gmatch("[^;]+") do | |||||||
| end | end | ||||||
|  |  | ||||||
| module.test_build_dir = "${CMAKE_BINARY_DIR}" | module.test_build_dir = "${CMAKE_BINARY_DIR}" | ||||||
| module.test_libnvim_path = "${TEST_LIBNVIM_PATH}" |  | ||||||
| module.test_source_path = "${CMAKE_SOURCE_DIR}" | module.test_source_path = "${CMAKE_SOURCE_DIR}" | ||||||
| module.test_lua_prg = "${LUA_PRG}" | module.test_lua_prg = "${LUA_PRG}" | ||||||
| module.test_luajit_prg = "" | module.test_luajit_prg = "" | ||||||
|   | |||||||
| @@ -102,6 +102,13 @@ describe('startup', function() | |||||||
|     end) |     end) | ||||||
|  |  | ||||||
|     it('os.exit() sets Nvim exitcode', function() |     it('os.exit() sets Nvim exitcode', function() | ||||||
|  |       -- tricky: LeakSanitizer triggers on os.exit() and disrupts the return value, disable it | ||||||
|  |       exec_lua [[ | ||||||
|  |         local asan_options = os.getenv 'ASAN_OPTIONS' | ||||||
|  |         if asan_options ~= nil and asan_options ~= '' then | ||||||
|  |           vim.loop.os_setenv('ASAN_OPTIONS', asan_options..':detect_leaks=0') | ||||||
|  |         end | ||||||
|  |       ]] | ||||||
|       -- nvim -l foo.lua -arg1 -- a b c |       -- nvim -l foo.lua -arg1 -- a b c | ||||||
|       assert_l_out([[ |       assert_l_out([[ | ||||||
|           bufs: |           bufs: | ||||||
|   | |||||||
| @@ -1677,7 +1677,7 @@ describe('typval.c', function() | |||||||
|           eq(nil, lib.tv_dict_find(nil, 'test', -1)) |           eq(nil, lib.tv_dict_find(nil, 'test', -1)) | ||||||
|           eq(nil, lib.tv_dict_find(nil, nil, 0)) |           eq(nil, lib.tv_dict_find(nil, nil, 0)) | ||||||
|         end) |         end) | ||||||
|         itp('works with NULL key', function() |         itp('works with empty key', function() | ||||||
|           local lua_d = { |           local lua_d = { | ||||||
|             ['']=0, |             ['']=0, | ||||||
|             t=1, |             t=1, | ||||||
| @@ -1692,7 +1692,6 @@ describe('typval.c', function() | |||||||
|           alloc_log:check({}) |           alloc_log:check({}) | ||||||
|           local dis = dict_items(d) |           local dis = dict_items(d) | ||||||
|           eq({0, '', dis['']}, {tv_dict_find(d, '', 0)}) |           eq({0, '', dis['']}, {tv_dict_find(d, '', 0)}) | ||||||
|           eq({0, '', dis['']}, {tv_dict_find(d, nil, 0)}) |  | ||||||
|         end) |         end) | ||||||
|         itp('works with len properly', function() |         itp('works with len properly', function() | ||||||
|           local lua_d = { |           local lua_d = { | ||||||
| @@ -1910,8 +1909,6 @@ describe('typval.c', function() | |||||||
|           } |           } | ||||||
|           local d = dict(lua_d) |           local d = dict(lua_d) | ||||||
|           eq(lua_d, dct2tbl(d)) |           eq(lua_d, dct2tbl(d)) | ||||||
|           eq({{type='fref', fref='tr'}, true}, |  | ||||||
|              {tv_dict_get_callback(d, nil, 0)}) |  | ||||||
|           eq({{type='fref', fref='tr'}, true}, |           eq({{type='fref', fref='tr'}, true}, | ||||||
|              {tv_dict_get_callback(d, '', -1)}) |              {tv_dict_get_callback(d, '', -1)}) | ||||||
|           eq({{type='none'}, true}, |           eq({{type='none'}, true}, | ||||||
|   | |||||||
| @@ -75,7 +75,8 @@ local function child_cleanup_once(func, ...) | |||||||
|   end |   end | ||||||
| end | end | ||||||
|  |  | ||||||
| local libnvim = nil | -- Unittests are run from debug nvim binary in lua interpreter mode. | ||||||
|  | local libnvim = ffi.C | ||||||
|  |  | ||||||
| local lib = setmetatable({}, { | local lib = setmetatable({}, { | ||||||
|   __index = only_separate(function(_, idx) |   __index = only_separate(function(_, idx) | ||||||
| @@ -87,8 +88,6 @@ local lib = setmetatable({}, { | |||||||
| }) | }) | ||||||
|  |  | ||||||
| local init = only_separate(function() | local init = only_separate(function() | ||||||
|   -- load neovim shared library |  | ||||||
|   libnvim = ffi.load(Paths.test_libnvim_path) |  | ||||||
|   for _, c in ipairs(child_calls_init) do |   for _, c in ipairs(child_calls_init) do | ||||||
|     c.func(unpack(c.args)) |     c.func(unpack(c.args)) | ||||||
|   end |   end | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ local multiqueue = cimport("./test/unit/fixtures/multiqueue.h") | |||||||
| local ui_client = cimport("./src/nvim/ui_client.h") | local ui_client = cimport("./src/nvim/ui_client.h") | ||||||
|  |  | ||||||
| itp('handle_background_color', function() | itp('handle_background_color', function() | ||||||
|   local handle_background_color = cinput.ut_handle_background_color |   local handle_background_color = cinput.handle_background_color | ||||||
|   local term_input = ffi.new('TermInput', {}) |   local term_input = ffi.new('TermInput', {}) | ||||||
|   local events = globals.main_loop.thread_events |   local events = globals.main_loop.thread_events | ||||||
|   local kIncomplete = cinput.kIncomplete |   local kIncomplete = cinput.kIncomplete | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 bfredl
					bfredl