Bram Moolenaar | 077a1e6 | 2020-06-08 20:50:43 +0200 | [diff] [blame] | 1 | " Test for flatting list. |
| 2 | func Test_flatten() |
| 3 | call assert_fails('call flatten(1)', 'E686:') |
| 4 | call assert_fails('call flatten({})', 'E686:') |
| 5 | call assert_fails('call flatten("string")', 'E686:') |
| 6 | call assert_fails('call flatten([], [])', 'E745:') |
| 7 | call assert_fails('call flatten([], -1)', 'E900: maxdepth') |
| 8 | |
| 9 | call assert_equal([], flatten([])) |
| 10 | call assert_equal([], flatten([[]])) |
| 11 | call assert_equal([], flatten([[[]]])) |
| 12 | |
| 13 | call assert_equal([1, 2, 3], flatten([1, 2, 3])) |
| 14 | call assert_equal([1, 2, 3], flatten([[1], 2, 3])) |
| 15 | call assert_equal([1, 2, 3], flatten([1, [2], 3])) |
| 16 | call assert_equal([1, 2, 3], flatten([1, 2, [3]])) |
| 17 | call assert_equal([1, 2, 3], flatten([[1], [2], 3])) |
| 18 | call assert_equal([1, 2, 3], flatten([1, [2], [3]])) |
| 19 | call assert_equal([1, 2, 3], flatten([[1], 2, [3]])) |
| 20 | call assert_equal([1, 2, 3], flatten([[1], [2], [3]])) |
| 21 | |
| 22 | call assert_equal([1, 2, 3], flatten([[1, 2, 3], []])) |
| 23 | call assert_equal([1, 2, 3], flatten([[], [1, 2, 3]])) |
| 24 | call assert_equal([1, 2, 3], flatten([[1, 2], [], [3]])) |
| 25 | call assert_equal([1, 2, 3], flatten([[], [1, 2, 3], []])) |
| 26 | call assert_equal([1, 2, 3, 4], flatten(range(1, 4))) |
| 27 | |
| 28 | " example in the help |
| 29 | call assert_equal([1, 2, 3, 4, 5], flatten([1, [2, [3, 4]], 5])) |
| 30 | call assert_equal([1, 2, [3, 4], 5], flatten([1, [2, [3, 4]], 5], 1)) |
| 31 | |
| 32 | call assert_equal([0, [1], 2, [3], 4], flatten([[0, [1]], 2, [[3], 4]], 1)) |
| 33 | call assert_equal([1, 2, 3], flatten([[[[1]]], [2], [3]], 3)) |
| 34 | call assert_equal([[1], [2], [3]], flatten([[[1], [2], [3]]], 1)) |
| 35 | call assert_equal([[1]], flatten([[1]], 0)) |
| 36 | |
| 37 | " Make it flatten if the given maxdepth is larger than actual depth. |
| 38 | call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 1)) |
| 39 | call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 2)) |
| 40 | |
| 41 | let l:list = [[1], [2], [3]] |
| 42 | call assert_equal([1, 2, 3], flatten(l:list)) |
| 43 | call assert_equal([1, 2, 3], l:list) |
| 44 | |
| 45 | " Tests for checking reference counter works well. |
| 46 | let l:x = {'foo': 'bar'} |
| 47 | call assert_equal([1, 2, l:x, 3], flatten([1, [2, l:x], 3])) |
| 48 | call test_garbagecollect_now() |
| 49 | call assert_equal('bar', l:x.foo) |
| 50 | |
| 51 | let l:list = [[1], [2], [3]] |
| 52 | call assert_equal([1, 2, 3], flatten(l:list)) |
| 53 | call test_garbagecollect_now() |
| 54 | call assert_equal([1, 2, 3], l:list) |
| 55 | |
| 56 | " Tests for checking circular reference list can be flatten. |
| 57 | let l:x = [1] |
| 58 | let l:y = [x] |
| 59 | let l:z = flatten(l:y) |
| 60 | call assert_equal([1], l:z) |
| 61 | call test_garbagecollect_now() |
| 62 | let l:x[0] = 2 |
| 63 | call assert_equal([2], l:x) |
| 64 | call assert_equal([1], l:z) " NOTE: primitive types are copied. |
| 65 | call assert_equal([1], l:y) |
| 66 | |
| 67 | let l:x = [2] |
| 68 | let l:y = [1, [l:x], 3] " [1, [[2]], 3] |
| 69 | let l:z = flatten(l:y, 1) |
| 70 | call assert_equal([1, [2], 3], l:z) |
| 71 | let l:x[0] = 9 |
| 72 | call assert_equal([1, [9], 3], l:z) " Reference to l:x is kept. |
| 73 | call assert_equal([1, [9], 3], l:y) |
| 74 | |
| 75 | let l:x = [1] |
| 76 | let l:y = [2] |
| 77 | call add(x, y) " l:x = [1, [2]] |
| 78 | call add(y, x) " l:y = [2, [1, [...]]] |
| 79 | call assert_equal([1, 2, 1, 2], flatten(l:x, 2)) |
| 80 | call assert_equal([2, l:x], l:y) |
| 81 | endfunc |