aboutsummaryrefslogtreecommitdiff
path: root/test/functional/ex_cmds/echo_spec.lua
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-07-04 02:22:26 +0300
committerZyX <kp-pav@yandex.ru>2017-07-04 02:22:26 +0300
commitd113d3d737641d7668361b2e08cea53411308146 (patch)
tree169b375b79d69f94e66195e04b5be0d04f531cd9 /test/functional/ex_cmds/echo_spec.lua
parente07e46f53921aa75bc826290098491e4b5622448 (diff)
downloadrneovim-d113d3d737641d7668361b2e08cea53411308146.tar.gz
rneovim-d113d3d737641d7668361b2e08cea53411308146.tar.bz2
rneovim-d113d3d737641d7668361b2e08cea53411308146.zip
functests: Make ex_cmds/echo actually use :echo
Diffstat (limited to 'test/functional/ex_cmds/echo_spec.lua')
-rw-r--r--test/functional/ex_cmds/echo_spec.lua187
1 files changed, 97 insertions, 90 deletions
diff --git a/test/functional/ex_cmds/echo_spec.lua b/test/functional/ex_cmds/echo_spec.lua
index adc1af9b8e..06436fb87e 100644
--- a/test/functional/ex_cmds/echo_spec.lua
+++ b/test/functional/ex_cmds/echo_spec.lua
@@ -1,105 +1,113 @@
local helpers = require('test.functional.helpers')(after_each)
-local clear = helpers.clear
+
local eq = helpers.eq
-local command = helpers.command
-local meths = helpers.meths
+local NIL = helpers.NIL
local eval = helpers.eval
-local exc_exec = helpers.exc_exec
-local redir_exec = helpers.redir_exec
+local clear = helpers.clear
+local meths = helpers.meths
local funcs = helpers.funcs
-local NIL = helpers.NIL
local source = helpers.source
local dedent = helpers.dedent
+local command = helpers.command
+local exc_exec = helpers.exc_exec
+local redir_exec = helpers.redir_exec
-describe('string() function', function()
- before_each(clear)
+describe(':echo', function()
+ before_each(function()
+ clear()
+ source([[
+ function String(s)
+ return execute('echo a:s')[1:]
+ endfunction
+ ]])
+ end)
describe('used to represent floating-point values', function()
it('dumps NaN values', function()
- eq('str2float(\'nan\')', eval('string(str2float(\'nan\'))'))
+ eq('str2float(\'nan\')', eval('String(str2float(\'nan\'))'))
end)
it('dumps infinite values', function()
- eq('str2float(\'inf\')', eval('string(str2float(\'inf\'))'))
- eq('-str2float(\'inf\')', eval('string(str2float(\'-inf\'))'))
+ eq('str2float(\'inf\')', eval('String(str2float(\'inf\'))'))
+ eq('-str2float(\'inf\')', eval('String(str2float(\'-inf\'))'))
end)
it('dumps regular values', function()
- eq('1.5', funcs.string(1.5))
- eq('1.56e-20', funcs.string(1.56000e-020))
- eq('0.0', eval('string(0.0)'))
+ eq('1.5', funcs.String(1.5))
+ eq('1.56e-20', funcs.String(1.56000e-020))
+ eq('0.0', eval('String(0.0)'))
end)
it('dumps special v: values', function()
- eq('v:true', eval('string(v:true)'))
- eq('v:false', eval('string(v:false)'))
- eq('v:null', eval('string(v:null)'))
- eq('v:true', funcs.string(true))
- eq('v:false', funcs.string(false))
- eq('v:null', funcs.string(NIL))
+ eq('v:true', eval('String(v:true)'))
+ eq('v:false', eval('String(v:false)'))
+ eq('v:null', eval('String(v:null)'))
+ eq('v:true', funcs.String(true))
+ eq('v:false', funcs.String(false))
+ eq('v:null', funcs.String(NIL))
end)
it('dumps values with at most six digits after the decimal point',
function()
- eq('1.234568e-20', funcs.string(1.23456789123456789123456789e-020))
- eq('1.234568', funcs.string(1.23456789123456789123456789))
+ eq('1.234568e-20', funcs.String(1.23456789123456789123456789e-020))
+ eq('1.234568', funcs.String(1.23456789123456789123456789))
end)
it('dumps values with at most seven digits before the decimal point',
function()
- eq('1234567.891235', funcs.string(1234567.89123456789123456789))
- eq('1.234568e7', funcs.string(12345678.9123456789123456789))
+ eq('1234567.891235', funcs.String(1234567.89123456789123456789))
+ eq('1.234568e7', funcs.String(12345678.9123456789123456789))
end)
it('dumps negative values', function()
- eq('-1.5', funcs.string(-1.5))
- eq('-1.56e-20', funcs.string(-1.56000e-020))
- eq('-1.234568e-20', funcs.string(-1.23456789123456789123456789e-020))
- eq('-1.234568', funcs.string(-1.23456789123456789123456789))
- eq('-1234567.891235', funcs.string(-1234567.89123456789123456789))
- eq('-1.234568e7', funcs.string(-12345678.9123456789123456789))
+ eq('-1.5', funcs.String(-1.5))
+ eq('-1.56e-20', funcs.String(-1.56000e-020))
+ eq('-1.234568e-20', funcs.String(-1.23456789123456789123456789e-020))
+ eq('-1.234568', funcs.String(-1.23456789123456789123456789))
+ eq('-1234567.891235', funcs.String(-1234567.89123456789123456789))
+ eq('-1.234568e7', funcs.String(-12345678.9123456789123456789))
end)
end)
describe('used to represent numbers', function()
it('dumps regular values', function()
- eq('0', funcs.string(0))
- eq('-1', funcs.string(-1))
- eq('1', funcs.string(1))
+ eq('0', funcs.String(0))
+ eq('-1', funcs.String(-1))
+ eq('1', funcs.String(1))
end)
it('dumps large values', function()
- eq('2147483647', funcs.string(2^31-1))
- eq('-2147483648', funcs.string(-2^31))
+ eq('2147483647', funcs.String(2^31-1))
+ eq('-2147483648', funcs.String(-2^31))
end)
end)
describe('used to represent strings', function()
it('dumps regular strings', function()
- eq('\'test\'', funcs.string('test'))
+ eq('test', funcs.String('test'))
end)
it('dumps empty strings', function()
- eq('\'\'', funcs.string(''))
+ eq('', funcs.String(''))
end)
it('dumps strings with \' inside', function()
- eq('\'\'\'\'\'\'\'\'', funcs.string('\'\'\''))
- eq('\'a\'\'b\'\'\'\'\'', funcs.string('a\'b\'\''))
- eq('\'\'\'b\'\'\'\'d\'', funcs.string('\'b\'\'d'))
- eq('\'a\'\'b\'\'c\'\'d\'', funcs.string('a\'b\'c\'d'))
+ eq('\'\'\'', funcs.String('\'\'\''))
+ eq('a\'b\'\'', funcs.String('a\'b\'\''))
+ eq('\'b\'\'d', funcs.String('\'b\'\'d'))
+ eq('a\'b\'c\'d', funcs.String('a\'b\'c\'d'))
end)
it('dumps NULL strings', function()
- eq('\'\'', eval('string($XXX_UNEXISTENT_VAR_XXX)'))
+ eq('', eval('String($XXX_UNEXISTENT_VAR_XXX)'))
end)
it('dumps NULL lists', function()
- eq('[]', eval('string(v:_null_list)'))
+ eq('[]', eval('String(v:_null_list)'))
end)
it('dumps NULL dictionaries', function()
- eq('{}', eval('string(v:_null_dict)'))
+ eq('{}', eval('String(v:_null_dict)'))
end)
end)
@@ -120,16 +128,16 @@ describe('string() function', function()
end)
it('dumps references to built-in functions', function()
- eq('function(\'function\')', eval('string(function("function"))'))
+ eq('function', eval('String(function("function"))'))
end)
it('dumps references to user functions', function()
- eq('function(\'Test1\')', eval('string(function("Test1"))'))
- eq('function(\'g:Test3\')', eval('string(function("g:Test3"))'))
+ eq('Test1', eval('String(function("Test1"))'))
+ eq('g:Test3', eval('String(function("g:Test3"))'))
end)
it('dumps references to script functions', function()
- eq('function(\'<SNR>1_Test2\')', eval('string(Test2_f)'))
+ eq('<SNR>1_Test2', eval('String(Test2_f)'))
end)
it('dumps partials with self referencing a partial', function()
@@ -140,24 +148,27 @@ describe('string() function', function()
let TestDictRef = function('TestDict', d)
let d.tdr = TestDictRef
]])
- eq("\nE724: unable to correctly dump variable with self-referencing container\nfunction('TestDict', {'tdr': function('TestDict', {E724@1})})",
- redir_exec('echo string(d.tdr)'))
+ eq(dedent([[
+
+ function('TestDict', {'tdr': function('TestDict', {...@1})})
+ function('TestDict', {'tdr': function('TestDict', {...@1})})]]),
+ redir_exec('echo String(d.tdr)'))
end)
it('dumps automatically created partials', function()
eq('function(\'<SNR>1_Test2\', {\'f\': function(\'<SNR>1_Test2\')})',
- eval('string({"f": Test2_f}.f)'))
+ eval('String({"f": Test2_f}.f)'))
eq('function(\'<SNR>1_Test2\', [1], {\'f\': function(\'<SNR>1_Test2\', [1])})',
- eval('string({"f": function(Test2_f, [1])}.f)'))
+ eval('String({"f": function(Test2_f, [1])}.f)'))
end)
it('dumps manually created partials', function()
eq('function(\'Test3\', [1, 2], {})',
- eval('string(function("Test3", [1, 2], {}))'))
+ eval('String(function("Test3", [1, 2], {}))'))
eq('function(\'Test3\', {})',
- eval('string(function("Test3", {}))'))
+ eval('String(function("Test3", {}))'))
eq('function(\'Test3\', [1, 2])',
- eval('string(function("Test3", [1, 2]))'))
+ eval('String(function("Test3", [1, 2]))'))
end)
it('does not crash or halt when dumping partials with reference cycles in self',
@@ -165,9 +176,9 @@ describe('string() function', function()
meths.set_var('d', {v=true})
eq(dedent([[
- E724: unable to correctly dump variable with self-referencing container
- {'p': function('<SNR>1_Test2', {E724@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}]]),
- redir_exec('echo string(extend(extend(g:d, {"f": g:Test2_f}), {"p": g:d.f}))'))
+ {'p': function('<SNR>1_Test2', {...@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}
+ {'p': function('<SNR>1_Test2', {...@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}]]),
+ redir_exec('echo String(extend(extend(g:d, {"f": g:Test2_f}), {"p": g:d.f}))'))
end)
it('does not show errors when dumping partials referencing the same dictionary',
@@ -175,11 +186,11 @@ describe('string() function', function()
command('let d = {}')
-- Regression for “eval/typval_encode: Dump empty dictionary before
-- checking for refcycle”, results in error.
- eq('[function(\'tr\', {}), function(\'tr\', {})]', eval('string([function("tr", d), function("tr", d)])'))
+ eq('[function(\'tr\', {}), function(\'tr\', {})]', eval('String([function("tr", d), function("tr", d)])'))
-- Regression for “eval: Work with reference cycles in partials (self)
-- properly”, results in crash.
eval('extend(d, {"a": 1})')
- eq('[function(\'tr\', {\'a\': 1}), function(\'tr\', {\'a\': 1})]', eval('string([function("tr", d), function("tr", d)])'))
+ eq('[function(\'tr\', {\'a\': 1}), function(\'tr\', {\'a\': 1})]', eval('String([function("tr", d), function("tr", d)])'))
end)
it('does not crash or halt when dumping partials with reference cycles in arguments',
@@ -192,9 +203,9 @@ describe('string() function', function()
eval('add(l, function("Test1", l))')
eq(dedent([=[
- E724: unable to correctly dump variable with self-referencing container
- function('Test1', [[{E724@2}, function('Test1', [{E724@2}])], function('Test1', [[{E724@4}, function('Test1', [{E724@4}])]])])]=]),
- redir_exec('echo string(function("Test1", l))'))
+ function('Test1', [[[...@2], function('Test1', [[...@2]])], function('Test1', [[[...@4], function('Test1', [[...@4]])]])])
+ function('Test1', [[[...@2], function('Test1', [[...@2]])], function('Test1', [[[...@4], function('Test1', [[...@4]])]])])]=]),
+ redir_exec('echo String(function("Test1", l))'))
end)
it('does not crash or halt when dumping partials with reference cycles in self and arguments',
@@ -206,72 +217,68 @@ describe('string() function', function()
eval('add(l, function("Test1", d))')
eq(dedent([=[
- E724: unable to correctly dump variable with self-referencing container
- {'p': function('<SNR>1_Test2', [[{E724@3}, function('Test1', [{E724@3}]), function('Test1', {E724@0})], function('Test1', [[{E724@5}, function('Test1', [{E724@5}]), function('Test1', {E724@0})]]), function('Test1', {E724@0})], {E724@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}]=]),
- redir_exec('echo string(extend(extend(g:d, {"f": g:Test2_f}), {"p": function(g:d.f, l)}))'))
+ {'p': function('<SNR>1_Test2', [[[...@3], function('Test1', [[...@3]]), function('Test1', {...@0})], function('Test1', [[[...@5], function('Test1', [[...@5]]), function('Test1', {...@0})]]), function('Test1', {...@0})], {...@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}
+ {'p': function('<SNR>1_Test2', [[[...@3], function('Test1', [[...@3]]), function('Test1', {...@0})], function('Test1', [[[...@5], function('Test1', [[...@5]]), function('Test1', {...@0})]]), function('Test1', {...@0})], {...@0}), 'f': function('<SNR>1_Test2'), 'v': v:true}]=]),
+ redir_exec('echo String(extend(extend(g:d, {"f": g:Test2_f}), {"p": function(g:d.f, l)}))'))
end)
end)
describe('used to represent lists', function()
it('dumps empty list', function()
- eq('[]', funcs.string({}))
+ eq('[]', funcs.String({}))
end)
it('dumps nested lists', function()
- eq('[[[[[]]]]]', funcs.string({{{{{}}}}}))
+ eq('[[[[[]]]]]', funcs.String({{{{{}}}}}))
end)
it('dumps nested non-empty lists', function()
- eq('[1, [[3, [[5], 4]], 2]]', funcs.string({1, {{3, {{5}, 4}}, 2}}))
+ eq('[1, [[3, [[5], 4]], 2]]', funcs.String({1, {{3, {{5}, 4}}, 2}}))
end)
- it('errors when dumping recursive lists', function()
+ it('does not error when dumping recursive lists', function()
meths.set_var('l', {})
eval('add(l, l)')
- eq('Vim(echo):E724: unable to correctly dump variable with self-referencing container',
- exc_exec('echo string(l)'))
+ eq(0, exc_exec('echo String(l)'))
end)
- it('dumps recursive lists despite the error', function()
+ it('dumps recursive lists without error', function()
meths.set_var('l', {})
eval('add(l, l)')
- eq('\nE724: unable to correctly dump variable with self-referencing container\n[{E724@0}]',
- redir_exec('echo string(l)'))
- eq('\nE724: unable to correctly dump variable with self-referencing container\n[[{E724@1}]]',
- redir_exec('echo string([l])'))
+ eq('\n[[...@0]]\n[[...@0]]', redir_exec('echo String(l)'))
+ eq('\n[[[...@1]]]\n[[[...@1]]]', redir_exec('echo String([l])'))
end)
end)
describe('used to represent dictionaries', function()
it('dumps empty dictionary', function()
- eq('{}', eval('string({})'))
+ eq('{}', eval('String({})'))
end)
it('dumps list with two same empty dictionaries, also in partials', function()
command('let d = {}')
- eq('[{}, {}]', eval('string([d, d])'))
- eq('[function(\'tr\', {}), {}]', eval('string([function("tr", d), d])'))
- eq('[{}, function(\'tr\', {})]', eval('string([d, function("tr", d)])'))
+ eq('[{}, {}]', eval('String([d, d])'))
+ eq('[function(\'tr\', {}), {}]', eval('String([function("tr", d), d])'))
+ eq('[{}, function(\'tr\', {})]', eval('String([d, function("tr", d)])'))
end)
it('dumps non-empty dictionary', function()
- eq('{\'t\'\'est\': 1}', funcs.string({['t\'est']=1}))
+ eq('{\'t\'\'est\': 1}', funcs.String({['t\'est']=1}))
end)
- it('errors when dumping recursive dictionaries', function()
+ it('does not error when dumping recursive dictionaries', function()
meths.set_var('d', {d=1})
eval('extend(d, {"d": d})')
- eq('Vim(echo):E724: unable to correctly dump variable with self-referencing container',
- exc_exec('echo string(d)'))
+ eq(0, exc_exec('echo String(d)'))
end)
- it('dumps recursive dictionaries despite the error', function()
+ it('dumps recursive dictionaries without the error', function()
meths.set_var('d', {d=1})
eval('extend(d, {"d": d})')
- eq('\nE724: unable to correctly dump variable with self-referencing container\n{\'d\': {E724@0}}',
- redir_exec('echo string(d)'))
- eq('\nE724: unable to correctly dump variable with self-referencing container\n{\'out\': {\'d\': {E724@1}}}',
- redir_exec('echo string({"out": d})'))
+ eq('\n{\'d\': {...@0}}\n{\'d\': {...@0}}',
+ redir_exec('echo String(d)'))
+ eq('\n{\'out\': {\'d\': {...@1}}}\n{\'out\': {\'d\': {...@1}}}',
+ redir_exec('echo String({"out": d})'))
end)
end)
end)