aboutsummaryrefslogtreecommitdiff
path: root/test/unit/viml/expressions/lexer_spec.lua
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2017-10-06 01:19:43 +0300
committerZyX <kp-pav@yandex.ru>2017-10-15 19:13:50 +0300
commit163792e9b9854fe046ada3233dec0fd0f6c55737 (patch)
tree2cb7739324748a54f609881f0870431cc7e5617a /test/unit/viml/expressions/lexer_spec.lua
parent0bc4e2237960712426da3774c1430f5874c49aea (diff)
downloadrneovim-163792e9b9854fe046ada3233dec0fd0f6c55737.tar.gz
rneovim-163792e9b9854fe046ada3233dec0fd0f6c55737.tar.bz2
rneovim-163792e9b9854fe046ada3233dec0fd0f6c55737.zip
viml/parser/expressions: Make lexer parse numbers, support non-decimal
Diffstat (limited to 'test/unit/viml/expressions/lexer_spec.lua')
-rw-r--r--test/unit/viml/expressions/lexer_spec.lua73
1 files changed, 51 insertions, 22 deletions
diff --git a/test/unit/viml/expressions/lexer_spec.lua b/test/unit/viml/expressions/lexer_spec.lua
index bd8045632e..f180d8ceff 100644
--- a/test/unit/viml/expressions/lexer_spec.lua
+++ b/test/unit/viml/expressions/lexer_spec.lua
@@ -114,7 +114,11 @@ local function eltkn2lua(pstate, tkn)
elseif ret.type == 'Number' then
ret.data = {
is_float = (not not tkn.data.num.is_float),
+ base = tonumber(tkn.data.num.base),
}
+ ret.data.val = tonumber(tkn.data.num.is_float
+ and tkn.data.num.val.floating
+ or tkn.data.num.val.integer)
elseif ret.type == 'Invalid' then
ret.data = { error = ffi.string(tkn.data.err.msg) }
end
@@ -204,9 +208,20 @@ describe('Expressions lexer', function()
singl_eltkn_test('Spacing', ' ')
singl_eltkn_test('Spacing', '\t')
singl_eltkn_test('Invalid', '\x01\x02\x03', {error='E15: Invalid control character present in input: %.*s'})
- singl_eltkn_test('Number', '0123', {is_float=false})
- singl_eltkn_test('Number', '0', {is_float=false})
- singl_eltkn_test('Number', '9', {is_float=false})
+ singl_eltkn_test('Number', '0123', {is_float=false, base=8, val=83})
+ singl_eltkn_test('Number', '01234567', {is_float=false, base=8, val=342391})
+ singl_eltkn_test('Number', '012345678', {is_float=false, base=10, val=12345678})
+ singl_eltkn_test('Number', '0x123', {is_float=false, base=16, val=291})
+ singl_eltkn_test('Number', '0x56FF', {is_float=false, base=16, val=22271})
+ singl_eltkn_test('Number', '0xabcdef', {is_float=false, base=16, val=11259375})
+ singl_eltkn_test('Number', '0xABCDEF', {is_float=false, base=16, val=11259375})
+ singl_eltkn_test('Number', '0x0', {is_float=false, base=16, val=0})
+ singl_eltkn_test('Number', '00', {is_float=false, base=8, val=0})
+ singl_eltkn_test('Number', '0b0', {is_float=false, base=2, val=0})
+ singl_eltkn_test('Number', '0b010111', {is_float=false, base=2, val=23})
+ singl_eltkn_test('Number', '0b100111', {is_float=false, base=2, val=39})
+ singl_eltkn_test('Number', '0', {is_float=false, base=10, val=0})
+ singl_eltkn_test('Number', '9', {is_float=false, base=10, val=9})
singl_eltkn_test('Env', '$abc')
singl_eltkn_test('Env', '$')
singl_eltkn_test('PlainIdentifier', 'test', {autoload=false, scope=0})
@@ -262,17 +277,21 @@ describe('Expressions lexer', function()
singl_eltkn_test('Invalid', '~', {error='E15: Unidentified character: %.*s'})
simple_test({{data=nil, size=0}}, 'EOC', 0, {error='start.col >= #pstr'})
simple_test({''}, 'EOC', 0, {error='start.col >= #pstr'})
- simple_test({'2.'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.x'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.2.'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0x'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e+'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e-'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e+x'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e-x'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e+1a'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e-1a'}, 'Number', 1, {data={is_float=false}, str='2'})
+ simple_test({'2.'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2e5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.2.'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-x'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+1a'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-1a'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'0b102'}, 'Number', 4, {data={is_float=false, base=2, val=2}, str='0b10'})
+ simple_test({'10F'}, 'Number', 2, {data={is_float=false, base=10, val=10}, str='10'})
+ simple_test({'0x0123456789ABCDEFG'}, 'Number', 18, {data={is_float=false, base=16, val=81985529216486895}, str='0x0123456789ABCDEF'})
end
local function regular_scope_tests()
@@ -304,10 +323,10 @@ describe('Expressions lexer', function()
end
local function regular_number_tests()
- simple_test({'2.0'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e5'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e+5'}, 'Number', 1, {data={is_float=false}, str='2'})
- simple_test({'2.0e-5'}, 'Number', 1, {data={is_float=false}, str='2'})
+ simple_test({'2.0'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e+5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({'2.0e-5'}, 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
end
local function regular_eoc_tests()
@@ -352,10 +371,20 @@ describe('Expressions lexer', function()
regular_scope_tests()
regular_is_tests()
- simple_test({'2.0'}, 'Number', 3, {data={is_float=true}, str='2.0'})
- simple_test({'2.0e5'}, 'Number', 5, {data={is_float=true}, str='2.0e5'})
- simple_test({'2.0e+5'}, 'Number', 6, {data={is_float=true}, str='2.0e+5'})
- simple_test({'2.0e-5'}, 'Number', 6, {data={is_float=true}, str='2.0e-5'})
+ simple_test({'2.2'}, 'Number', 3, {data={is_float=true, base=10, val=2.2}, str='2.2'})
+ simple_test({'2.0e5'}, 'Number', 5, {data={is_float=true, base=10, val=2e5}, str='2.0e5'})
+ simple_test({'2.0e+5'}, 'Number', 6, {data={is_float=true, base=10, val=2e5}, str='2.0e+5'})
+ simple_test({'2.0e-5'}, 'Number', 6, {data={is_float=true, base=10, val=2e-5}, str='2.0e-5'})
+ simple_test({'2.500000e-5'}, 'Number', 11, {data={is_float=true, base=10, val=2.5e-5}, str='2.500000e-5'})
+ simple_test({'2.5555e2'}, 'Number', 8, {data={is_float=true, base=10, val=2.5555e2}, str='2.5555e2'})
+ simple_test({'2.5555e+2'}, 'Number', 9, {data={is_float=true, base=10, val=2.5555e2}, str='2.5555e+2'})
+ simple_test({'2.5555e-2'}, 'Number', 9, {data={is_float=true, base=10, val=2.5555e-2}, str='2.5555e-2'})
+ simple_test({{data='2.5e-5', size=3}},
+ 'Number', 3, {data={is_float=true, base=10, val=2.5}, str='2.5'})
+ simple_test({{data='2.5e5', size=4}},
+ 'Number', 1, {data={is_float=false, base=10, val=2}, str='2'})
+ simple_test({{data='2.5e-50', size=6}},
+ 'Number', 6, {data={is_float=true, base=10, val=2.5e-5}, str='2.5e-5'})
end)
itp('treats `is` as an identifier', function()
flags = tonumber(lib.kELFlagIsNotCmp)