Skip to content

Commit b6c4ac7

Browse files
Add end 2 end test using demo file, not portable but a decent sanity check
1 parent 556dcc2 commit b6c4ac7

File tree

5 files changed

+297
-1
lines changed

5 files changed

+297
-1
lines changed

.neoconf.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"neodev": {
3+
"library": {
4+
"plugins": [
5+
"plenary.nvim"
6+
]
7+
}
8+
}
9+
}

.stylua.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
column_width = 120
1+
column_width = 160
22
line_endings = 'Unix'
33
indent_type = 'Spaces'
44
indent_width = 4

justfile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
init := "tests/minimal.lua"
12
default_zoom := '2'
23

4+
test:
5+
nvim --headless --noplugin -u {{init}} \
6+
-c "PlenaryBustedDirectory tests { minimal_init = '{{init}}', sequential=true }"
7+
38
demo zoom=default_zoom:
49
rm -f demo/demo.gif
510
python demo/record.py \

tests/init_spec.lua

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
local async_tests = require('plenary.async.tests')
2+
local ui = require('render-markdown.ui')
3+
local util = require('plenary.async.util')
4+
5+
local eq = assert.are.same
6+
7+
async_tests.describe('init', function()
8+
async_tests.before_each(function()
9+
require('render-markdown').setup({})
10+
end)
11+
12+
async_tests.it('render demo', function()
13+
vim.cmd('e demo/sample.md')
14+
util.scheduler()
15+
16+
local actual = {}
17+
local marks = vim.api.nvim_buf_get_extmarks(0, ui.namespace, 0, -1, { details = true })
18+
for _, mark in ipairs(marks) do
19+
local _, row, col, details = unpack(mark)
20+
table.insert(actual, {
21+
row = { row, details.end_row },
22+
col = { col, details.end_col },
23+
hl_eol = details.hl_eol,
24+
hl_group = details.hl_group,
25+
virt_text = details.virt_text,
26+
virt_text_pos = details.virt_text_pos,
27+
virt_lines = details.virt_lines,
28+
virt_lines_above = details.virt_lines_above,
29+
})
30+
end
31+
32+
local expected = {
33+
-- Headings 1 through 6 (minus 2)
34+
{
35+
row = { 0, 1 },
36+
col = { 0, 0 },
37+
hl_eol = true,
38+
hl_group = 'DiffAdd',
39+
virt_text = { { '', 'markdownH1' }, { '󰲡 ', 'DiffAdd' } },
40+
virt_text_pos = 'overlay',
41+
},
42+
{
43+
row = { 2, 3 },
44+
col = { 0, 0 },
45+
hl_eol = true,
46+
hl_group = 'DiffDelete',
47+
virt_text = { { '', 'markdownH3' }, { ' 󰲥 ', 'DiffDelete' } },
48+
virt_text_pos = 'overlay',
49+
},
50+
{
51+
row = { 4, 5 },
52+
col = { 0, 0 },
53+
hl_eol = true,
54+
hl_group = 'DiffDelete',
55+
virt_text = { { '', 'markdownH4' }, { ' 󰲧 ', 'DiffDelete' } },
56+
virt_text_pos = 'overlay',
57+
},
58+
{
59+
row = { 6, 7 },
60+
col = { 0, 0 },
61+
hl_eol = true,
62+
hl_group = 'DiffDelete',
63+
virt_text = { { '', 'markdownH5' }, { ' 󰲩 ', 'DiffDelete' } },
64+
virt_text_pos = 'overlay',
65+
},
66+
{
67+
row = { 8, 9 },
68+
col = { 0, 0 },
69+
hl_eol = true,
70+
hl_group = 'DiffDelete',
71+
virt_text = { { '', 'markdownH6' }, { ' 󰲫 ', 'DiffDelete' } },
72+
virt_text_pos = 'overlay',
73+
},
74+
-- Code block
75+
{
76+
row = { 10, 21 },
77+
col = { 0, 0 },
78+
hl_eol = true,
79+
hl_group = 'ColorColumn',
80+
},
81+
-- List Item 1, bullet point
82+
{
83+
row = { 22, 22 },
84+
col = { 0, 2 },
85+
virt_text = { { '', 'Normal' } },
86+
virt_text_pos = 'overlay',
87+
},
88+
-- List Item 2, bullet point
89+
{
90+
row = { 23, 23 },
91+
col = { 0, 2 },
92+
virt_text = { { '', 'Normal' } },
93+
virt_text_pos = 'overlay',
94+
},
95+
-- List Item 2, inline code
96+
{
97+
row = { 23, 23 },
98+
col = { 20, 28 },
99+
hl_eol = false,
100+
hl_group = 'ColorColumn',
101+
},
102+
-- Nested List 1 Item 1, bullet point
103+
{
104+
row = { 24, 24 },
105+
col = { 2, 6 },
106+
virt_text = { { '', 'Normal' } },
107+
virt_text_pos = 'overlay',
108+
},
109+
-- Nested List 1 Item 2, bullet point
110+
{
111+
row = { 25, 25 },
112+
col = { 4, 6 },
113+
virt_text = { { '', 'Normal' } },
114+
virt_text_pos = 'overlay',
115+
},
116+
-- Nested List 2 Item 1, bullet point
117+
{
118+
row = { 26, 26 },
119+
col = { 6, 8 },
120+
virt_text = { { '', 'Normal' } },
121+
virt_text_pos = 'overlay',
122+
},
123+
-- Nested List 3 Item 1, bullet point
124+
{
125+
row = { 27, 27 },
126+
col = { 8, 10 },
127+
virt_text = { { '', 'Normal' } },
128+
virt_text_pos = 'overlay',
129+
},
130+
-- Nested List 4 Item 1, bullet point
131+
{
132+
row = { 28, 28 },
133+
col = { 10, 12 },
134+
virt_text = { { '', 'Normal' } },
135+
virt_text_pos = 'overlay',
136+
},
137+
-- List Item 3, bullet point
138+
{
139+
row = { 29, 29 },
140+
col = { 0, 2 },
141+
virt_text = { { '', 'Normal' } },
142+
virt_text_pos = 'overlay',
143+
},
144+
-- Unchecked checkbox, bullet point, not created intentionally, remove if fixed
145+
{
146+
row = { 35, 35 },
147+
col = { 0, 2 },
148+
virt_text = { { '', 'Normal' } },
149+
virt_text_pos = 'overlay',
150+
},
151+
-- Unchecked checkbox, checkbox
152+
{
153+
row = { 35, 35 },
154+
col = { 2, 5 },
155+
virt_text = { { ' 󰄱 ', '@markup.list.unchecked' } },
156+
virt_text_pos = 'overlay',
157+
},
158+
-- Checked checkbox, bullet point, not created intentionally, remove if fixed
159+
{
160+
row = { 36, 36 },
161+
col = { 0, 2 },
162+
virt_text = { { '', 'Normal' } },
163+
virt_text_pos = 'overlay',
164+
},
165+
-- Checked checkbox, checkbox
166+
{
167+
row = { 36, 36 },
168+
col = { 2, 5 },
169+
virt_text = { { '', '@markup.heading' } },
170+
virt_text_pos = 'overlay',
171+
},
172+
-- Line break, TODO: fragile need to determine width
173+
{
174+
row = { 38 },
175+
col = { 0 },
176+
virt_text = { { string.rep('', 80), 'LineNr' } },
177+
virt_text_pos = 'overlay',
178+
},
179+
-- Quote lines
180+
{
181+
row = { 40, 40 },
182+
col = { 0, 4 },
183+
virt_text = { { '', '@markup.quote' } },
184+
virt_text_pos = 'overlay',
185+
},
186+
{
187+
row = { 41, 41 },
188+
col = { 0, 4 },
189+
virt_text = { { '', '@markup.quote' } },
190+
virt_text_pos = 'overlay',
191+
},
192+
-- Table heading
193+
{
194+
row = { 43, 43 },
195+
col = { 0, 31 },
196+
virt_text = { { '│ Heading 1 │ Heading 2 │', '@markup.heading' } },
197+
virt_text_pos = 'overlay',
198+
},
199+
-- Table above
200+
{
201+
row = { 43 },
202+
col = { 0 },
203+
virt_lines = { { { '┌──────────────┬──────────────┐', '@markup.heading' } } },
204+
virt_lines_above = true,
205+
},
206+
-- Table below heading
207+
{
208+
row = { 44, 44 },
209+
col = { 0, 31 },
210+
virt_text = { { '├──────────────┼──────────────┤', '@markup.heading' } },
211+
virt_text_pos = 'overlay',
212+
},
213+
-- Table rows
214+
{
215+
row = { 45, 45 },
216+
col = { 0, 31 },
217+
virt_text = { { '│ Row 1 Item 1 │ Row 1 Item 2 │', 'Normal' } },
218+
virt_text_pos = 'overlay',
219+
},
220+
{
221+
row = { 46, 46 },
222+
col = { 0, 31 },
223+
virt_text = { { '│ Row 2 Item 1 │ Row 2 Item 2 │', 'Normal' } },
224+
virt_text_pos = 'overlay',
225+
},
226+
{
227+
row = { 47, 47 },
228+
col = { 0, 31 },
229+
virt_text = { { '│ Row 3 Item 1 │ Row 3 Item 2 │', 'Normal' } },
230+
virt_text_pos = 'overlay',
231+
},
232+
-- Table below
233+
{
234+
row = { 48 },
235+
col = { 0 },
236+
virt_lines = { { { '└──────────────┴──────────────┘', 'Normal' } } },
237+
virt_lines_above = true,
238+
},
239+
-- LaTeX inline, TODO: mock interaction with latex2text
240+
{
241+
row = { 49, 49 },
242+
col = { 0, 21 },
243+
virt_lines = { { { '√(3x-1)+(1+x)^2', '@markup.math' } } },
244+
virt_lines_above = true,
245+
},
246+
-- LaTeX block, TODO: mock interaction with latex2text
247+
{
248+
row = { 51, 54 },
249+
col = { 0, 2 },
250+
virt_lines = {
251+
{ { 'f(x,y) = x + √(y)', '@markup.math' } },
252+
{ { 'f(x,y) = √(y) + x^2/4y', '@markup.math' } },
253+
},
254+
255+
virt_lines_above = true,
256+
},
257+
}
258+
259+
eq(expected, actual)
260+
end)
261+
end)

tests/minimal.lua

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---@param path_name string
2+
---@param plugin_name string
3+
local function source_plugin(path_name, plugin_name)
4+
local path = vim.fs.find(path_name, { path = vim.fn.stdpath('data') })
5+
vim.opt.rtp:prepend(unpack(path))
6+
vim.cmd.runtime('plugin/' .. plugin_name)
7+
end
8+
9+
vim.opt.rtp:prepend('.')
10+
source_plugin('plenary.nvim', 'plenary.vim')
11+
source_plugin('nvim-treesitter', 'nvim-treesitter.lua')
12+
13+
-- https://github.com/ThePrimeagen/refactoring.nvim/blob/master/scripts/minimal.vim
14+
local required_parsers = { 'markdown', 'markdown_inline' }
15+
local installed_parsers = require('nvim-treesitter.info').installed_parsers()
16+
local to_install = vim.tbl_filter(function(parser)
17+
return not vim.tbl_contains(installed_parsers, parser)
18+
end, required_parsers)
19+
if #to_install > 0 then
20+
vim.cmd.TSInstallSync({ bang = true, args = to_install })
21+
end

0 commit comments

Comments
 (0)