diff options
Diffstat (limited to 'lib/lua-repl/t/plugin-override-tests.lua')
| -rw-r--r-- | lib/lua-repl/t/plugin-override-tests.lua | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/lib/lua-repl/t/plugin-override-tests.lua b/lib/lua-repl/t/plugin-override-tests.lua new file mode 100644 index 00000000..6ea11d8b --- /dev/null +++ b/lib/lua-repl/t/plugin-override-tests.lua @@ -0,0 +1,201 @@ +-- vim:foldmethod=marker +local repl = require 'repl' +pcall(require, 'luarocks.loader') +require 'Test.More' +local utils = require 'test-utils' + +plan(25) + +local clone = repl:clone() + +do -- basic tests {{{ + local with_plugin = clone:clone() + + local has_called_normal + local has_called_override + + function with_plugin:foo() + has_called_normal = true + end + + with_plugin:loadplugin(function() + function override:foo() + has_called_override = true + end + end) + + with_plugin:foo() + ok(not has_called_normal) + ok(has_called_override) + + local line_no + + local _, err = pcall(function() + with_plugin:loadplugin(function() + line_no = utils.next_line_number() + function override:nonexistent() + end + end) + end) + + like(err, string.format("%d: The 'nonexistent' method does not exist", line_no)) + + _, err = pcall(function() + with_plugin:loadplugin(function() + line_no = utils.next_line_number() + override.foo = 17 + end) + end) + + like(err, string.format('%d: 17 is not a function', line_no)) +end -- }}} + +do -- arguments tests {{{ + local with_plugin = clone:clone() + local orig_args + local got_args + + function with_plugin:foo(...) + orig_args = { + n = select('#', ...), + ..., + } + end + + with_plugin:loadplugin(function() + function override:foo(...) + got_args = { + n = select('#', ...), + ..., + } + end + end) + + with_plugin:foo() + is(got_args.n, 0) + ok(not orig_args) + + with_plugin:foo(1, 2, 3) + is(got_args.n, 3) + is(got_args[1], 1) + is(got_args[2], 2) + is(got_args[3], 3) + ok(not orig_args) + + with_plugin:foo(1, nil, nil, nil, 5) + is(got_args.n, 5) + is(got_args[1], 1) + is(got_args[2], nil) + is(got_args[3], nil) + is(got_args[4], nil) + is(got_args[5], 5) + ok(not orig_args) +end -- }}} + +do -- exception tests {{{ + local with_plugin = clone:clone() + + local has_called_original + + function with_plugin:foo() + has_called_original = true + end + + with_plugin:loadplugin(function() + function override:foo() + error 'uh-oh' + end + end) + + local _, err = pcall(with_plugin.foo, with_plugin) + + like(err, 'uh%-oh') + ok(not has_called_original) +end -- }}} + +do -- return value tests {{{ + local with_plugin = clone:clone() + + function with_plugin:foo() + return 17 + end + + function with_plugin:bar() + return 18, 19, 20 + end + + function with_plugin:baz() + return 1, nil, nil, nil, 5 + end + + with_plugin:loadplugin(function() + function override:foo() + return 18 + end + + function override:bar() + return 19, 20, 21 + end + + function override:baz() + return 1, nil, nil, 4 + end + end) + + local result = with_plugin:foo() + is(result, 18) + + local results = utils.gather_results(with_plugin:bar()) + utils.cmp_tables(results, { n = 3, 19, 20, 21 }) + + results = utils.gather_results(with_plugin:baz()) + utils.cmp_tables(results, { n = 4, 1, nil, nil, 4 }) +end -- }}} + +do -- multiple advice, multiple plugins {{{ + local with_plugin = clone:clone() + local calls = {} + + function with_plugin:foo() + calls[#calls + 1] = 'original' + end + + with_plugin:loadplugin(function() + function override:foo() + calls[#calls + 1] = 'first' + end + end) + + with_plugin:loadplugin(function() + function override:foo() + calls[#calls + 1] = 'second' + end + end) + + with_plugin:foo() + + utils.cmp_tables(calls, { 'second' }) +end + +do -- multiple advice, single plugin {{{ + local with_plugin = clone:clone() + local calls = {} + + function with_plugin:foo() + calls[#calls + 1] = 'original' + end + + with_plugin:loadplugin(function() + function override:foo() + calls[#calls + 1] = 'first' + end + + function override:foo() + calls[#calls + 1] = 'second' + end + end) + + with_plugin:foo() + + utils.cmp_tables(calls, { 'second' }) +end |
