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