mirror of
https://github.com/neovim/neovim.git
synced 2024-12-29 14:41:06 -07:00
unittests: Test tv_list_concat()
This commit is contained in:
parent
f80a00469f
commit
56e4c2f67e
@ -481,7 +481,7 @@ void tv_list_extend(list_T *const l1, list_T *const l2,
|
||||
int todo = l2->lv_len;
|
||||
// We also quit the loop when we have inserted the original item count of
|
||||
// the list, avoid a hang when we extend a list with itself.
|
||||
for (listitem_T *item = l2->lv_first
|
||||
for (listitem_T *item = l2->lv_first
|
||||
; item != NULL && --todo >= 0
|
||||
; item = item->li_next) {
|
||||
tv_list_insert_tv(l1, &item->li_tv, bef);
|
||||
|
@ -14,6 +14,7 @@ local alloc_log_new = helpers.alloc_log_new
|
||||
local a = eval_helpers.alloc_logging_helpers
|
||||
local list = eval_helpers.list
|
||||
local lst2tbl = eval_helpers.lst2tbl
|
||||
local typvalt = eval_helpers.typvalt
|
||||
local type_key = eval_helpers.type_key
|
||||
local li_alloc = eval_helpers.li_alloc
|
||||
local int_type = eval_helpers.int_type
|
||||
@ -747,5 +748,146 @@ describe('typval.c', function()
|
||||
eq(1, l_copy1.lv_refcount)
|
||||
end)
|
||||
end)
|
||||
describe('concat()', function()
|
||||
itp('works with NULL lists', function()
|
||||
local l = list(1, {})
|
||||
alloc_log:clear()
|
||||
eq(1, l.lv_refcount)
|
||||
eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
|
||||
local rettv1 = typvalt()
|
||||
eq(OK, lib.tv_list_concat(nil, l, rettv1))
|
||||
eq(1, l.lv_refcount)
|
||||
eq(tonumber(lib.VAR_LIST), tonumber(rettv1.v_type))
|
||||
eq({1, {}}, typvalt2lua(rettv1))
|
||||
eq(1, rettv1.vval.v_list.lv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv1.vval.v_list),
|
||||
a.li(rettv1.vval.v_list.lv_first),
|
||||
a.li(rettv1.vval.v_list.lv_last),
|
||||
})
|
||||
eq(2, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
|
||||
local rettv2 = typvalt()
|
||||
eq(OK, lib.tv_list_concat(l, nil, rettv2))
|
||||
eq(1, l.lv_refcount)
|
||||
eq(tonumber(lib.VAR_LIST), tonumber(rettv2.v_type))
|
||||
eq({1, {}}, typvalt2lua(rettv2))
|
||||
eq(1, rettv2.vval.v_list.lv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv2.vval.v_list),
|
||||
a.li(rettv2.vval.v_list.lv_first),
|
||||
a.li(rettv2.vval.v_list.lv_last),
|
||||
})
|
||||
eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
|
||||
local rettv3 = typvalt()
|
||||
eq(OK, lib.tv_list_concat(nil, nil, rettv3))
|
||||
eq(tonumber(lib.VAR_LIST), tonumber(rettv3.v_type))
|
||||
eq(null_list, typvalt2lua(rettv3))
|
||||
alloc_log:check({})
|
||||
end)
|
||||
itp('works with two different lists', function()
|
||||
local l1 = list(1, {})
|
||||
local l2 = list(3, {[type_key]=list_type})
|
||||
eq(1, l1.lv_refcount)
|
||||
eq(1, l1.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
eq(1, l2.lv_refcount)
|
||||
eq(1, l2.lv_last.li_tv.vval.v_list.lv_refcount)
|
||||
alloc_log:clear()
|
||||
|
||||
local rettv = typvalt()
|
||||
eq(OK, lib.tv_list_concat(l1, l2, rettv))
|
||||
eq(1, l1.lv_refcount)
|
||||
eq(2, l1.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
eq(1, l2.lv_refcount)
|
||||
eq(2, l2.lv_last.li_tv.vval.v_list.lv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv.vval.v_list),
|
||||
a.li(rettv.vval.v_list.lv_first),
|
||||
a.li(rettv.vval.v_list.lv_first.li_next),
|
||||
a.li(rettv.vval.v_list.lv_last.li_prev),
|
||||
a.li(rettv.vval.v_list.lv_last),
|
||||
})
|
||||
eq({1, {}, 3, {[type_key]=list_type}}, typvalt2lua(rettv))
|
||||
end)
|
||||
itp('can concatenate list with itself', function()
|
||||
local l = list(1, {})
|
||||
eq(1, l.lv_refcount)
|
||||
eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
alloc_log:clear()
|
||||
|
||||
local rettv = typvalt()
|
||||
eq(OK, lib.tv_list_concat(l, l, rettv))
|
||||
eq(1, l.lv_refcount)
|
||||
eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv.vval.v_list),
|
||||
a.li(rettv.vval.v_list.lv_first),
|
||||
a.li(rettv.vval.v_list.lv_first.li_next),
|
||||
a.li(rettv.vval.v_list.lv_last.li_prev),
|
||||
a.li(rettv.vval.v_list.lv_last),
|
||||
})
|
||||
eq({1, {}, 1, {}}, typvalt2lua(rettv))
|
||||
end)
|
||||
itp('can concatenate empty non-NULL lists', function()
|
||||
local l = list(1, {})
|
||||
local le = list()
|
||||
local le2 = list()
|
||||
eq(1, l.lv_refcount)
|
||||
eq(1, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
eq(1, le.lv_refcount)
|
||||
eq(1, le2.lv_refcount)
|
||||
alloc_log:clear()
|
||||
|
||||
local rettv1 = typvalt()
|
||||
eq(OK, lib.tv_list_concat(l, le, rettv1))
|
||||
eq(1, l.lv_refcount)
|
||||
eq(2, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
eq(1, le.lv_refcount)
|
||||
eq(1, le2.lv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv1.vval.v_list),
|
||||
a.li(rettv1.vval.v_list.lv_first),
|
||||
a.li(rettv1.vval.v_list.lv_last),
|
||||
})
|
||||
eq({1, {}}, typvalt2lua(rettv1))
|
||||
|
||||
local rettv2 = typvalt()
|
||||
eq(OK, lib.tv_list_concat(le, l, rettv2))
|
||||
eq(1, l.lv_refcount)
|
||||
eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
eq(1, le.lv_refcount)
|
||||
eq(1, le2.lv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv2.vval.v_list),
|
||||
a.li(rettv2.vval.v_list.lv_first),
|
||||
a.li(rettv2.vval.v_list.lv_last),
|
||||
})
|
||||
eq({1, {}}, typvalt2lua(rettv2))
|
||||
|
||||
local rettv3 = typvalt()
|
||||
eq(OK, lib.tv_list_concat(le, le, rettv3))
|
||||
eq(1, l.lv_refcount)
|
||||
eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
eq(1, le.lv_refcount)
|
||||
eq(1, le2.lv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv3.vval.v_list),
|
||||
})
|
||||
eq({[type_key]=list_type}, typvalt2lua(rettv3))
|
||||
|
||||
local rettv4 = typvalt()
|
||||
eq(OK, lib.tv_list_concat(le, le2, rettv4))
|
||||
eq(1, l.lv_refcount)
|
||||
eq(3, l.lv_last.li_tv.vval.v_dict.dv_refcount)
|
||||
eq(1, le.lv_refcount)
|
||||
eq(1, le2.lv_refcount)
|
||||
alloc_log:check({
|
||||
a.list(rettv4.vval.v_list),
|
||||
})
|
||||
eq({[type_key]=list_type}, typvalt2lua(rettv4))
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
Loading…
Reference in New Issue
Block a user