irongit

A Neovim plugin enabling you to solve LeetCode problems.

feat: store testcase snapshots

kawreauthored
parent 7cf551bcommit 69e6b41302a56197a557a0df7ba783c883b1a94cBrowse files

5 files changed, +44 -21

+3-3lua/leetcode-ui/group/cases.lua
@@ -59,11 +59,11 @@ function Cases:init(item, parent)
5959 self.console = parent
6060
6161 local total = item.total_testcases ~= vim.NIL and item.total_testcases or 0
62+ local testcases = parent.testcase:by_id(item.submission_id)
63+
6264 for i = 1, total do
6365 self.cases[i] = Case({
64- -- TODO: cache the testcases on submission,
65- -- so it doesn't get out of sync
66- input = self.console.testcase.testcases[i],
66+ input = testcases[i],
6767 output = item.code_answer[i],
6868 expected = item.expected_code_answer[i],
6969 std_output = item.std_output_list[i],
+30-15lua/leetcode-ui/popup/console/testcase.lua
@@ -5,40 +5,53 @@ local t = require("leetcode.translator")
55
66 ---@class lc.ui.Console.TestcasePopup : lc.ui.Console.Popup
77 ---@field testcases table<string[]>
8+---@field testcase_len integer
89 ---@field extmarks integer[]
10+---@field snapshots table<string, string[]>
911 local Testcase = ConsolePopup:extend("LeetTestcasePopup")
1012
1113 function Testcase:content()
12- self.testcases = {}
14+ local lines = vim.api.nvim_buf_get_lines(self.bufnr, 0, -1, false)
15+ lines = vim.tbl_filter(function(line) return line ~= "" end, lines)
16+ return table.concat(lines, "\n")
17+end
18+
19+function Testcase:snapshot(id, data) --
20+ if not data.test_case then return end
21+ self.testcases[id] = data.test_case
22+end
23+
24+---@return string[][]
25+function Testcase:by_id(id) --
26+ local testcases = {} ---@type string[][]
1327
14- local tbl = vim.api.nvim_buf_get_lines(self.bufnr, 0, -1, false)
15- local str = table.concat(tbl, "\n")
28+ local i, n = 0, self.testcase_len
29+ for case in vim.gsplit(self.testcases[id] or "", "\n") do
30+ local j = math.floor(i / n) + 1
1631
17- local testcases = {}
18- for tcase in vim.gsplit(str, "\n\n") do
19- local s = vim.split(tcase, "\n")
32+ if not testcases[j] then testcases[j] = {} end
33+ table.insert(testcases[j], case)
2034
21- table.insert(self.testcases, s)
22- testcases = vim.list_extend(testcases, s)
35+ i = i + 1
2336 end
2437
2538 return testcases
2639 end
2740
2841 function Testcase:populate()
29- local tbl = {}
30- for i, case in ipairs(self.console.question.q.testcase_list) do
31- if i ~= 1 then table.insert(tbl, "") end
42+ local lines = {}
3243
33- table.insert(self.testcases, vim.split(case, "\n"))
44+ local t_list = self.console.question.q.testcase_list
45+ self.testcase_len = #vim.split(t_list[1] or "", "\n")
3446
47+ for i, case in ipairs(t_list) do
48+ if i ~= 1 then table.insert(lines, "") end
3549 for s in vim.gsplit(case, "\n", { trimempty = true }) do
36- table.insert(tbl, s)
50+ table.insert(lines, s)
3751 end
3852 end
3953
40- vim.api.nvim_buf_set_lines(self.bufnr, 0, -1, false, tbl)
41-
54+ vim.api.nvim_buf_set_lines(self.bufnr, 0, -1, false, lines)
4255 return self:draw_extmarks()
4356 end
4457
@@ -140,6 +153,7 @@ function Testcase:mount()
140153
141154 self.testcases = {}
142155 self.extmarks = {}
156+ self.testcase_len = 0
143157
144158 self:autocmds()
145159 self:populate()
@@ -172,6 +186,7 @@ function Testcase:init(parent)
172186
173187 self.testcases = {}
174188 self.extmarks = {}
189+ self.testcase_len = 0
175190
176191 self:populate()
177192 end
+2-1lua/leetcode/api/interpreter.lua
@@ -83,8 +83,9 @@ function interpreter.run(submit, q, body, callback)
8383 end
8484 callback(nil, nil, err)
8585 else
86- q.console.result:clear()
8786 local id = submit and res.submission_id or res.interpret_id
87+ q.console.testcase:snapshot(id, res)
88+ q.console.result:clear()
8889 interpreter.listener(id, callback)
8990 end
9091 end,
+8-1lua/leetcode/logger/spinner/init.lua
@@ -50,7 +50,7 @@ function spinner:spin()
5050
5151 self.index = (self.index + 1) % #stype.frames
5252
53- local fps = 1000 / #stype.frames
53+ local fps = math.floor(1000 / #stype.frames)
5454 vim.defer_fn(function() self:spin() end, fps)
5555 end
5656
@@ -63,6 +63,9 @@ function spinner:set(msg, lvl, opts)
6363 if msg then self:update(msg) end
6464 lvl = lvl or vim.log.levels.INFO
6565
66+ local log = require("leetcode.logger")
67+ log.debug(self.noti)
68+
6669 opts = vim.tbl_deep_extend("force", {
6770 hide_from_history = true,
6871 title = config.name,
@@ -97,6 +100,10 @@ function spinner:stop(msg, success, opts)
97100
98101 self.spinner = nil
99102 local lvl = vim.log.levels[success and "INFO" or "ERROR"]
103+
104+ local log = require("leetcode.logger")
105+ log.debug({ noti = self.noti, msg = "spinner stop" })
106+
100107 self:set(msg, lvl, opts)
101108 end
102109
+1-1lua/leetcode/runner/init.lua
@@ -36,7 +36,7 @@ function Runner:handle(submit)
3636 lang = question.lang,
3737 typed_code = self.question:lines(submit),
3838 question_id = question.q.id,
39- data_input = not submit and table.concat(question.console.testcase:content(), "\n") or nil,
39+ data_input = not submit and question.console.testcase:content(),
4040 }
4141
4242 local judge = Judge:init()