Bram Moolenaar | 077a1e6 | 2020-06-08 20:50:43 +0200 | [diff] [blame] | 1 | " Test for flatting list. |
Bram Moolenaar | 6d91bcb | 2020-08-12 18:50:36 +0200 | [diff] [blame] | 2 | |
Bram Moolenaar | 077a1e6 | 2020-06-08 20:50:43 +0200 | [diff] [blame] | 3 | func Test_flatten() |
| 4 | call assert_fails('call flatten(1)', 'E686:') |
| 5 | call assert_fails('call flatten({})', 'E686:') |
| 6 | call assert_fails('call flatten("string")', 'E686:') |
| 7 | call assert_fails('call flatten([], [])', 'E745:') |
| 8 | call assert_fails('call flatten([], -1)', 'E900: maxdepth') |
| 9 | |
| 10 | call assert_equal([], flatten([])) |
| 11 | call assert_equal([], flatten([[]])) |
| 12 | call assert_equal([], flatten([[[]]])) |
| 13 | |
| 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 | call assert_equal([1, 2, 3], flatten([[1], [2], [3]])) |
| 22 | |
| 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], flatten([[], [1, 2, 3], []])) |
| 27 | call assert_equal([1, 2, 3, 4], flatten(range(1, 4))) |
| 28 | |
| 29 | " example in the help |
| 30 | call assert_equal([1, 2, 3, 4, 5], flatten([1, [2, [3, 4]], 5])) |
| 31 | call assert_equal([1, 2, [3, 4], 5], flatten([1, [2, [3, 4]], 5], 1)) |
| 32 | |
| 33 | call assert_equal([0, [1], 2, [3], 4], flatten([[0, [1]], 2, [[3], 4]], 1)) |
| 34 | call assert_equal([1, 2, 3], flatten([[[[1]]], [2], [3]], 3)) |
| 35 | call assert_equal([[1], [2], [3]], flatten([[[1], [2], [3]]], 1)) |
| 36 | call assert_equal([[1]], flatten([[1]], 0)) |
| 37 | |
| 38 | " Make it flatten if the given maxdepth is larger than actual depth. |
| 39 | call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 1)) |
| 40 | call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 2)) |
| 41 | |
| 42 | let l:list = [[1], [2], [3]] |
| 43 | call assert_equal([1, 2, 3], flatten(l:list)) |
| 44 | call assert_equal([1, 2, 3], l:list) |
| 45 | |
| 46 | " Tests for checking reference counter works well. |
| 47 | let l:x = {'foo': 'bar'} |
| 48 | call assert_equal([1, 2, l:x, 3], flatten([1, [2, l:x], 3])) |
| 49 | call test_garbagecollect_now() |
| 50 | call assert_equal('bar', l:x.foo) |
| 51 | |
| 52 | let l:list = [[1], [2], [3]] |
| 53 | call assert_equal([1, 2, 3], flatten(l:list)) |
| 54 | call test_garbagecollect_now() |
| 55 | call assert_equal([1, 2, 3], l:list) |
| 56 | |
Dominique Pelle | 923dce2 | 2021-11-21 11:36:04 +0000 | [diff] [blame] | 57 | " Tests for checking circular reference list can be flattened. |
Bram Moolenaar | 077a1e6 | 2020-06-08 20:50:43 +0200 | [diff] [blame] | 58 | let l:x = [1] |
| 59 | let l:y = [x] |
| 60 | let l:z = flatten(l:y) |
| 61 | call assert_equal([1], l:z) |
| 62 | call test_garbagecollect_now() |
| 63 | let l:x[0] = 2 |
| 64 | call assert_equal([2], l:x) |
| 65 | call assert_equal([1], l:z) " NOTE: primitive types are copied. |
| 66 | call assert_equal([1], l:y) |
| 67 | |
| 68 | let l:x = [2] |
| 69 | let l:y = [1, [l:x], 3] " [1, [[2]], 3] |
| 70 | let l:z = flatten(l:y, 1) |
| 71 | call assert_equal([1, [2], 3], l:z) |
| 72 | let l:x[0] = 9 |
| 73 | call assert_equal([1, [9], 3], l:z) " Reference to l:x is kept. |
| 74 | call assert_equal([1, [9], 3], l:y) |
| 75 | |
| 76 | let l:x = [1] |
| 77 | let l:y = [2] |
| 78 | call add(x, y) " l:x = [1, [2]] |
| 79 | call add(y, x) " l:y = [2, [1, [...]]] |
| 80 | call assert_equal([1, 2, 1, 2], flatten(l:x, 2)) |
| 81 | call assert_equal([2, l:x], l:y) |
Bram Moolenaar | acf7d73 | 2022-03-25 19:50:57 +0000 | [diff] [blame] | 82 | |
| 83 | let l4 = [ 1, [ 11, [ 101, [ 1001 ] ] ] ] |
| 84 | call assert_equal(l4, flatten(deepcopy(l4), 0)) |
| 85 | call assert_equal([1, 11, [101, [1001]]], flatten(deepcopy(l4), 1)) |
| 86 | call assert_equal([1, 11, 101, [1001]], flatten(deepcopy(l4), 2)) |
| 87 | call assert_equal([1, 11, 101, 1001], flatten(deepcopy(l4), 3)) |
| 88 | call assert_equal([1, 11, 101, 1001], flatten(deepcopy(l4), 4)) |
| 89 | call assert_equal([1, 11, 101, 1001], flatten(deepcopy(l4))) |
Bram Moolenaar | 077a1e6 | 2020-06-08 20:50:43 +0200 | [diff] [blame] | 90 | endfunc |
Bram Moolenaar | 6d91bcb | 2020-08-12 18:50:36 +0200 | [diff] [blame] | 91 | |
Bram Moolenaar | 3b69006 | 2021-02-01 20:14:51 +0100 | [diff] [blame] | 92 | func Test_flattennew() |
| 93 | let l = [1, [2, [3, 4]], 5] |
| 94 | call assert_equal([1, 2, 3, 4, 5], flattennew(l)) |
| 95 | call assert_equal([1, [2, [3, 4]], 5], l) |
| 96 | |
| 97 | call assert_equal([1, 2, [3, 4], 5], flattennew(l, 1)) |
| 98 | call assert_equal([1, [2, [3, 4]], 5], l) |
Bram Moolenaar | acf7d73 | 2022-03-25 19:50:57 +0000 | [diff] [blame] | 99 | |
| 100 | let l4 = [ 1, [ 11, [ 101, [ 1001 ] ] ] ] |
| 101 | call assert_equal(l4, flatten(deepcopy(l4), 0)) |
| 102 | call assert_equal([1, 11, [101, [1001]]], flattennew(l4, 1)) |
| 103 | call assert_equal([1, 11, 101, [1001]], flattennew(l4, 2)) |
| 104 | call assert_equal([1, 11, 101, 1001], flattennew(l4, 3)) |
| 105 | call assert_equal([1, 11, 101, 1001], flattennew(l4, 4)) |
| 106 | call assert_equal([1, 11, 101, 1001], flattennew(l4)) |
Bram Moolenaar | 3b69006 | 2021-02-01 20:14:51 +0100 | [diff] [blame] | 107 | endfunc |
| 108 | |
Bram Moolenaar | 6d91bcb | 2020-08-12 18:50:36 +0200 | [diff] [blame] | 109 | " vim: shiftwidth=2 sts=2 expandtab |