1077a1e67SBram Moolenaar" Test for flatting list. 26d91bcb4SBram Moolenaar 3077a1e67SBram Moolenaarfunc Test_flatten() 4077a1e67SBram Moolenaar call assert_fails('call flatten(1)', 'E686:') 5077a1e67SBram Moolenaar call assert_fails('call flatten({})', 'E686:') 6077a1e67SBram Moolenaar call assert_fails('call flatten("string")', 'E686:') 7077a1e67SBram Moolenaar call assert_fails('call flatten([], [])', 'E745:') 8077a1e67SBram Moolenaar call assert_fails('call flatten([], -1)', 'E900: maxdepth') 9077a1e67SBram Moolenaar 10077a1e67SBram Moolenaar call assert_equal([], flatten([])) 11077a1e67SBram Moolenaar call assert_equal([], flatten([[]])) 12077a1e67SBram Moolenaar call assert_equal([], flatten([[[]]])) 13077a1e67SBram Moolenaar 14077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([1, 2, 3])) 15077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1], 2, 3])) 16077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([1, [2], 3])) 17077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([1, 2, [3]])) 18077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1], [2], 3])) 19077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([1, [2], [3]])) 20077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1], 2, [3]])) 21077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1], [2], [3]])) 22077a1e67SBram Moolenaar 23077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1, 2, 3], []])) 24077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[], [1, 2, 3]])) 25077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1, 2], [], [3]])) 26077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[], [1, 2, 3], []])) 27077a1e67SBram Moolenaar call assert_equal([1, 2, 3, 4], flatten(range(1, 4))) 28077a1e67SBram Moolenaar 29077a1e67SBram Moolenaar " example in the help 30077a1e67SBram Moolenaar call assert_equal([1, 2, 3, 4, 5], flatten([1, [2, [3, 4]], 5])) 31077a1e67SBram Moolenaar call assert_equal([1, 2, [3, 4], 5], flatten([1, [2, [3, 4]], 5], 1)) 32077a1e67SBram Moolenaar 33077a1e67SBram Moolenaar call assert_equal([0, [1], 2, [3], 4], flatten([[0, [1]], 2, [[3], 4]], 1)) 34077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[[[1]]], [2], [3]], 3)) 35077a1e67SBram Moolenaar call assert_equal([[1], [2], [3]], flatten([[[1], [2], [3]]], 1)) 36077a1e67SBram Moolenaar call assert_equal([[1]], flatten([[1]], 0)) 37077a1e67SBram Moolenaar 38077a1e67SBram Moolenaar " Make it flatten if the given maxdepth is larger than actual depth. 39077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 1)) 40077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 2)) 41077a1e67SBram Moolenaar 42077a1e67SBram Moolenaar let l:list = [[1], [2], [3]] 43077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten(l:list)) 44077a1e67SBram Moolenaar call assert_equal([1, 2, 3], l:list) 45077a1e67SBram Moolenaar 46077a1e67SBram Moolenaar " Tests for checking reference counter works well. 47077a1e67SBram Moolenaar let l:x = {'foo': 'bar'} 48077a1e67SBram Moolenaar call assert_equal([1, 2, l:x, 3], flatten([1, [2, l:x], 3])) 49077a1e67SBram Moolenaar call test_garbagecollect_now() 50077a1e67SBram Moolenaar call assert_equal('bar', l:x.foo) 51077a1e67SBram Moolenaar 52077a1e67SBram Moolenaar let l:list = [[1], [2], [3]] 53077a1e67SBram Moolenaar call assert_equal([1, 2, 3], flatten(l:list)) 54077a1e67SBram Moolenaar call test_garbagecollect_now() 55077a1e67SBram Moolenaar call assert_equal([1, 2, 3], l:list) 56077a1e67SBram Moolenaar 57077a1e67SBram Moolenaar " Tests for checking circular reference list can be flatten. 58077a1e67SBram Moolenaar let l:x = [1] 59077a1e67SBram Moolenaar let l:y = [x] 60077a1e67SBram Moolenaar let l:z = flatten(l:y) 61077a1e67SBram Moolenaar call assert_equal([1], l:z) 62077a1e67SBram Moolenaar call test_garbagecollect_now() 63077a1e67SBram Moolenaar let l:x[0] = 2 64077a1e67SBram Moolenaar call assert_equal([2], l:x) 65077a1e67SBram Moolenaar call assert_equal([1], l:z) " NOTE: primitive types are copied. 66077a1e67SBram Moolenaar call assert_equal([1], l:y) 67077a1e67SBram Moolenaar 68077a1e67SBram Moolenaar let l:x = [2] 69077a1e67SBram Moolenaar let l:y = [1, [l:x], 3] " [1, [[2]], 3] 70077a1e67SBram Moolenaar let l:z = flatten(l:y, 1) 71077a1e67SBram Moolenaar call assert_equal([1, [2], 3], l:z) 72077a1e67SBram Moolenaar let l:x[0] = 9 73077a1e67SBram Moolenaar call assert_equal([1, [9], 3], l:z) " Reference to l:x is kept. 74077a1e67SBram Moolenaar call assert_equal([1, [9], 3], l:y) 75077a1e67SBram Moolenaar 76077a1e67SBram Moolenaar let l:x = [1] 77077a1e67SBram Moolenaar let l:y = [2] 78077a1e67SBram Moolenaar call add(x, y) " l:x = [1, [2]] 79077a1e67SBram Moolenaar call add(y, x) " l:y = [2, [1, [...]]] 80077a1e67SBram Moolenaar call assert_equal([1, 2, 1, 2], flatten(l:x, 2)) 81077a1e67SBram Moolenaar call assert_equal([2, l:x], l:y) 82077a1e67SBram Moolenaarendfunc 836d91bcb4SBram Moolenaar 84*3b690069SBram Moolenaarfunc Test_flattennew() 85*3b690069SBram Moolenaar let l = [1, [2, [3, 4]], 5] 86*3b690069SBram Moolenaar call assert_equal([1, 2, 3, 4, 5], flattennew(l)) 87*3b690069SBram Moolenaar call assert_equal([1, [2, [3, 4]], 5], l) 88*3b690069SBram Moolenaar 89*3b690069SBram Moolenaar call assert_equal([1, 2, [3, 4], 5], flattennew(l, 1)) 90*3b690069SBram Moolenaar call assert_equal([1, [2, [3, 4]], 5], l) 91*3b690069SBram Moolenaarendfunc 92*3b690069SBram Moolenaar 936d91bcb4SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab 94