view src/testdir/test_flatten.vim @ 27970:212c5894b8b1 v8.2.4510

patch 8.2.4510: Vim9: shortening commands leads to confusing script Commit: https://github.com/vim/vim/commit/204852ae2adfdde10c656ca7f14e5b4207a69172 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 5 12:56:44 2022 +0000 patch 8.2.4510: Vim9: shortening commands leads to confusing script Problem: Vim9: shortening commands leads to confusing script. Solution: In Vim9 script require at least ":cont" for ":continue", "const" instead of "cons", "break" instead of "brea", "catch" instead of "cat", "else" instead of "el" "elseif" instead of "elsei" "endfor" instead of "endfo" "endif" instead of "en" "endtry" instead of "endt", "finally" instead of "fina", "throw" instead of "th", "while" instead of "wh".
author Bram Moolenaar <Bram@vim.org>
date Sat, 05 Mar 2022 14:00:03 +0100
parents 485c7c4afeb7
children 18319c0c36f9
line wrap: on
line source

" Test for flatting list.

func Test_flatten()
  call assert_fails('call flatten(1)', 'E686:')
  call assert_fails('call flatten({})', 'E686:')
  call assert_fails('call flatten("string")', 'E686:')
  call assert_fails('call flatten([], [])', 'E745:')
  call assert_fails('call flatten([], -1)', 'E900: maxdepth')

  call assert_equal([], flatten([]))
  call assert_equal([], flatten([[]]))
  call assert_equal([], flatten([[[]]]))

  call assert_equal([1, 2, 3], flatten([1, 2, 3]))
  call assert_equal([1, 2, 3], flatten([[1], 2, 3]))
  call assert_equal([1, 2, 3], flatten([1, [2], 3]))
  call assert_equal([1, 2, 3], flatten([1, 2, [3]]))
  call assert_equal([1, 2, 3], flatten([[1], [2], 3]))
  call assert_equal([1, 2, 3], flatten([1, [2], [3]]))
  call assert_equal([1, 2, 3], flatten([[1], 2, [3]]))
  call assert_equal([1, 2, 3], flatten([[1], [2], [3]]))

  call assert_equal([1, 2, 3], flatten([[1, 2, 3], []]))
  call assert_equal([1, 2, 3], flatten([[], [1, 2, 3]]))
  call assert_equal([1, 2, 3], flatten([[1, 2], [], [3]]))
  call assert_equal([1, 2, 3], flatten([[], [1, 2, 3], []]))
  call assert_equal([1, 2, 3, 4], flatten(range(1, 4)))

  " example in the help
  call assert_equal([1, 2, 3, 4, 5], flatten([1, [2, [3, 4]], 5]))
  call assert_equal([1, 2, [3, 4], 5], flatten([1, [2, [3, 4]], 5], 1))

  call assert_equal([0, [1], 2, [3], 4], flatten([[0, [1]], 2, [[3], 4]], 1))
  call assert_equal([1, 2, 3], flatten([[[[1]]], [2], [3]], 3))
  call assert_equal([[1], [2], [3]], flatten([[[1], [2], [3]]], 1))
  call assert_equal([[1]], flatten([[1]], 0))

  " Make it flatten if the given maxdepth is larger than actual depth.
  call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 1))
  call assert_equal([1, 2, 3], flatten([[1, 2, 3]], 2))

  let l:list = [[1], [2], [3]]
  call assert_equal([1, 2, 3], flatten(l:list))
  call assert_equal([1, 2, 3], l:list)

  " Tests for checking reference counter works well.
  let l:x = {'foo': 'bar'}
  call assert_equal([1, 2, l:x, 3], flatten([1, [2, l:x], 3]))
  call test_garbagecollect_now()
  call assert_equal('bar', l:x.foo)

  let l:list = [[1], [2], [3]]
  call assert_equal([1, 2, 3], flatten(l:list))
  call test_garbagecollect_now()
  call assert_equal([1, 2, 3], l:list)

  " Tests for checking circular reference list can be flattened.
  let l:x = [1]
  let l:y = [x]
  let l:z = flatten(l:y)
  call assert_equal([1], l:z)
  call test_garbagecollect_now()
  let l:x[0] = 2
  call assert_equal([2], l:x)
  call assert_equal([1], l:z) " NOTE: primitive types are copied.
  call assert_equal([1], l:y)

  let l:x = [2]
  let l:y = [1, [l:x], 3] " [1, [[2]], 3]
  let l:z = flatten(l:y, 1)
  call assert_equal([1, [2], 3], l:z)
  let l:x[0] = 9
  call assert_equal([1, [9], 3], l:z) " Reference to l:x is kept.
  call assert_equal([1, [9], 3], l:y)

  let l:x = [1]
  let l:y = [2]
  call add(x, y) " l:x = [1, [2]]
  call add(y, x) " l:y = [2, [1, [...]]]
  call assert_equal([1, 2, 1, 2], flatten(l:x, 2))
  call assert_equal([2, l:x], l:y)
endfunc

func Test_flattennew()
  let l = [1, [2, [3, 4]], 5]
  call assert_equal([1, 2, 3, 4, 5], flattennew(l))
  call assert_equal([1, [2, [3, 4]], 5], l)

  call assert_equal([1, 2, [3, 4], 5], flattennew(l, 1))
  call assert_equal([1, [2, [3, 4]], 5], l)
endfunc

" vim: shiftwidth=2 sts=2 expandtab