aboutsummaryrefslogtreecommitdiff
path: root/test/functional/eval/json_functions_spec.lua
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2016-02-03 21:01:21 +0300
committerZyX <kp-pav@yandex.ru>2016-04-18 02:45:49 +0300
commitea82270d30eef2dd716cd158d989f96fbd503ba6 (patch)
tree83bb4014b6db7ffb955efe6228473e80c2d72e55 /test/functional/eval/json_functions_spec.lua
parentcddd7d47c325ab0c06c21fd101efe4a9a1708fca (diff)
downloadrneovim-ea82270d30eef2dd716cd158d989f96fbd503ba6.tar.gz
rneovim-ea82270d30eef2dd716cd158d989f96fbd503ba6.tar.bz2
rneovim-ea82270d30eef2dd716cd158d989f96fbd503ba6.zip
eval/decode: Fail on control and invalid unicode characters
Diffstat (limited to 'test/functional/eval/json_functions_spec.lua')
-rw-r--r--test/functional/eval/json_functions_spec.lua61
1 files changed, 61 insertions, 0 deletions
diff --git a/test/functional/eval/json_functions_spec.lua b/test/functional/eval/json_functions_spec.lua
index f979a6dd7c..9167cb2fef 100644
--- a/test/functional/eval/json_functions_spec.lua
+++ b/test/functional/eval/json_functions_spec.lua
@@ -235,6 +235,67 @@ describe('jsondecode() function', function()
eq('', funcs.jsondecode('""'))
eq('\\/"\t\b\n\r\f', funcs.jsondecode([["\\\/\"\t\b\n\r\f"]]))
eq('/a', funcs.jsondecode([["\/a"]]))
+ -- Unicode characters: 2-byte, 3-byte, 4-byte
+ eq({
+ '«',
+ 'ફ',
+ '\xF0\x90\x80\x80',
+ }, funcs.jsondecode({
+ '[',
+ '"«",',
+ '"ફ",',
+ '"\xF0\x90\x80\x80"',
+ ']',
+ }))
+ end)
+
+ it('fails on strings with invalid bytes', function()
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \255"',
+ exc_exec('call jsondecode("\\t\\"\\xFF\\"")'))
+ eq('Vim(call):E474: ASCII control characters cannot be present inside string: ',
+ exc_exec('call jsondecode(["\\"\\n\\""])'))
+ -- 0xC2 starts 2-byte unicode character
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \194"',
+ exc_exec('call jsondecode("\\t\\"\\xC2\\"")'))
+ -- 0xE0 0xAA starts 3-byte unicode character
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \224"',
+ exc_exec('call jsondecode("\\t\\"\\xE0\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \224\170"',
+ exc_exec('call jsondecode("\\t\\"\\xE0\\xAA\\"")'))
+ -- 0xF0 0x90 0x80 starts 4-byte unicode character
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \240"',
+ exc_exec('call jsondecode("\\t\\"\\xF0\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \240\144"',
+ exc_exec('call jsondecode("\\t\\"\\xF0\\x90\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \240\144\128"',
+ exc_exec('call jsondecode("\\t\\"\\xF0\\x90\\x80\\"")'))
+ -- 0xF9 0x80 0x80 0x80 starts 5-byte unicode character
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xF9"',
+ exc_exec('call jsondecode("\\t\\"\\xF9\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xF9\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xF9\\x80\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xF9\x80\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xF9\\x80\\x80\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xF9\x80\x80\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xF9\\x80\\x80\\x80\\"")'))
+ -- 0xFC 0x90 0x80 0x80 0x80 starts 6-byte unicode character
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xFC"',
+ exc_exec('call jsondecode("\\t\\"\\xFC\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xFC\x90"',
+ exc_exec('call jsondecode("\\t\\"\\xFC\\x90\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xFC\x90\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xFC\\x90\\x80\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xFC\x90\x80\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xFC\\x90\\x80\\x80\\"")'))
+ eq('Vim(call):E474: Only UTF-8 strings allowed: \xFC\x90\x80\x80\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xFC\\x90\\x80\\x80\\x80\\"")'))
+ -- Specification does not allow unquoted characters above 0x10FFFF
+ eq('Vim(call):E474: Only UTF-8 code points up to U+10FFFF are allowed to appear unescaped: \xF9\x80\x80\x80\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xF9\\x80\\x80\\x80\\x80\\"")'))
+ eq('Vim(call):E474: Only UTF-8 code points up to U+10FFFF are allowed to appear unescaped: \xFC\x90\x80\x80\x80\x80"',
+ exc_exec('call jsondecode("\\t\\"\\xFC\\x90\\x80\\x80\\x80\\x80\\"")'))
+ -- '"\xF9\x80\x80\x80\x80"',
+ -- '"\xFC\x90\x80\x80\x80\x80"',
end)
end)