1" Test behavior of boolean-like values.
2
3" Test what is explained at ":help TRUE" and ":help FALSE".
4func Test_if()
5  if v:false
6    call assert_true(false, 'v:false is false')
7  endif
8  if 0
9    call assert_true(false, 'zero is false')
10  endif
11  if "0"
12    call assert_true(false, 'zero string is false')
13  endif
14  if "foo"
15    call assert_true(false, 'foo is false')
16  endif
17  if " "
18    call assert_true(false, 'space is false')
19  endif
20  if empty("foo")
21    call assert_true(false, 'foo is not empty')
22  endif
23
24  if v:true
25  else
26    call assert_true(false, 'v:true is true')
27  endif
28  if 1
29  else
30    call assert_true(false, 'one is true')
31  endif
32  if "1"
33  else
34    call assert_true(false, 'one string is true')
35  endif
36  if "1foo"
37  else
38    call assert_true(false, 'one in string is true')
39  endif
40
41  call assert_fails('if [1]', 'E745')
42  call assert_fails('if {1: 1}', 'E728')
43  call assert_fails('if function("string")', 'E703')
44  call assert_fails('if 1.3")', 'E805')
45endfunc
46
47function Try_arg_true_false(expr, false_val, true_val)
48  for v in ['v:false', '0', '"0"', '"foo"', '" "']
49    let r = eval(substitute(a:expr, '%v%', v, ''))
50    call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . string(a:false_val) . ' but ' . string(r))
51  endfor
52  for v in ['v:true', '1', '"1"', '"1foo"']
53    let r = eval(substitute(a:expr, '%v%', v, ''))
54    call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . string(a:true_val) . ' but ' . string(r))
55  endfor
56endfunc
57
58" Test using TRUE or FALSE values for an argument.
59func Test_true_false_arg()
60  call Try_arg_true_false('count(["a", "A"], "a", %v%)', 1, 2)
61
62  set wildignore=*.swp
63  call Try_arg_true_false('expand("foo.swp", %v%)', "", "foo.swp")
64  call Try_arg_true_false('expand("foo.vim", 0, %v%)', "foo.vim", ["foo.vim"])
65
66  call setreg('a', ['x', 'y'])
67  call Try_arg_true_false('getreg("a", 1, %v%)', "x\ny\n", ['x', 'y'])
68
69  set wildignore=*.vim
70  call Try_arg_true_false('glob("runtest.vim", %v%)', "", "runtest.vim")
71  set wildignore=*.swp
72  call Try_arg_true_false('glob("runtest.vim", 0, %v%)', "runtest.vim", ["runtest.vim"])
73  if has('unix')
74    silent !ln -s doesntexit Xlink
75    call Try_arg_true_false('glob("Xlink", 0, 0, %v%)', "", "Xlink")
76    silent !rm Xlink
77  endif
78
79  set wildignore=*.vim
80  call Try_arg_true_false('globpath(".", "runtest.vim", %v%)', "", "./runtest.vim")
81  set wildignore=*.swp
82  call Try_arg_true_false('globpath(".", "runtest.vim", 0, %v%)', "./runtest.vim", ["./runtest.vim"])
83  if has('unix')
84    silent !ln -s doesntexit Xlink
85    call Try_arg_true_false('globpath(".", "Xlink", 0, 0, %v%)', "", "./Xlink")
86    silent !rm Xlink
87  endif
88
89  abbr asdf asdff
90  call Try_arg_true_false('hasmapto("asdff", "i", %v%)', 0, 1)
91
92  call Try_arg_true_false('index(["a", "A"], "A", 0, %v%)', 1, 0)
93
94  function FilterMapArg(d)
95    if type(a:d) == type({})
96      return filter(a:d, 'v:key == "rhs"')
97    endif
98    return a:d
99  endfunction
100  call Try_arg_true_false('maparg("asdf", "i", %v%)', "", "asdff")
101  call Try_arg_true_false('FilterMapArg(maparg("asdf", "i", 1, %v%))', "asdff", {'rhs': 'asdff'})
102
103  call Try_arg_true_false('hasmapto("asdf", "i", %v%)', 0, 1)
104
105  new colored
106  call setline(1, '<here>')
107  syn match brackets "<.*>"
108  syn match here "here" transparent
109  let brackets_id = synID(1, 1, 0)
110  let here_id = synID(1, 3, 0)
111  call Try_arg_true_false('synID(1, 3, %v%)', here_id, brackets_id)
112  bwipe!
113endfunc
114
115function Try_arg_non_zero(expr, false_val, true_val)
116  for v in ['v:false', '0', '[1]', '{2:3}', '3.4']
117    let r = eval(substitute(a:expr, '%v%', v, ''))
118    call assert_equal(a:false_val, r, 'result for ' . v . ' is not ' . a:false_val . ' but ' . r)
119  endfor
120  for v in ['v:true', '1', '" "', '"0"']
121    let r = eval(substitute(a:expr, '%v%', v, ''))
122    call assert_equal(a:true_val, r, 'result for ' . v . ' is not ' . a:true_val . ' but ' . r)
123  endfor
124endfunc
125
126
127" Test using non-zero-arg for an argument.
128func Test_non_zero_arg()
129  call test_settime(93784)
130  call Try_arg_non_zero("mode(%v%)", 'x', 'x!')
131  call test_settime(0)
132
133  call Try_arg_non_zero("shellescape('foo%', %v%)", "'foo%'", "'foo\\%'")
134
135  " visualmode() needs to be called twice to check
136  for v in [v:false, 0, [1], {2:3}, 3.4]
137    normal vv
138    let r = visualmode(v)
139    call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
140    let r = visualmode(v)
141    call assert_equal('v', r, 'result for ' . string(v) . ' is not "v" but ' . r)
142  endfor
143  for v in [v:true, 1, " ", "0"]
144    normal vv
145    let r = visualmode(v)
146    call assert_equal('v', r, 'result for ' . v . ' is not "v" but ' . r)
147    let r = visualmode(v)
148    call assert_equal('', r, 'result for ' . v . ' is not "" but ' . r)
149  endfor
150endfunc
151