neovim

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

func_memoize_spec.lua (3085B)


      1 local t = require('test.testutil')
      2 local n = require('test.functional.testnvim')()
      3 local clear = n.clear
      4 local exec_lua = n.exec_lua
      5 local eq = t.eq
      6 
      7 describe('vim.func._memoize', function()
      8  before_each(clear)
      9 
     10  it('caches function results based on their parameters', function()
     11    exec_lua([[
     12      _G.count = 0
     13 
     14      local adder = vim.func._memoize('concat', function(arg1, arg2)
     15        _G.count = _G.count + 1
     16        return arg1 + arg2
     17      end)
     18 
     19      collectgarbage('stop')
     20      adder(3, -4)
     21      adder(3, -4)
     22      adder(3, -4)
     23      adder(3, -4)
     24      adder(3, -4)
     25      collectgarbage('restart')
     26    ]])
     27 
     28    eq(1, exec_lua([[return _G.count]]))
     29  end)
     30 
     31  it('caches function results using a weak table by default', function()
     32    exec_lua([[
     33      _G.count = 0
     34 
     35      local adder = vim.func._memoize('concat-2', function(arg1, arg2)
     36        _G.count = _G.count + 1
     37        return arg1 + arg2
     38      end)
     39 
     40      adder(3, -4)
     41      collectgarbage()
     42      adder(3, -4)
     43      collectgarbage()
     44      adder(3, -4)
     45    ]])
     46 
     47    eq(3, exec_lua([[return _G.count]]))
     48  end)
     49 
     50  it('can cache using a strong table', function()
     51    exec_lua([[
     52      _G.count = 0
     53 
     54      local adder = vim.func._memoize('concat-2', function(arg1, arg2)
     55        _G.count = _G.count + 1
     56        return arg1 + arg2
     57      end, false)
     58 
     59      adder(3, -4)
     60      collectgarbage()
     61      adder(3, -4)
     62      collectgarbage()
     63      adder(3, -4)
     64    ]])
     65 
     66    eq(1, exec_lua([[return _G.count]]))
     67  end)
     68 
     69  it('can clear a single cache entry', function()
     70    exec_lua([[
     71      _G.count = 0
     72 
     73      local adder = vim.func._memoize(function(arg1, arg2)
     74        return tostring(arg1) .. '%%' .. tostring(arg2)
     75      end, function(arg1, arg2)
     76        _G.count = _G.count + 1
     77        return arg1 + arg2
     78      end)
     79 
     80      collectgarbage('stop')
     81      adder(3, -4)
     82      adder(3, -4)
     83      adder(3, -4)
     84      adder(3, -4)
     85      adder(3, -4)
     86      adder:clear(3, -4)
     87      adder(3, -4)
     88      collectgarbage('restart')
     89    ]])
     90 
     91    eq(2, exec_lua([[return _G.count]]))
     92  end)
     93 
     94  it('can clear the entire cache', function()
     95    exec_lua([[
     96      _G.count = 0
     97 
     98      local adder = vim.func._memoize(function(arg1, arg2)
     99        return tostring(arg1) .. '%%' .. tostring(arg2)
    100      end, function(arg1, arg2)
    101        _G.count = _G.count + 1
    102        return arg1 + arg2
    103      end)
    104 
    105      collectgarbage('stop')
    106      adder(1, 2)
    107      adder(3, -4)
    108      adder(1, 2)
    109      adder(3, -4)
    110      adder(1, 2)
    111      adder(3, -4)
    112      adder:clear()
    113      adder(1, 2)
    114      adder(3, -4)
    115      collectgarbage('restart')
    116    ]])
    117 
    118    eq(4, exec_lua([[return _G.count]]))
    119  end)
    120 
    121  it('can cache functions that return nil', function()
    122    exec_lua([[
    123      _G.count = 0
    124 
    125      local adder = vim.func._memoize('concat', function(arg1, arg2)
    126        _G.count = _G.count + 1
    127        return nil
    128      end)
    129 
    130      collectgarbage('stop')
    131      adder(1, 2)
    132      adder(1, 2)
    133      adder(1, 2)
    134      adder(1, 2)
    135      adder:clear()
    136      adder(1, 2)
    137      collectgarbage('restart')
    138    ]])
    139 
    140    eq(2, exec_lua([[return _G.count]]))
    141  end)
    142 end)