@@ -21,10 +21,10 @@ describe('presets', function()
2121 assert .are .same ({ ' typst' , ' compile' }, presets .typst .cmd )
2222 end )
2323
24- it (' returns args with file path' , function ()
24+ it (' returns args with diagnostic format and file path' , function ()
2525 local args = presets .typst .args (ctx )
2626 assert .is_table (args )
27- assert .are .same ({ ' /tmp/document.typ' }, args )
27+ assert .are .same ({ ' --diagnostic-format ' , ' short ' , ' /tmp/document.typ' }, args )
2828 end )
2929
3030 it (' returns pdf output path' , function ()
@@ -36,6 +36,30 @@ describe('presets', function()
3636 it (' has open enabled' , function ()
3737 assert .is_true (presets .typst .open )
3838 end )
39+
40+ it (' parses errors from stderr' , function ()
41+ local stderr = table.concat ({
42+ ' main.typ:5:23: error: unexpected token' ,
43+ ' main.typ:12:1: warning: unused variable' ,
44+ }, ' \n ' )
45+ local diagnostics = presets .typst .error_parser (stderr , ctx )
46+ assert .is_table (diagnostics )
47+ assert .are .equal (2 , # diagnostics )
48+ assert .are .equal (4 , diagnostics [1 ].lnum )
49+ assert .are .equal (22 , diagnostics [1 ].col )
50+ assert .are .equal (' unexpected token' , diagnostics [1 ].message )
51+ assert .are .equal (vim .diagnostic .severity .ERROR , diagnostics [1 ].severity )
52+ assert .are .equal (' main.typ' , diagnostics [1 ].source )
53+ assert .are .equal (11 , diagnostics [2 ].lnum )
54+ assert .are .equal (0 , diagnostics [2 ].col )
55+ assert .are .equal (' unused variable' , diagnostics [2 ].message )
56+ assert .are .equal (vim .diagnostic .severity .WARN , diagnostics [2 ].severity )
57+ end )
58+
59+ it (' returns empty table for clean stderr' , function ()
60+ local diagnostics = presets .typst .error_parser (' ' , ctx )
61+ assert .are .same ({}, diagnostics )
62+ end )
3963 end )
4064
4165 describe (' latex' , function ()
@@ -57,7 +81,12 @@ describe('presets', function()
5781 it (' returns args with pdf flag and file path' , function ()
5882 local args = presets .latex .args (tex_ctx )
5983 assert .is_table (args )
60- assert .are .same ({ ' -pdf' , ' -interaction=nonstopmode' , ' /tmp/document.tex' }, args )
84+ assert .are .same ({
85+ ' -pdf' ,
86+ ' -interaction=nonstopmode' ,
87+ ' -pdflatex=pdflatex -file-line-error -interaction=nonstopmode %O %S' ,
88+ ' /tmp/document.tex' ,
89+ }, args )
6190 end )
6291
6392 it (' returns pdf output path' , function ()
@@ -75,6 +104,44 @@ describe('presets', function()
75104 it (' has open enabled' , function ()
76105 assert .is_true (presets .latex .open )
77106 end )
107+
108+ it (' parses file-line-error format from stderr' , function ()
109+ local stderr = table.concat ({
110+ ' ./document.tex:10: Undefined control sequence.' ,
111+ ' l.10 \\ badcommand' ,
112+ ' Collected error summary (may duplicate other messages):' ,
113+ " pdflatex: Command for 'pdflatex' gave return code 256" ,
114+ }, ' \n ' )
115+ local diagnostics = presets .latex .error_parser (stderr , tex_ctx )
116+ assert .is_table (diagnostics )
117+ assert .is_true (# diagnostics > 0 )
118+ assert .are .equal (9 , diagnostics [1 ].lnum )
119+ assert .are .equal (0 , diagnostics [1 ].col )
120+ assert .are .equal (' Undefined control sequence.' , diagnostics [1 ].message )
121+ assert .are .equal (vim .diagnostic .severity .ERROR , diagnostics [1 ].severity )
122+ end )
123+
124+ it (' parses collected error summary' , function ()
125+ local stderr = table.concat ({
126+ ' Latexmk: Errors, so I did not complete making targets' ,
127+ ' Collected error summary (may duplicate other messages):' ,
128+ " pdflatex: Command for 'pdflatex' gave return code 256" ,
129+ }, ' \n ' )
130+ local diagnostics = presets .latex .error_parser (stderr , tex_ctx )
131+ assert .is_table (diagnostics )
132+ assert .are .equal (1 , # diagnostics )
133+ assert .are .equal (0 , diagnostics [1 ].lnum )
134+ assert .are .equal (0 , diagnostics [1 ].col )
135+ assert .are .equal (
136+ " pdflatex: Command for 'pdflatex' gave return code 256" ,
137+ diagnostics [1 ].message
138+ )
139+ end )
140+
141+ it (' returns empty table for clean stderr' , function ()
142+ local diagnostics = presets .latex .error_parser (' ' , tex_ctx )
143+ assert .are .same ({}, diagnostics )
144+ end )
78145 end )
79146
80147 describe (' markdown' , function ()
@@ -117,6 +184,43 @@ describe('presets', function()
117184 it (' has open enabled' , function ()
118185 assert .is_true (presets .markdown .open )
119186 end )
187+
188+ it (' parses pandoc parse errors from stderr' , function ()
189+ local stderr = ' Error at "source" (line 75, column 1): unexpected end of input'
190+ local diagnostics = presets .markdown .error_parser (stderr , md_ctx )
191+ assert .is_table (diagnostics )
192+ assert .are .equal (1 , # diagnostics )
193+ assert .are .equal (74 , diagnostics [1 ].lnum )
194+ assert .are .equal (0 , diagnostics [1 ].col )
195+ assert .are .equal (' unexpected end of input' , diagnostics [1 ].message )
196+ assert .are .equal (vim .diagnostic .severity .ERROR , diagnostics [1 ].severity )
197+ end )
198+
199+ it (' parses YAML parse exceptions from stderr' , function ()
200+ local stderr =
201+ ' YAML parse exception at line 3, column 2, while scanning a block scalar: did not find expected comment or line break'
202+ local diagnostics = presets .markdown .error_parser (stderr , md_ctx )
203+ assert .is_table (diagnostics )
204+ assert .are .equal (1 , # diagnostics )
205+ assert .are .equal (2 , diagnostics [1 ].lnum )
206+ assert .are .equal (1 , diagnostics [1 ].col )
207+ assert .is_string (diagnostics [1 ].message )
208+ end )
209+
210+ it (' parses generic pandoc errors from stderr' , function ()
211+ local stderr = ' pandoc: Could not find data file templates/default.html5'
212+ local diagnostics = presets .markdown .error_parser (stderr , md_ctx )
213+ assert .is_table (diagnostics )
214+ assert .are .equal (1 , # diagnostics )
215+ assert .are .equal (0 , diagnostics [1 ].lnum )
216+ assert .are .equal (0 , diagnostics [1 ].col )
217+ assert .are .equal (' Could not find data file templates/default.html5' , diagnostics [1 ].message )
218+ end )
219+
220+ it (' returns empty table for clean stderr' , function ()
221+ local diagnostics = presets .markdown .error_parser (' ' , md_ctx )
222+ assert .are .same ({}, diagnostics )
223+ end )
120224 end )
121225
122226 describe (' github' , function ()
@@ -179,5 +283,21 @@ describe('presets', function()
179283 it (' has open enabled' , function ()
180284 assert .is_true (presets .github .open )
181285 end )
286+
287+ it (' parses pandoc parse errors from stderr' , function ()
288+ local stderr = ' Error at "document.md" (line 12, column 5): unexpected "}" expecting letter'
289+ local diagnostics = presets .github .error_parser (stderr , md_ctx )
290+ assert .is_table (diagnostics )
291+ assert .are .equal (1 , # diagnostics )
292+ assert .are .equal (11 , diagnostics [1 ].lnum )
293+ assert .are .equal (4 , diagnostics [1 ].col )
294+ assert .are .equal (' unexpected "}" expecting letter' , diagnostics [1 ].message )
295+ assert .are .equal (vim .diagnostic .severity .ERROR , diagnostics [1 ].severity )
296+ end )
297+
298+ it (' returns empty table for clean stderr' , function ()
299+ local diagnostics = presets .github .error_parser (' ' , md_ctx )
300+ assert .are .same ({}, diagnostics )
301+ end )
182302 end )
183303end )
0 commit comments