From 6cbc089f83eec21a33c792943e323a0f50a56e0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= <sumneko@hotmail.com>
Date: Tue, 24 Aug 2021 21:23:09 +0800
Subject: [PATCH] command test

---
 script/core/command/autoRequire.lua |  2 +-
 script/utility.lua                  | 14 +++++++++++
 script/vm/eachDef.lua               |  3 +--
 script/vm/eachRef.lua               |  3 +--
 script/vm/getDocs.lua               |  3 +--
 script/vm/getGlobals.lua            |  3 +--
 script/vm/getLibrary.lua            |  1 -
 script/vm/getLinks.lua              |  3 +--
 script/vm/vm.lua                    |  4 ++--
 test.lua                            |  1 +
 test/command/auto-require.lua       | 36 +++++++++++++++++++++++++++++
 test/command/init.lua               |  1 +
 12 files changed, 60 insertions(+), 14 deletions(-)
 create mode 100644 test/command/auto-require.lua
 create mode 100644 test/command/init.lua

diff --git a/script/core/command/autoRequire.lua b/script/core/command/autoRequire.lua
index 63ff784e5..2cb6a8f88 100644
--- a/script/core/command/autoRequire.lua
+++ b/script/core/command/autoRequire.lua
@@ -107,7 +107,6 @@ return function (data)
         return
     end
 
-    local offset, fmt = findInsertOffset(uri)
     local path = furi.decode(target)
     local visiblePaths = rpath.getVisiblePath(path, config.get 'Lua.runtime.path')
     if not visiblePaths or #visiblePaths == 0 then
@@ -122,5 +121,6 @@ return function (data)
         return
     end
 
+    local offset, fmt = findInsertOffset(uri)
     applyAutoRequire(uri, offset, name, result, fmt)
 end
diff --git a/script/utility.lua b/script/utility.lua
index f62c7af3c..8d377708c 100644
--- a/script/utility.lua
+++ b/script/utility.lua
@@ -17,6 +17,7 @@ local mathRandom   = math.random
 local ioOpen       = io.open
 local utf8Len      = utf8.len
 local getenv       = os.getenv
+local getupvalue   = debug.getupvalue
 local mathHuge     = math.huge
 local inf          = 1 / 0
 local nan          = 0 / 0
@@ -684,4 +685,17 @@ function m.switch()
     return obj
 end
 
+function m.getUpvalue(f, name)
+    for i = 1, 999 do
+        local uname, value = getupvalue(f, i)
+        if not uname then
+            break
+        end
+        if name == uname then
+            return value, true
+        end
+    end
+    return nil, false
+end
+
 return m
diff --git a/script/vm/eachDef.lua b/script/vm/eachDef.lua
index 65cae73e9..2bfad4bf3 100644
--- a/script/vm/eachDef.lua
+++ b/script/vm/eachDef.lua
@@ -1,5 +1,4 @@
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm       = require 'vm.vm'
 local searcher = require 'core.searcher'
 
diff --git a/script/vm/eachRef.lua b/script/vm/eachRef.lua
index 6e008e2a0..354258185 100644
--- a/script/vm/eachRef.lua
+++ b/script/vm/eachRef.lua
@@ -1,5 +1,4 @@
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm       = require 'vm.vm'
 local searcher = require 'core.searcher'
 
diff --git a/script/vm/getDocs.lua b/script/vm/getDocs.lua
index 8ee942d1b..c02056542 100644
--- a/script/vm/getDocs.lua
+++ b/script/vm/getDocs.lua
@@ -1,7 +1,6 @@
 local files     = require 'files'
 local guide     = require 'parser.guide'
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm        = require 'vm.vm'
 local config    = require 'config'
 local collector = require 'core.collector'
diff --git a/script/vm/getGlobals.lua b/script/vm/getGlobals.lua
index d794a394f..6dacda43a 100644
--- a/script/vm/getGlobals.lua
+++ b/script/vm/getGlobals.lua
@@ -1,7 +1,6 @@
 local collector = require 'core.collector'
 local guide     = require 'parser.guide'
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm        = require 'vm.vm'
 local noder     = require 'core.noder'
 
diff --git a/script/vm/getLibrary.lua b/script/vm/getLibrary.lua
index 1002babba..1a8d8ffde 100644
--- a/script/vm/getLibrary.lua
+++ b/script/vm/getLibrary.lua
@@ -1,4 +1,3 @@
----@diagnostic disable-next-line
 ---@class vm
 local vm      = require 'vm.vm'
 
diff --git a/script/vm/getLinks.lua b/script/vm/getLinks.lua
index 8df79dcae..161396f6a 100644
--- a/script/vm/getLinks.lua
+++ b/script/vm/getLinks.lua
@@ -1,6 +1,5 @@
 local guide = require 'parser.guide'
----@diagnostic disable-next-line
----@class vm
+---@type vm
 local vm    = require 'vm.vm'
 local files = require 'files'
 
diff --git a/script/vm/vm.lua b/script/vm/vm.lua
index f51def71c..6abaaa0e7 100644
--- a/script/vm/vm.lua
+++ b/script/vm/vm.lua
@@ -13,8 +13,8 @@ local mathHuge       = math.huge
 local weakMT = { __mode = 'kv' }
 
 _ENV = nil
----@diagnostic disable-next-line
----@class vm
+
+---@type vm
 local m = {}
 
 function m.getArgInfo(source)
diff --git a/test.lua b/test.lua
index 70993a702..d2e2c38a3 100644
--- a/test.lua
+++ b/test.lua
@@ -74,6 +74,7 @@ local function testAll()
     test 'highlight'
     test 'rename'
     test 'signature'
+    test 'command'
     test 'document_symbol'
     test 'code_action'
     test 'type_formatting'
diff --git a/test/command/auto-require.lua b/test/command/auto-require.lua
new file mode 100644
index 000000000..94bb50693
--- /dev/null
+++ b/test/command/auto-require.lua
@@ -0,0 +1,36 @@
+local util        = require 'utility'
+local files       = require 'files'
+local autoRequire = require 'core.command.autoRequire'
+local client      = require 'client'
+
+local findInsertOffset = util.getUpvalue(autoRequire, 'findInsertOffset')
+local applyAutoRequire = util.getUpvalue(autoRequire, 'applyAutoRequire')
+
+local originEditText = client.editText
+local EditResult
+
+client.editText = function (uri, edits)
+    EditResult = edits[1]
+end
+
+function TEST(text)
+    return function (name)
+        return function (expect)
+            files.removeAll()
+            files.setText('', text)
+            EditResult = nil
+            local offset, fmt = findInsertOffset('')
+            applyAutoRequire('', offset, name, name, fmt)
+            assert(util.equal(EditResult, expect))
+        end
+    end
+end
+
+-- TODO change to position
+TEST '' 'test' {
+    start  = 0,
+    finish = -1,
+    text   = '\nlocal test = require "test"\n'
+}
+
+client.editText = originEditText
diff --git a/test/command/init.lua b/test/command/init.lua
new file mode 100644
index 000000000..85d7f0d89
--- /dev/null
+++ b/test/command/init.lua
@@ -0,0 +1 @@
+require 'command.auto-require'
-- 
GitLab