special_vars_spec.lua (5783B)
1 local t = require('test.testutil') 2 local n = require('test.functional.testnvim')() 3 4 local exc_exec = n.exc_exec 5 local command = n.command 6 local fn = n.fn 7 local clear = n.clear 8 local eval = n.eval 9 local eq = t.eq 10 local api = n.api 11 local NIL = vim.NIL 12 13 describe('Special values', function() 14 before_each(clear) 15 16 it('do not cause error when freed', function() 17 command([[ 18 function Test() 19 try 20 return v:true 21 finally 22 return 'something else' 23 endtry 24 endfunction 25 ]]) 26 eq(0, exc_exec('call Test()')) 27 end) 28 29 it('work with empty()', function() 30 eq(0, fn.empty(true)) 31 eq(1, fn.empty(false)) 32 eq(1, fn.empty(NIL)) 33 end) 34 35 it('can be stringified and eval’ed back', function() 36 eq(true, fn.eval(fn.string(true))) 37 eq(false, fn.eval(fn.string(false))) 38 eq(NIL, fn.eval(fn.string(NIL))) 39 end) 40 41 it('work with is/isnot properly', function() 42 eq(1, eval('v:null is v:null')) 43 eq(0, eval('v:null is v:true')) 44 eq(0, eval('v:null is v:false')) 45 eq(1, eval('v:true is v:true')) 46 eq(0, eval('v:true is v:false')) 47 eq(1, eval('v:false is v:false')) 48 49 eq(0, eval('v:null is 0')) 50 eq(0, eval('v:true is 0')) 51 eq(0, eval('v:false is 0')) 52 53 eq(0, eval('v:null is 1')) 54 eq(0, eval('v:true is 1')) 55 eq(0, eval('v:false is 1')) 56 57 eq(0, eval('v:null is ""')) 58 eq(0, eval('v:true is ""')) 59 eq(0, eval('v:false is ""')) 60 61 eq(0, eval('v:null is "null"')) 62 eq(0, eval('v:true is "true"')) 63 eq(0, eval('v:false is "false"')) 64 65 eq(0, eval('v:null is []')) 66 eq(0, eval('v:true is []')) 67 eq(0, eval('v:false is []')) 68 69 eq(0, eval('v:null isnot v:null')) 70 eq(1, eval('v:null isnot v:true')) 71 eq(1, eval('v:null isnot v:false')) 72 eq(0, eval('v:true isnot v:true')) 73 eq(1, eval('v:true isnot v:false')) 74 eq(0, eval('v:false isnot v:false')) 75 76 eq(1, eval('v:null isnot 0')) 77 eq(1, eval('v:true isnot 0')) 78 eq(1, eval('v:false isnot 0')) 79 80 eq(1, eval('v:null isnot 1')) 81 eq(1, eval('v:true isnot 1')) 82 eq(1, eval('v:false isnot 1')) 83 84 eq(1, eval('v:null isnot ""')) 85 eq(1, eval('v:true isnot ""')) 86 eq(1, eval('v:false isnot ""')) 87 88 eq(1, eval('v:null isnot "null"')) 89 eq(1, eval('v:true isnot "true"')) 90 eq(1, eval('v:false isnot "false"')) 91 92 eq(1, eval('v:null isnot []')) 93 eq(1, eval('v:true isnot []')) 94 eq(1, eval('v:false isnot []')) 95 end) 96 97 it('work with +/-/* properly', function() 98 eq(1, eval('0 + v:true')) 99 eq(0, eval('0 + v:null')) 100 eq(0, eval('0 + v:false')) 101 102 eq(-1, eval('0 - v:true')) 103 eq(0, eval('0 - v:null')) 104 eq(0, eval('0 - v:false')) 105 106 eq(1, eval('1 * v:true')) 107 eq(0, eval('1 * v:null')) 108 eq(0, eval('1 * v:false')) 109 end) 110 111 it('does not work with +=/-=/.=', function() 112 api.nvim_set_var('true', true) 113 api.nvim_set_var('false', false) 114 command('let null = v:null') 115 116 eq('Vim(let):E734: Wrong variable type for +=', exc_exec('let true += 1')) 117 eq('Vim(let):E734: Wrong variable type for +=', exc_exec('let false += 1')) 118 eq('Vim(let):E734: Wrong variable type for +=', exc_exec('let null += 1')) 119 120 eq('Vim(let):E734: Wrong variable type for -=', exc_exec('let true -= 1')) 121 eq('Vim(let):E734: Wrong variable type for -=', exc_exec('let false -= 1')) 122 eq('Vim(let):E734: Wrong variable type for -=', exc_exec('let null -= 1')) 123 124 eq('Vim(let):E734: Wrong variable type for .=', exc_exec('let true .= 1')) 125 eq('Vim(let):E734: Wrong variable type for .=', exc_exec('let false .= 1')) 126 eq('Vim(let):E734: Wrong variable type for .=', exc_exec('let null .= 1')) 127 end) 128 129 it('work with . (concat) properly', function() 130 eq('v:true', eval('"" . v:true')) 131 eq('v:null', eval('"" . v:null')) 132 eq('v:false', eval('"" . v:false')) 133 end) 134 135 it('work with ?? (falsy operator)', function() 136 eq(true, eval('v:true ?? 42')) 137 eq(42, eval('v:false ?? 42')) 138 eq(42, eval('v:null ?? 42')) 139 end) 140 141 it('work with type()', function() 142 eq(6, fn.type(true)) 143 eq(6, fn.type(false)) 144 eq(7, fn.type(NIL)) 145 end) 146 147 it('work with copy() and deepcopy()', function() 148 eq(true, fn.deepcopy(true)) 149 eq(false, fn.deepcopy(false)) 150 eq(NIL, fn.deepcopy(NIL)) 151 152 eq(true, fn.copy(true)) 153 eq(false, fn.copy(false)) 154 eq(NIL, fn.copy(NIL)) 155 end) 156 157 it('fails in index', function() 158 eq('Vim(echo):E909: Cannot index a special variable', exc_exec('echo v:true[0]')) 159 eq('Vim(echo):E909: Cannot index a special variable', exc_exec('echo v:false[0]')) 160 eq('Vim(echo):E909: Cannot index a special variable', exc_exec('echo v:null[0]')) 161 end) 162 163 it('is accepted by assert_true and assert_false', function() 164 fn.assert_false(false) 165 fn.assert_false(true) 166 fn.assert_false(NIL) 167 168 fn.assert_true(false) 169 fn.assert_true(true) 170 fn.assert_true(NIL) 171 172 eq({ 173 'Expected False but got v:true', 174 'Expected False but got v:null', 175 'Expected True but got v:false', 176 'Expected True but got v:null', 177 }, api.nvim_get_vvar('errors')) 178 end) 179 180 describe('compat', function() 181 it('v:count is distinct from count', function() 182 command('let count = []') -- v:count is readonly 183 eq(1, eval('count is# g:["count"]')) 184 end) 185 it('v:errmsg is distinct from errmsg', function() 186 command('let errmsg = 1') 187 eq(1, eval('errmsg is# g:["errmsg"]')) 188 end) 189 it('v:shell_error is distinct from shell_error', function() 190 command('let shell_error = []') -- v:shell_error is readonly 191 eq(1, eval('shell_error is# g:["shell_error"]')) 192 end) 193 it('v:this_session is distinct from this_session', function() 194 command('let this_session = []') 195 eq(1, eval('this_session is# g:["this_session"]')) 196 end) 197 end) 198 end)