aboutsummaryrefslogtreecommitdiff
path: root/test/functional/lua/iter_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/lua/iter_spec.lua')
-rw-r--r--test/functional/lua/iter_spec.lua289
1 files changed, 214 insertions, 75 deletions
diff --git a/test/functional/lua/iter_spec.lua b/test/functional/lua/iter_spec.lua
index ffa28e7b11..8d6cf1264b 100644
--- a/test/functional/lua/iter_spec.lua
+++ b/test/functional/lua/iter_spec.lua
@@ -6,11 +6,11 @@ local pcall_err = helpers.pcall_err
describe('vim.iter', function()
it('new() on iterable class instance', function()
local rb = vim.ringbuf(3)
- rb:push("a")
- rb:push("b")
+ rb:push('a')
+ rb:push('b')
local it = vim.iter(rb)
- eq({"a", "b"}, it:totable())
+ eq({ 'a', 'b' }, it:totable())
end)
it('filter()', function()
@@ -20,18 +20,43 @@ describe('vim.iter', function()
local t = { 1, 2, 3, 4, 5 }
eq({ 1, 3, 5 }, vim.iter(t):filter(odd):totable())
- eq({ 2, 4 }, vim.iter(t):filter(function(v) return not odd(v) end):totable())
- eq({}, vim.iter(t):filter(function(v) return v > 5 end):totable())
+ eq(
+ { 2, 4 },
+ vim
+ .iter(t)
+ :filter(function(v)
+ return not odd(v)
+ end)
+ :totable()
+ )
+ eq(
+ {},
+ vim
+ .iter(t)
+ :filter(function(v)
+ return v > 5
+ end)
+ :totable()
+ )
do
local it = vim.iter(ipairs(t))
- it:filter(function(i, v) return i > 1 and v < 5 end)
- it:map(function(_, v) return v * 2 end)
+ it:filter(function(i, v)
+ return i > 1 and v < 5
+ end)
+ it:map(function(_, v)
+ return v * 2
+ end)
eq({ 4, 6, 8 }, it:totable())
end
local it = vim.iter(string.gmatch('the quick brown fox', '%w+'))
- eq({'the', 'fox'}, it:filter(function(s) return #s <= 3 end):totable())
+ eq(
+ { 'the', 'fox' },
+ it:filter(function(s)
+ return #s <= 3
+ end):totable()
+ )
end)
it('map()', function()
@@ -39,11 +64,11 @@ describe('vim.iter', function()
eq(
{ 2, 4, 6, 8, 10 },
vim
- .iter(t)
- :map(function(v)
- return 2 * v
- end)
- :totable()
+ .iter(t)
+ :map(function(v)
+ return 2 * v
+ end)
+ :totable()
)
local it = vim.gsplit(
@@ -59,21 +84,25 @@ describe('vim.iter', function()
eq(
{ 'Lion 2', 'Lion 4' },
vim
- .iter(it)
- :map(function(s)
- local lnum = s:match('(%d+)')
- if lnum and tonumber(lnum) % 2 == 0 then
- return vim.trim(s:gsub('Line', 'Lion'))
- end
- end)
- :totable()
+ .iter(it)
+ :map(function(s)
+ local lnum = s:match('(%d+)')
+ if lnum and tonumber(lnum) % 2 == 0 then
+ return vim.trim(s:gsub('Line', 'Lion'))
+ end
+ end)
+ :totable()
)
end)
it('for loops', function()
- local t = {1, 2, 3, 4, 5}
+ local t = { 1, 2, 3, 4, 5 }
local acc = 0
- for v in vim.iter(t):map(function(v) return v * 3 end) do
+ for v in
+ vim.iter(t):map(function(v)
+ return v * 3
+ end)
+ do
acc = acc + v
end
eq(45, acc)
@@ -81,18 +110,27 @@ describe('vim.iter', function()
it('totable()', function()
do
- local it = vim.iter({1, 2, 3}):map(function(v) return v, v*v end)
- eq({{1, 1}, {2, 4}, {3, 9}}, it:totable())
+ local it = vim.iter({ 1, 2, 3 }):map(function(v)
+ return v, v * v
+ end)
+ eq({ { 1, 1 }, { 2, 4 }, { 3, 9 } }, it:totable())
end
do
local it = vim.iter(string.gmatch('1,4,lol,17,blah,2,9,3', '%d+')):map(tonumber)
- eq({1, 4, 17, 2, 9, 3}, it:totable())
+ eq({ 1, 4, 17, 2, 9, 3 }, it:totable())
end
end)
+ it('join()', function()
+ eq('1, 2, 3', vim.iter({ 1, 2, 3 }):join(', '))
+ eq('a|b|c|d', vim.iter(vim.gsplit('a|b|c|d', '|')):join('|'))
+ end)
+
it('next()', function()
- local it = vim.iter({1, 2, 3}):map(function(v) return 2 * v end)
+ local it = vim.iter({ 1, 2, 3 }):map(function(v)
+ return 2 * v
+ end)
eq(2, it:next())
eq(4, it:next())
eq(6, it:next())
@@ -100,19 +138,19 @@ describe('vim.iter', function()
end)
it('rev()', function()
- eq({3, 2, 1}, vim.iter({1, 2, 3}):rev():totable())
+ eq({ 3, 2, 1 }, vim.iter({ 1, 2, 3 }):rev():totable())
- local it = vim.iter(string.gmatch("abc", "%w"))
+ local it = vim.iter(string.gmatch('abc', '%w'))
matches('rev%(%) requires a list%-like table', pcall_err(it.rev, it))
end)
it('skip()', function()
do
- local t = {4, 3, 2, 1}
+ local t = { 4, 3, 2, 1 }
eq(t, vim.iter(t):skip(0):totable())
- eq({3, 2, 1}, vim.iter(t):skip(1):totable())
- eq({2, 1}, vim.iter(t):skip(2):totable())
- eq({1}, vim.iter(t):skip(#t - 1):totable())
+ eq({ 3, 2, 1 }, vim.iter(t):skip(1):totable())
+ eq({ 2, 1 }, vim.iter(t):skip(2):totable())
+ eq({ 1 }, vim.iter(t):skip(#t - 1):totable())
eq({}, vim.iter(t):skip(#t):totable())
eq({}, vim.iter(t):skip(#t + 1):totable())
end
@@ -121,10 +159,10 @@ describe('vim.iter', function()
local function skip(n)
return vim.iter(vim.gsplit('a|b|c|d', '|')):skip(n):totable()
end
- eq({'a', 'b', 'c', 'd'}, skip(0))
- eq({'b', 'c', 'd'}, skip(1))
- eq({'c', 'd'}, skip(2))
- eq({'d'}, skip(3))
+ eq({ 'a', 'b', 'c', 'd' }, skip(0))
+ eq({ 'b', 'c', 'd' }, skip(1))
+ eq({ 'c', 'd' }, skip(2))
+ eq({ 'd' }, skip(3))
eq({}, skip(4))
eq({}, skip(5))
end
@@ -132,11 +170,11 @@ describe('vim.iter', function()
it('skipback()', function()
do
- local t = {4, 3, 2, 1}
+ local t = { 4, 3, 2, 1 }
eq(t, vim.iter(t):skipback(0):totable())
- eq({4, 3, 2}, vim.iter(t):skipback(1):totable())
- eq({4, 3}, vim.iter(t):skipback(2):totable())
- eq({4}, vim.iter(t):skipback(#t - 1):totable())
+ eq({ 4, 3, 2 }, vim.iter(t):skipback(1):totable())
+ eq({ 4, 3 }, vim.iter(t):skipback(2):totable())
+ eq({ 4 }, vim.iter(t):skipback(#t - 1):totable())
eq({}, vim.iter(t):skipback(#t):totable())
eq({}, vim.iter(t):skipback(#t + 1):totable())
end
@@ -146,14 +184,14 @@ describe('vim.iter', function()
end)
it('slice()', function()
- local t = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- eq({3, 4, 5, 6, 7}, vim.iter(t):slice(3, 7):totable())
+ local t = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }
+ eq({ 3, 4, 5, 6, 7 }, vim.iter(t):slice(3, 7):totable())
eq({}, vim.iter(t):slice(6, 5):totable())
eq({}, vim.iter(t):slice(0, 0):totable())
- eq({1}, vim.iter(t):slice(1, 1):totable())
- eq({1, 2}, vim.iter(t):slice(1, 2):totable())
- eq({10}, vim.iter(t):slice(10, 10):totable())
- eq({8, 9, 10}, vim.iter(t):slice(8, 11):totable())
+ eq({ 1 }, vim.iter(t):slice(1, 1):totable())
+ eq({ 1, 2 }, vim.iter(t):slice(1, 2):totable())
+ eq({ 10 }, vim.iter(t):slice(10, 10):totable())
+ eq({ 8, 9, 10 }, vim.iter(t):slice(8, 11):totable())
local it = vim.iter(vim.gsplit('a|b|c|d', '|'))
matches('slice%(%) requires a list%-like table', pcall_err(it.slice, it, 1, 3))
@@ -161,7 +199,7 @@ describe('vim.iter', function()
it('nth()', function()
do
- local t = {4, 3, 2, 1}
+ local t = { 4, 3, 2, 1 }
eq(nil, vim.iter(t):nth(0))
eq(4, vim.iter(t):nth(1))
eq(3, vim.iter(t):nth(2))
@@ -185,7 +223,7 @@ describe('vim.iter', function()
it('nthback()', function()
do
- local t = {4, 3, 2, 1}
+ local t = { 4, 3, 2, 1 }
eq(nil, vim.iter(t):nthback(0))
eq(1, vim.iter(t):nthback(1))
eq(2, vim.iter(t):nthback(2))
@@ -198,6 +236,33 @@ describe('vim.iter', function()
matches('skipback%(%) requires a list%-like table', pcall_err(it.nthback, it, 1))
end)
+ it('take()', function()
+ do
+ local t = { 4, 3, 2, 1 }
+ eq({}, vim.iter(t):take(0):totable())
+ eq({ 4 }, vim.iter(t):take(1):totable())
+ eq({ 4, 3 }, vim.iter(t):take(2):totable())
+ eq({ 4, 3, 2 }, vim.iter(t):take(3):totable())
+ eq({ 4, 3, 2, 1 }, vim.iter(t):take(4):totable())
+ eq({ 4, 3, 2, 1 }, vim.iter(t):take(5):totable())
+ end
+
+ do
+ local t = { 4, 3, 2, 1 }
+ local it = vim.iter(t)
+ eq({ 4, 3 }, it:take(2):totable())
+ -- tail is already set from the previous take()
+ eq({ 4, 3 }, it:take(3):totable())
+ end
+
+ do
+ local it = vim.iter(vim.gsplit('a|b|c|d', '|'))
+ eq({ 'a', 'b' }, it:take(2):totable())
+ -- non-array iterators are consumed by take()
+ eq({}, it:take(2):totable())
+ end
+ end)
+
it('any()', function()
local function odd(v)
return v % 2 ~= 0
@@ -214,8 +279,18 @@ describe('vim.iter', function()
end
do
- eq(true, vim.iter(vim.gsplit('a|b|c|d', '|')):any(function(s) return s == 'd' end))
- eq(false, vim.iter(vim.gsplit('a|b|c|d', '|')):any(function(s) return s == 'e' end))
+ eq(
+ true,
+ vim.iter(vim.gsplit('a|b|c|d', '|')):any(function(s)
+ return s == 'd'
+ end)
+ )
+ eq(
+ false,
+ vim.iter(vim.gsplit('a|b|c|d', '|')):any(function(s)
+ return s == 'e'
+ end)
+ )
end
end)
@@ -235,8 +310,18 @@ describe('vim.iter', function()
end
do
- eq(true, vim.iter(vim.gsplit('a|a|a|a', '|')):all(function(s) return s == 'a' end))
- eq(false, vim.iter(vim.gsplit('a|a|a|b', '|')):all(function(s) return s == 'a' end))
+ eq(
+ true,
+ vim.iter(vim.gsplit('a|a|a|a', '|')):all(function(s)
+ return s == 'a'
+ end)
+ )
+ eq(
+ false,
+ vim.iter(vim.gsplit('a|a|a|b', '|')):all(function(s)
+ return s == 'a'
+ end)
+ )
end
end)
@@ -248,10 +333,10 @@ describe('vim.iter', function()
it('enumerate()', function()
local it = vim.iter(vim.gsplit('abc', '')):enumerate()
- eq({1, 'a'}, {it:next()})
- eq({2, 'b'}, {it:next()})
- eq({3, 'c'}, {it:next()})
- eq({}, {it:next()})
+ eq({ 1, 'a' }, { it:next() })
+ eq({ 2, 'b' }, { it:next() })
+ eq({ 3, 'c' }, { it:next() })
+ eq({}, { it:next() })
end)
it('peek()', function()
@@ -269,14 +354,21 @@ describe('vim.iter', function()
end)
it('find()', function()
- local t = {3, 6, 9, 12}
+ local t = { 3, 6, 9, 12 }
eq(12, vim.iter(t):find(12))
eq(nil, vim.iter(t):find(15))
- eq(12, vim.iter(t):find(function(v) return v % 4 == 0 end))
+ eq(
+ 12,
+ vim.iter(t):find(function(v)
+ return v % 4 == 0
+ end)
+ )
do
local it = vim.iter(t)
- local pred = function(v) return v % 3 == 0 end
+ local pred = function(v)
+ return v % 3 == 0
+ end
eq(3, it:find(pred))
eq(6, it:find(pred))
eq(9, it:find(pred))
@@ -286,7 +378,9 @@ describe('vim.iter', function()
do
local it = vim.iter(vim.gsplit('AbCdE', ''))
- local pred = function(s) return s:match('[A-Z]') end
+ local pred = function(s)
+ return s:match('[A-Z]')
+ end
eq('A', it:find(pred))
eq('C', it:find(pred))
eq('E', it:find(pred))
@@ -295,7 +389,7 @@ describe('vim.iter', function()
end)
it('rfind()', function()
- local t = {1, 2, 3, 2, 1}
+ local t = { 1, 2, 3, 2, 1 }
do
local it = vim.iter(t)
eq(1, it:rfind(1))
@@ -305,10 +399,12 @@ describe('vim.iter', function()
do
local it = vim.iter(t):enumerate()
- local pred = function(i) return i % 2 ~= 0 end
- eq({5, 1}, {it:rfind(pred)})
- eq({3, 3}, {it:rfind(pred)})
- eq({1, 1}, {it:rfind(pred)})
+ local pred = function(i)
+ return i % 2 ~= 0
+ end
+ eq({ 5, 1 }, { it:rfind(pred) })
+ eq({ 3, 3 }, { it:rfind(pred) })
+ eq({ 1, 1 }, { it:rfind(pred) })
eq(nil, it:rfind(pred))
end
@@ -350,12 +446,52 @@ describe('vim.iter', function()
end)
it('fold()', function()
- local t = {1, 2, 3, 4, 5}
- eq(115, vim.iter(t):fold(100, function(acc, v) return acc + v end))
- eq({5, 4, 3, 2, 1}, vim.iter(t):fold({}, function(acc, v)
- table.insert(acc, 1, v)
- return acc
- end))
+ local t = { 1, 2, 3, 4, 5 }
+ eq(
+ 115,
+ vim.iter(t):fold(100, function(acc, v)
+ return acc + v
+ end)
+ )
+ eq(
+ { 5, 4, 3, 2, 1 },
+ vim.iter(t):fold({}, function(acc, v)
+ table.insert(acc, 1, v)
+ return acc
+ end)
+ )
+ end)
+
+ it('flatten()', function()
+ local t = { { 1, { 2 } }, { { { { 3 } } }, { 4 } }, { 5 } }
+
+ eq(t, vim.iter(t):flatten(-1):totable())
+ eq(t, vim.iter(t):flatten(0):totable())
+ eq({ 1, { 2 }, { { { 3 } } }, { 4 }, 5 }, vim.iter(t):flatten():totable())
+ eq({ 1, 2, { { 3 } }, 4, 5 }, vim.iter(t):flatten(2):totable())
+ eq({ 1, 2, { 3 }, 4, 5 }, vim.iter(t):flatten(3):totable())
+ eq({ 1, 2, 3, 4, 5 }, vim.iter(t):flatten(4):totable())
+
+ local m = { a = 1, b = { 2, 3 }, d = { 4 } }
+ local it = vim.iter(m)
+
+ local flat_err = 'flatten%(%) requires a list%-like table'
+ matches(flat_err, pcall_err(it.flatten, it))
+
+ -- cases from the documentation
+ local simple_example = { 1, { 2 }, { { 3 } } }
+ eq({ 1, 2, { 3 } }, vim.iter(simple_example):flatten():totable())
+
+ local not_list_like = vim.iter({ [2] = 2 })
+ matches(flat_err, pcall_err(not_list_like.flatten, not_list_like))
+
+ local also_not_list_like = vim.iter({ nil, 2 })
+ matches(flat_err, pcall_err(not_list_like.flatten, also_not_list_like))
+
+ local nested_non_lists = vim.iter({ 1, { { a = 2 } }, { { nil } }, { 3 } })
+ eq({ 1, { a = 2 }, { nil }, 3 }, nested_non_lists:flatten():totable())
+ -- only error if we're going deep enough to flatten a dict-like table
+ matches(flat_err, pcall_err(nested_non_lists.flatten, nested_non_lists, math.huge))
end)
it('handles map-like tables', function()
@@ -385,9 +521,12 @@ describe('vim.iter', function()
},
}
- local output = vim.iter(map):map(function(key, value)
- return { [key] = value.file }
- end):totable()
+ local output = vim
+ .iter(map)
+ :map(function(key, value)
+ return { [key] = value.file }
+ end)
+ :totable()
table.sort(output, function(a, b)
return next(a) < next(b)