diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2019-11-23 00:05:30 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2019-11-23 00:05:30 +0800 |
commit | 6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 (patch) | |
tree | fdc22d78150fd1c5edc46732c8b151ccfefb519f /test/diagnostics | |
parent | d0ff66c9abe9d6abbca12fd811e0c3cb69c1033a (diff) | |
download | lua-language-server-6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444.zip |
正路目录
Diffstat (limited to 'test/diagnostics')
-rw-r--r-- | test/diagnostics/init.lua | 74 | ||||
-rw-r--r-- | test/diagnostics/normal.lua | 503 | ||||
-rw-r--r-- | test/diagnostics/syntax.lua | 8 |
3 files changed, 585 insertions, 0 deletions
diff --git a/test/diagnostics/init.lua b/test/diagnostics/init.lua new file mode 100644 index 00000000..eee03d2e --- /dev/null +++ b/test/diagnostics/init.lua @@ -0,0 +1,74 @@ +local core = require 'core' +local buildVM = require 'vm' +local parser = require 'parser' +local service = require 'service' +local config = require 'config' + +rawset(_G, 'TEST', true) + +local function catch_target(script, ...) + local list = {} + local function catch(buf) + local cur = 1 + local cut = 0 + while true do + local start, finish = buf:find('<!.-!>', cur) + if not start then + break + end + list[#list+1] = { start - cut, finish - 4 - cut } + cur = finish + 1 + cut = cut + 4 + end + end + catch(script) + if ... then + for _, buf in ipairs {...} do + catch(buf) + end + end + local new_script = script:gsub('<!(.-)!>', '%1') + return new_script, list +end + +local function founded(targets, results) + if #targets ~= #results then + return false + end + for _, target in ipairs(targets) do + for _, result in ipairs(results) do + if target[1] == result[1] and target[2] == result[2] then + goto NEXT + end + end + do return false end + ::NEXT:: + end + return true +end + +function TEST(script, ...) + local new_script, target = catch_target(script, ...) + local lsp = service() + local ast = parser:parse(new_script, 'lua', 'Lua 5.3') + assert(ast) + local lines = parser:lines(new_script) + local vm = buildVM(ast, lsp, 'test') + assert(vm) + local datas = core.diagnostics(vm, lines, 'test') + local results = {} + for i, data in ipairs(datas) do + results[i] = { data.start, data.finish } + end + + if results[1] then + if not founded(target, results) then + error(('%s\n%s'):format(table.dump(target), table.dump(results))) + end + else + assert(#target == 0) + end +end + +require 'diagnostics.normal' +require 'diagnostics.syntax' diff --git a/test/diagnostics/normal.lua b/test/diagnostics/normal.lua new file mode 100644 index 00000000..5fdc3ba8 --- /dev/null +++ b/test/diagnostics/normal.lua @@ -0,0 +1,503 @@ +local config = require 'config' + +TEST [[ +local <!x!> +]] + +TEST([[ +<!local function x() +end!> +]], +[[ +local function <!x!>() +end +]] +) + +TEST [[ +local <!x!> = <!function () end!> +]] + +TEST [[ +local <!x!> +x = <!function () end!> +]] + + +TEST [[ +print(<!x!>) +print(<!log!>) +print(<!X!>) +print(<!Log!>) +print(_VERSION) +print(<!y!>) +print(Z) +Z = 1 +]] + +TEST [[ +::<!LABEL!>:: +]] + +TEST [[ +<! !> +]] + +TEST [[ +X = 1<! !> +]] + +TEST [[ +X = [=[ + ]=] +]] + +TEST [[ +local x +print(x) +local <!x!> +print(x) +]] + +TEST [[ +local x +print(x) +local <!x!> +print(x) +local <!x!> +print(x) +]] + +TEST [[ +local _ +print(_) +local _ +print(_) +local _ENV +<!print!>(_ENV) -- 由于重定义了_ENV,因此print变为了未定义全局变量 +]] + +TEST [[ +print(1) +_ENV = nil +]] + +config.config.diagnostics.disable['undefined-env-child'] = true +TEST [[ +_ENV = nil +<!GLOBAL!> = 1 --> _ENV.GLOBAL = 1 +]] + +TEST [[ +_ENV = nil +local _ = <!GLOBAL!> --> local _ = _ENV.GLOBAL +]] + +TEST [[ +_ENV = {} +GLOBAL = 1 --> _ENV.GLOBAL = 1 +]] + +TEST [[ +_ENV = {} +local _ = GLOBAL --> local _ = _ENV.GLOBAL +]] + +config.config.diagnostics.disable['undefined-env-child'] = nil +TEST [[ +print() +<!('string')!>:sub(1, 1) +]] + +TEST [[ +print() +('string') +]] + +TEST [[ +return { + <!print + 'string'!> +} +]] + +TEST [[ +return { + <!print + { + x = 1, + }!> +} +]] + +TEST [[ +print() +'string' +]] + +TEST [[ +print +{ + x = 1, +} +]] + +TEST [[ +local function x(a, b) + return a, b +end +x(1, 2, <!3!>) +]] + +TEST [[ +InstanceName = 1 +Instance = _G[InstanceName] +]] + +TEST [[ +(''):sub(1, 2) +]] + +TEST [=[ +return [[ + +]] +]=] + +TEST [[ +local mt, x +function mt:m() + function x:m() + end +end +]] + +TEST [[ +local mt = {} +function mt:f() +end +]] + +TEST [[ +local function f(<!self!>) +end +f() +]] + +TEST [[ +local function f(<!...!>) +end +f() +]] + +TEST [[ +local function f(var) + print(var) +end +local var +f(var) +]] + +TEST [[ +local function f(a, b) + return a, b +end +f(1, 2, <!3!>, <!4!>) +]] + +TEST [[ +local mt = {} +function mt:f(a, b) + return a, b +end +mt.f(1, 2, 3, <!4!>) +]] + + +TEST [[ +local mt = {} +function mt.f(a, b) + return a, b +end +mt:f(1, <!2!>, <!3!>, <!4!>) +]] + +TEST [[ +local mt = {} +function mt:f(a, b) + return a, b +end +mt:f(1, 2, <!3!>, <!4!>) +]] + +TEST [[ +local function f(a, b, ...) + return a, b, ... +end +f(1, 2, 3, 4) +]] + +TEST [[ +next({}, 1, <!2!>) +print(1, 2, 3, 4, 5) +]] + +TEST [[ +local function f(callback) + callback(1, 2, 3) +end +f(function () end) +]] + +--TEST [[ +--local realTostring = tostring +--tostring = function () end +--tostring(<!1!>) +--tostring = realTostring +--tostring(1) +--]] + +TEST [[ +<!aa!> = 1 +tostring = 1 +ROOT = 1 +_G.bb = 1 +]] + +TEST [[ +local f = load('') +f(1, 2, 3) +]] + +require 'config' .config.runtime.version = 'Lua 5.3' +TEST [[ +<!warn!>(1) +]] + +TEST [[ +X = table[<!x!>] +]] + +TEST [[ +return { + <!x = 1!>, + y = 2, + <!x!> = 3, +} +]] + +TEST [[ +local m = {} +function m.open() +end + +m:open() +]] + +TEST [[ +<!if true then +end!> +]] + +TEST [[ +<!if true then +else +end!> +]] + +TEST [[ +if true then +else + return +end +]] + +TEST [[ +while true do +end +]] + +TEST [[ +<!for _ = 1, 10 do +end!> +]] + +TEST [[ +<!for _ in pairs(_VERSION) do +end!> +]] + +TEST [[ +local _ = 1, <!2!> +]] + +TEST [[ +_ = 1, <!2!> +]] + +TEST [[ +local function x() + do + local k + print(k) + x() + end + local k = 1 + print(k) +end +]] + +TEST [[ +local function x() + local loc + x() + print(loc) +end +]] + +TEST [[ +---@class <!Class!> +---@class <!Class!> +]] + +TEST [[ +---@class A : <!B!> +]] + +TEST [[ +---@class <!A : B!> +---@class <!B : C!> +---@class <!C : D!> +---@class <!D : A!> +]] + +TEST [[ +---@class A : B +---@class B : C +---@class C : D +---@class D +]] + +TEST [[ +---@type <!A!> +]] + +TEST [[ +---@class A +---@type A|<!B!>|<!C!> +]] + +TEST [[ +---@class AAA +---@alias B AAA + +---@type B +]] + +TEST [[ +---@alias B <!AAA!> +]] + +TEST [[ +---@class <!A!> +---@class B +---@alias <!A B!> +]] + +TEST [[ +---@param x <!Class!> +]] + +TEST [[ +---@class Class +---@param <!y!> Class +local function f(x) + return x +end +f() +]] + +TEST [[ +---@class Class +---@param <!y!> Class +function F(x) + return x +end +F() +]] + +TEST [[ +---@class Class +---@param <!x!> Class +---@param y Class +---@param <!x!> Class +local function f(x, y) + return x, y +end +f() +]] + +TEST [[ +---@field <!x Class!> +---@class Class +]] + +TEST [[ +---@class Class +---@field <!x!> Class +---@field <!x!> Class +]] + +TEST [[ +---@class Class : any +]] + +TEST [[ +---@type fun(a: integer) +local f +f() +]] + +TEST [[ +local x +x = <!x or 0 + 1!> +]] + +TEST [[ +local x, y +x = <!x + y or 0!> +]] + +TEST [[ +local x, y, z +x = x and y or '' .. z +]] + +TEST [[ +local x +x = x or -1 +]] + +TEST [[ +local x +x = x or (0 + 1) +]] + +TEST [[ +local x, y +x = (x + y) or 0 +]] + +--TEST [[ +--local t = {} +--function t:<!a!>() +--end +--function t:<!a!>() +--end +--]] + +TEST [[ +local t = {} +t.a = 1 +t.a = 2 +]] diff --git a/test/diagnostics/syntax.lua b/test/diagnostics/syntax.lua new file mode 100644 index 00000000..887d05f0 --- /dev/null +++ b/test/diagnostics/syntax.lua @@ -0,0 +1,8 @@ +local config = require 'config' + +TEST [[ +local x <const> = 1 +<!x!> = 2 +return x +]] + |