diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-12-13 16:10:08 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-12-13 16:10:08 +1100 |
| commit | 64b106c13e18c33be0f2b0de532054e0ed3f731d (patch) | |
| tree | b54b1c90d941bc456b4d51e864970720bdf2d648 /lib/lua-repl/t/plugin-around-tests.lua | |
| parent | 5a2f0b08e0e3f20cda977b510b680d5843ae7283 (diff) | |
| download | tangara-fw-64b106c13e18c33be0f2b0de532054e0ed3f731d.tar.gz | |
add a cool lua repl
Diffstat (limited to 'lib/lua-repl/t/plugin-around-tests.lua')
| -rw-r--r-- | lib/lua-repl/t/plugin-around-tests.lua | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/lib/lua-repl/t/plugin-around-tests.lua b/lib/lua-repl/t/plugin-around-tests.lua new file mode 100644 index 00000000..df0ea073 --- /dev/null +++ b/lib/lua-repl/t/plugin-around-tests.lua @@ -0,0 +1,218 @@ +-- vim:foldmethod=marker +local repl = require 'repl' +local compat = require 'repl.compat' +pcall(require, 'luarocks.loader') +require 'Test.More' +local utils = require 'test-utils' + +plan(27) + +local clone = repl:clone() + +do -- basic tests {{{ + local with_plugin = clone:clone() + + local has_called_normal + local has_called_around + + function with_plugin:foo() + has_called_normal = true + end + + with_plugin:loadplugin(function() + function around:foo(orig, ...) + has_called_around = true + ok(not has_called_normal) + local return_values = utils.gather_results(orig(self, ...)) + ok(has_called_normal) + return compat.unpack(return_values, 1, return_values.n) + end + end) + + with_plugin:foo() + ok(has_called_normal) + ok(has_called_around) + + local line_no + + local _, err = pcall(function() + with_plugin:loadplugin(function() + line_no = utils.next_line_number() + function around: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() + around.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 around:foo(orig, ...) + got_args = { + n = select('#', ...), + ..., + } + + return orig(self, ...) + end + end) + + with_plugin:foo() + is(got_args.n, 0) + utils.cmp_tables(orig_args, got_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) + utils.cmp_tables(orig_args, got_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) + utils.cmp_tables(orig_args, got_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 around: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 around:foo() + return 18 + end + + function around:bar() + return 19, 20, 21 + end + + function around: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 around:foo(orig) + calls[#calls + 1] = 'before_one' + orig() + calls[#calls + 1] = 'after_one' + end + end) + + with_plugin:loadplugin(function() + function around:foo(orig) + calls[#calls + 1] = 'before_two' + orig() + calls[#calls + 1] = 'after_two' + end + end) + + with_plugin:foo() + + utils.cmp_tables(calls, { 'before_two', 'before_one', 'original', + 'after_one', 'after_two' }) +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 around:foo(orig) + calls[#calls + 1] = 'before_one' + orig() + calls[#calls + 1] = 'after_one' + end + + function around:foo(orig) + calls[#calls + 1] = 'before_two' + orig() + calls[#calls + 1] = 'after_two' + end + end) + + with_plugin:foo() + + utils.cmp_tables(calls, { 'before_two', 'before_one', 'original', + 'after_one', 'after_two' }) +end -- }}} |
