" Test behavior of boolean-like values.

" Test what is explained at ":help TRUE" and ":help FALSE".
func Test_if()
  if v:false
    call assert_true(false, 'v:false is false')
  endif
  if 0
    call assert_true(false, 'zero is false')
  endif
  if "0"
    call assert_true(false, 'zero string is false')
  endif
  if "foo"
    call assert_true(false, 'foo is false')
  endif
  if " "
    call assert_true(false, 'space is false')
  endif
  if empty("foo")
    call assert_true(false, 'foo is not empty')
  endif

  if v:true
  else
    call assert_true(false, 'v:true is true')
  endif
  if 1
  else
    call assert_true(false, 'one is true')
  endif
  if "1"
  else
    call assert_true(false, 'one string is true')
  endif
  if "1foo"
  else
    call assert_true(false, 'one in string is true')
  endif

  call assert_fails('if [1]', 'E745')
  call assert_fails('if {1: 1}', 'E728')
  call assert_fails('if function("string")', 'E703')
  call assert_fails('if 1.3")', 'E805')
endfunc

function Try_arg_true_false(expr, false_val, true_val)
  for v in ['v:false', '0', '"0"', '"foo"', '" "'] 
    let r = eval(substitute(a:expr, '%v%', v, ''))
    call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . string(a:false_val) . ' but ' . string(r))
  endfor
  for v in ['v:true', '1', '"1"', '"1foo"'] 
    let r = eval(substitute(a:expr, '%v%', v, ''))
    call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . string(a:true_val) . ' but ' . string(r))
  endfor
endfunc

" Test using TRUE or FALSE values for an argument.
func Test_true_false_arg()
  call Try_arg_true_false('count(["a", "A"], "a", %v%)', 1, 2)

  set wildignore=*.swp
  call Try_arg_true_false('expand("foo.swp", %v%)', "", "foo.swp")
  call Try_arg_true_false('expand("foo.vim", 0, %v%)', "foo.vim", ["foo.vim"])

  call setreg('a', ['x', 'y'])
  call Try_arg_true_false('getreg("a", 1, %v%)', "x\ny\n", ['x', 'y'])

  set wildignore=*.vim
  call Try_arg_true_false('glob("runtest.vim", %v%)', "", "runtest.vim")
  set wildignore=*.swp
  call Try_arg_true_false('glob("runtest.vim", 0, %v%)', "runtest.vim", ["runtest.vim"])
  if has('unix')
    silent !ln -s doesntexit Xlink
    call Try_arg_true_false('glob("Xlink", 0, 0, %v%)', "", "Xlink")
    silent !rm Xlink
  endif

  set wildignore=*.vim
  call Try_arg_true_false('globpath(".", "runtest.vim", %v%)', "", "./runtest.vim")
  set wildignore=*.swp
  call Try_arg_true_false('globpath(".", "runtest.vim", 0, %v%)', "./runtest.vim", ["./runtest.vim"])
  if has('unix')
    silent !ln -s doesntexit Xlink
    call Try_arg_true_false('globpath(".", "Xlink", 0, 0, %v%)', "", "./Xlink")
    silent !rm Xlink
  endif

  abbr asdf asdff
  call Try_arg_true_false('hasmapto("asdff", "i", %v%)', 0, 1)

  call Try_arg_true_false('index(["a", "A"], "A", 0, %v%)', 1, 0)

  function FilterMapArg(d)
    if type(a:d) == type({})
      return filter(a:d, 'v:key == "rhs"')
    endif
    return a:d
  endfunction
  call Try_arg_true_false('maparg("asdf", "i", %v%)', "", "asdff")
  call Try_arg_true_false('FilterMapArg(maparg("asdf", "i", 1, %v%))', "asdff", {'rhs': 'asdff'})

  call Try_arg_true_false('hasmapto("asdf", "i", %v%)', 0, 1)

  new colored
  call setline(1, '<here>')
  syn match brackets "<.*>"
  syn match here "here" transparent
  let brackets_id = synID(1, 1, 0)
  let here_id = synID(1, 3, 0)
  call Try_arg_true_false('synID(1, 3, %v%)', here_id, brackets_id)
  bwipe!
endfunc

function Try_arg_non_zero(expr, false_val, true_val)
  for v in ['v:false', '0', '[1]', '{2:3}', '3.4'] 
    let r = eval(substitute(a:expr, '%v%', v, ''))
    call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . a:false_val . ' but ' . r)
  endfor
  for v in ['v:true', '1', '" "', '"0"'] 
    let r = eval(substitute(a:expr, '%v%', v, ''))
    call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . a:true_val . ' but ' . r)
  endfor
endfunc


" Test using non-zero-arg for an argument.
func Test_non_zero_arg()
  call test_settime(93784)
  call Try_arg_non_zero("mode(%v%)", 'x', 'x!')
  call test_settime(0)

  call Try_arg_non_zero("shellescape('foo%', %v%)", "'foo%'", "'foo\\%'")

  " visualmode() needs to be called twice to check
  for v in [v:false, 0, [1], {2:3}, 3.4] 
    normal vv
    let r = visualmode(v)
    call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
    let r = visualmode(v)
    call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
  endfor
  for v in [v:true, 1, " ", "0"] 
    normal vv
    let r = visualmode(v)
    call assert_equal('v', r, 'result for ' . v . ' is not "v" but ' . r)
    let r = visualmode(v)
    call assert_equal('', r, 'result for ' . v . ' is not "" but ' . r)
  endfor
endfunc
