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)