diff options
author | Christopher Waldon <christopher.waldon.dev@gmail.com> | 2016-06-21 20:58:38 -0400 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2018-04-27 13:06:31 +0200 |
commit | 34f29ac858d00b9724254a5fa0ca0fda49b1303e (patch) | |
tree | 434e225588452dbe96fc8cc923cc10671e391fbc /test/unit/undo_spec.lua | |
parent | 53f11dcfc7139fe6c8a6b114db4bfec5d91005a9 (diff) | |
download | rneovim-34f29ac858d00b9724254a5fa0ca0fda49b1303e.tar.gz rneovim-34f29ac858d00b9724254a5fa0ca0fda49b1303e.tar.bz2 rneovim-34f29ac858d00b9724254a5fa0ca0fda49b1303e.zip |
test/unit: some unit tests for undo.c #4985
Diffstat (limited to 'test/unit/undo_spec.lua')
-rw-r--r-- | test/unit/undo_spec.lua | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/test/unit/undo_spec.lua b/test/unit/undo_spec.lua new file mode 100644 index 0000000000..7d21204707 --- /dev/null +++ b/test/unit/undo_spec.lua @@ -0,0 +1,213 @@ +local lfs = require('lfs') +local helpers = require('test.unit.helpers') + +local ffi = helpers.ffi +local cimport = helpers.cimport +local to_cstr = helpers.to_cstr +local neq = helpers.neq +local eq = helpers.eq + +cimport('./src/nvim/ex_cmds_defs.h') +cimport('./src/nvim/buffer_defs.h') +local options = cimport('./src/nvim/option_defs.h') +-- TODO: remove: local vim = cimport('./src/nvim/vim.h') +local undo = cimport('./src/nvim/undo.h') +local buffer = cimport('./src/nvim/buffer.h') + +local old_p_udir = options.p_udir -- save the old value of p_udir (undodir) + +-- Values expected by tests. Set in the setup function and destroyed in teardown +local file_buffer = nil +local buffer_hash = nil + +describe('u_write_undo', function() + setup(function() + lfs.mkdir('unit-test-directory') + lfs.chdir('unit-test-directory') + options.p_udir = to_cstr(lfs.currentdir()) -- set p_udir to be the test dir + end) + + teardown(function() + lfs.chdir('..') + local success, err = lfs.rmdir('unit-test-directory') + if not success then + print(err) -- inform tester if directory fails to delete + end + options.p_udir = old_p_udir --restore old p_udir + end) + + before_each(function() + -- create a new buffer + local c_file = to_cstr('../test/unit/undo_spec.lua') + file_buffer = buffer.buflist_new(c_file, c_file, 1, buffer.BLN_LISTED) + file_buffer.b_u_numhead = 1 -- Pretend that the buffer has been changed + + -- TODO(christopher.waldon.dev@gmail.com): replace the 32 with UNDO_HASH_SIZE + -- requires refactor of UNDO_HASH_SIZE into constant/enum for ffi + -- + -- compute a hash for this undofile + buffer_hash = ffi.new('char_u[32]') + undo.u_compute_hash(buffer_hash) + end) + + -- Lua wrapper for u_write_undo + local function u_write_undo(name, forceit, buf, buf_hash) + if name ~= nil then + name = to_cstr(name) + end + + return undo.u_write_undo(name, forceit, buf, buf_hash) + end + + it('writes an undo file to undodir given a buffer and hash', function() + u_write_undo(nil, false, file_buffer, buffer_hash) + local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false)) + local undo_file = io.open(correct_name, "r") + + neq(undo_file, nil) + local success, err = os.remove(correct_name) -- delete the file now that we're done with it. + if not success then + print(err) -- inform tester if undofile fails to delete + end + end) + + it('writes a correctly-named undo file to undodir given a name, buffer, and hash', function() + local correct_name = "undofile.test" + u_write_undo(correct_name, false, file_buffer, buffer_hash) + local undo_file = io.open(correct_name, "r") + + neq(undo_file, nil) + local success, err = os.remove(correct_name) -- delete the file now that we're done with it. + if not success then + print(err) -- inform tester if undofile fails to delete + end + end) + + it('does not write an undofile when the buffer has no valid undofile name', function() + -- TODO(christopher.waldon.dev@gmail.com): Figure out how to test this. + -- it's hard because u_get_undo_file_name() would need to return null + end) + + it('writes the undofile with the same permissions as the original file', function() + -- Create Test file and set permissions + local test_file_name = "./test.file" + local test_permission_file = io.open(test_file_name, "w") + test_permission_file:write("testing permissions") + test_permission_file:close() + local test_permissions = lfs.attributes(test_file_name).permissions + + -- Create vim buffer + local c_file = to_cstr(test_file_name) + file_buffer = buffer.buflist_new(c_file, c_file, 1, buffer.BLN_LISTED) + file_buffer.b_u_numhead = 1 -- Pretend that the buffer has been changed + + u_write_undo(nil, false, file_buffer, buffer_hash) + + -- Find out the correct name of the undofile + local undo_file_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false)) + + -- Find out the permissions of the new file + local permissions = lfs.attributes(undo_file_name).permissions + eq(test_permissions, permissions) + + -- delete the file now that we're done with it. + local success, err = os.remove(test_file_name) + if not success then + print(err) -- inform tester if undofile fails to delete + end + success, err = os.remove(undo_file_name) + if not success then + print(err) -- inform tester if undofile fails to delete + end + end) + + it('writes an undofile only readable by the user if the buffer is unnamed', function() + local correct_permissions = "rw-------" + local undo_file_name = "test.undo" + + -- Create vim buffer + file_buffer = buffer.buflist_new(nil, nil, 1, buffer.BLN_LISTED) + file_buffer.b_u_numhead = 1 -- Pretend that the buffer has been changed + + u_write_undo(undo_file_name, false, file_buffer, buffer_hash) + + -- Find out the permissions of the new file + local permissions = lfs.attributes(undo_file_name).permissions + eq(correct_permissions, permissions) + + -- delete the file now that we're done with it. + local success, err = os.remove(undo_file_name) + if not success then + print(err) -- inform tester if undofile fails to delete + end + end) + + it('forces writing undo file for :wundo! command', function() + local file_contents = "testing permissions" + -- Write a text file where the undofile should go + local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false)) + local text_file, err = io.open(correct_name, "w") + if err then + pending() + end + text_file:write(file_contents) + text_file:close() + + u_write_undo(nil, true, file_buffer, buffer_hash) -- Call with forceit flag enabled + + local undo_file, undo_file_err = io.open(correct_name, "r") + if undo_file_err then + pending() + end + local undo_file_contents = undo_file:read("*a") -- Read all + + neq(file_contents, undo_file_contents) + local success, deletion_err = os.remove(correct_name) -- delete the file now that we're done with it. + if not success then + print(deletion_err) -- inform tester if undofile fails to delete + end + end) + + it('overwrites an existing undo file', function() + u_write_undo(nil, false, file_buffer, buffer_hash) + local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false)) + + local file_last_modified = lfs.attributes(correct_name).modification + + os.execute('sleep 1s') -- Ensure there will be some difference in timestamps + file_buffer.b_u_numhead = 1 -- Mark it as if there are changes + u_write_undo(nil, false, file_buffer, buffer_hash) + + local file_last_modified_2 = lfs.attributes(correct_name).modification + + -- print(file_last_modified, file_last_modified_2) + neq(file_last_modified, file_last_modified_2) + local success, err = os.remove(correct_name) -- delete the file now that we're done with it. + if not success then + print(err) -- inform tester if undofile fails to delete + end + end) + + it('does not overwrite an existing file that is not an undo file', function() + -- TODO: write test + end) + + it('does not overwrite an existing file that has the wrong permissions', function() + -- TODO: write test + end) + + it('does not write an undo file if there is no undo information for the buffer', function() + file_buffer.b_u_numhead = 0 -- Mark it as if there is no undo information + local correct_name = ffi.string(undo.u_get_undo_file_name(file_buffer.b_ffname, false)) + + local existing_file = io.open(correct_name,"r") + if existing_file then + existing_file:close() + os.remove(correct_name) + end + u_write_undo(nil, false, file_buffer, buffer_hash) + local undo_file = io.open(correct_name, "r") + + eq(undo_file, nil) + end) +end) |