neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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)