mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06: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;
|
int todo = l2->lv_len;
|
||||||
// We also quit the loop when we have inserted the original item count of
|
// 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.
|
// 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 != NULL && --todo >= 0
|
||||||
; item = item->li_next) {
|
; item = item->li_next) {
|
||||||
tv_list_insert_tv(l1, &item->li_tv, bef);
|
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 a = eval_helpers.alloc_logging_helpers
|
||||||
local list = eval_helpers.list
|
local list = eval_helpers.list
|
||||||
local lst2tbl = eval_helpers.lst2tbl
|
local lst2tbl = eval_helpers.lst2tbl
|
||||||
|
local typvalt = eval_helpers.typvalt
|
||||||
local type_key = eval_helpers.type_key
|
local type_key = eval_helpers.type_key
|
||||||
local li_alloc = eval_helpers.li_alloc
|
local li_alloc = eval_helpers.li_alloc
|
||||||
local int_type = eval_helpers.int_type
|
local int_type = eval_helpers.int_type
|
||||||
@ -747,5 +748,146 @@ describe('typval.c', function()
|
|||||||
eq(1, l_copy1.lv_refcount)
|
eq(1, l_copy1.lv_refcount)
|
||||||
end)
|
end)
|
||||||
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)
|
||||||
end)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user