aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2016-09-25 18:16:17 +0300
committerZyX <kp-pav@yandex.ru>2017-03-29 10:08:06 +0300
commitcf45c7bb059dafeb882133273f77042cb06b37e4 (patch)
treeee06e32ccc03a1406e886b7124a0e6dc286b0462
parent7ceebacb3fad49ba8321397cf839948caa55b3f5 (diff)
downloadrneovim-cf45c7bb059dafeb882133273f77042cb06b37e4.tar.gz
rneovim-cf45c7bb059dafeb882133273f77042cb06b37e4.tar.bz2
rneovim-cf45c7bb059dafeb882133273f77042cb06b37e4.zip
unittests: Fix tests crash
Tests crash at some point without - `after_each(collectgarbage)` right before “typval.c list copy() copies list correctly and converts items” test. - Commenting out that test. - Adding `collectgarbage()` after the test (what actually this commit does). Adding `collectgarbage()` to top-level `after_each` block right after `restore_allocators` makes running this file crash even if it is run alone.
-rw-r--r--test/unit/eval/typval_spec.lua113
1 files changed, 58 insertions, 55 deletions
diff --git a/test/unit/eval/typval_spec.lua b/test/unit/eval/typval_spec.lua
index 926bf1c478..2c9b7c66db 100644
--- a/test/unit/eval/typval_spec.lua
+++ b/test/unit/eval/typval_spec.lua
@@ -606,63 +606,66 @@ describe('typval.c', function()
eq(nil, lib.tv_list_copy(nil, nil, false, 1))
end)
itp('copies list correctly without converting items', function()
- local v = {{['«']='»'}, {'„'}, 1, '“', null_string, null_list, null_dict}
- local l_tv = lua2typvalt(v)
- local l = l_tv.vval.v_list
- local lis = list_items(l)
- alloc_log:clear()
+ do
+ local v = {{['«']='»'}, {'„'}, 1, '“', null_string, null_list, null_dict}
+ local l_tv = lua2typvalt(v)
+ local l = l_tv.vval.v_list
+ local lis = list_items(l)
+ alloc_log:clear()
- eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
- eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
- local l_copy1 = tv_list_copy(nil, l, false, 0)
- eq(2, lis[1].li_tv.vval.v_dict.dv_refcount)
- eq(2, lis[2].li_tv.vval.v_list.lv_refcount)
- local lis_copy1 = list_items(l_copy1)
- eq(lis[1].li_tv.vval.v_dict, lis_copy1[1].li_tv.vval.v_dict)
- eq(lis[2].li_tv.vval.v_list, lis_copy1[2].li_tv.vval.v_list)
- eq(v, lst2tbl(l_copy1))
- alloc_log:check({
- a.list(l_copy1),
- a.li(lis_copy1[1]),
- a.li(lis_copy1[2]),
- a.li(lis_copy1[3]),
- a.li(lis_copy1[4]),
- a.str(lis_copy1[4].li_tv.vval.v_string, #v[4]),
- a.li(lis_copy1[5]),
- a.li(lis_copy1[6]),
- a.li(lis_copy1[7]),
- })
- lib.tv_list_free(ffi.gc(l_copy1, nil))
- alloc_log:clear()
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local l_copy1 = tv_list_copy(nil, l, false, 0)
+ eq(2, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(2, lis[2].li_tv.vval.v_list.lv_refcount)
+ local lis_copy1 = list_items(l_copy1)
+ eq(lis[1].li_tv.vval.v_dict, lis_copy1[1].li_tv.vval.v_dict)
+ eq(lis[2].li_tv.vval.v_list, lis_copy1[2].li_tv.vval.v_list)
+ eq(v, lst2tbl(l_copy1))
+ alloc_log:check({
+ a.list(l_copy1),
+ a.li(lis_copy1[1]),
+ a.li(lis_copy1[2]),
+ a.li(lis_copy1[3]),
+ a.li(lis_copy1[4]),
+ a.str(lis_copy1[4].li_tv.vval.v_string, #v[4]),
+ a.li(lis_copy1[5]),
+ a.li(lis_copy1[6]),
+ a.li(lis_copy1[7]),
+ })
+ lib.tv_list_free(ffi.gc(l_copy1, nil))
+ alloc_log:clear()
- eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
- eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
- local l_deepcopy1 = tv_list_copy(nil, l, true, 0)
- neq(nil, l_deepcopy1)
- eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
- eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
- local lis_deepcopy1 = list_items(l_deepcopy1)
- neq(lis[1].li_tv.vval.v_dict, lis_deepcopy1[1].li_tv.vval.v_dict)
- neq(lis[2].li_tv.vval.v_list, lis_deepcopy1[2].li_tv.vval.v_list)
- eq(v, lst2tbl(l_deepcopy1))
- local di_deepcopy1 = first_di(lis_deepcopy1[1].li_tv.vval.v_dict)
- alloc_log:check({
- a.list(l_deepcopy1),
- a.li(lis_deepcopy1[1]),
- a.dict(lis_deepcopy1[1].li_tv.vval.v_dict),
- a.di(di_deepcopy1, #('«')),
- a.str(di_deepcopy1.di_tv.vval.v_string, #v[1]['«']),
- a.li(lis_deepcopy1[2]),
- a.list(lis_deepcopy1[2].li_tv.vval.v_list),
- a.li(lis_deepcopy1[2].li_tv.vval.v_list.lv_first),
- a.str(lis_deepcopy1[2].li_tv.vval.v_list.lv_first.li_tv.vval.v_string, #v[2][1]),
- a.li(lis_deepcopy1[3]),
- a.li(lis_deepcopy1[4]),
- a.str(lis_deepcopy1[4].li_tv.vval.v_string, #v[4]),
- a.li(lis_deepcopy1[5]),
- a.li(lis_deepcopy1[6]),
- a.li(lis_deepcopy1[7]),
- })
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local l_deepcopy1 = tv_list_copy(nil, l, true, 0)
+ neq(nil, l_deepcopy1)
+ eq(1, lis[1].li_tv.vval.v_dict.dv_refcount)
+ eq(1, lis[2].li_tv.vval.v_list.lv_refcount)
+ local lis_deepcopy1 = list_items(l_deepcopy1)
+ neq(lis[1].li_tv.vval.v_dict, lis_deepcopy1[1].li_tv.vval.v_dict)
+ neq(lis[2].li_tv.vval.v_list, lis_deepcopy1[2].li_tv.vval.v_list)
+ eq(v, lst2tbl(l_deepcopy1))
+ local di_deepcopy1 = first_di(lis_deepcopy1[1].li_tv.vval.v_dict)
+ alloc_log:check({
+ a.list(l_deepcopy1),
+ a.li(lis_deepcopy1[1]),
+ a.dict(lis_deepcopy1[1].li_tv.vval.v_dict),
+ a.di(di_deepcopy1, #('«')),
+ a.str(di_deepcopy1.di_tv.vval.v_string, #v[1]['«']),
+ a.li(lis_deepcopy1[2]),
+ a.list(lis_deepcopy1[2].li_tv.vval.v_list),
+ a.li(lis_deepcopy1[2].li_tv.vval.v_list.lv_first),
+ a.str(lis_deepcopy1[2].li_tv.vval.v_list.lv_first.li_tv.vval.v_string, #v[2][1]),
+ a.li(lis_deepcopy1[3]),
+ a.li(lis_deepcopy1[4]),
+ a.str(lis_deepcopy1[4].li_tv.vval.v_string, #v[4]),
+ a.li(lis_deepcopy1[5]),
+ a.li(lis_deepcopy1[6]),
+ a.li(lis_deepcopy1[7]),
+ })
+ end
+ collectgarbage()
end)
itp('copies list correctly and converts items', function()
local vc = ffi.gc(ffi.new('vimconv_T[1]'), function(vc)