Skip to content

Commit 94d944b

Browse files
committed
Add regression test for lexer errors in doc code blocks
Exercises six Lexer.Error variants triggered from inside {@ocaml[...]} blocks. The expected .err files capture the current behaviour: the catch-all branch at lib/Fmt_ast.ml stringifies the exception as "invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)", which is unreadable. The next commit replaces these with human-readable messages, and this test pins the change.
1 parent 2d5d8c1 commit 94d944b

11 files changed

Lines changed: 296 additions & 0 deletions

test/passing/gen/dune.inc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1694,6 +1694,24 @@
16941694
(package ocamlformat)
16951695
(action (diff doc_comments_padding.ml.err doc_comments_padding.ml.stderr)))
16961696

1697+
(rule
1698+
(deps .ocamlformat)
1699+
(package ocamlformat)
1700+
(action
1701+
(with-stdout-to doc_lexer_errors.mld.stdout
1702+
(with-stderr-to doc_lexer_errors.mld.stderr
1703+
(run %{bin:ocamlformat} --name doc_lexer_errors.mld --margin-check --parse-toplevel-phrases %{dep:../tests/doc_lexer_errors.mld})))))
1704+
1705+
(rule
1706+
(alias runtest)
1707+
(package ocamlformat)
1708+
(action (diff doc_lexer_errors.mld.ref doc_lexer_errors.mld.stdout)))
1709+
1710+
(rule
1711+
(alias runtest)
1712+
(package ocamlformat)
1713+
(action (diff doc_lexer_errors.mld.err doc_lexer_errors.mld.stderr)))
1714+
16971715
(rule
16981716
(deps .ocamlformat)
16991717
(package ocamlformat)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Warning: Invalid documentation comment:
2+
File "doc_lexer_errors.mld", line 9, character 8 to line 11, character 0:
3+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(1, _)
4+
Warning: Invalid documentation comment:
5+
File "doc_lexer_errors.mld", line 15, character 8 to line 17, character 0:
6+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(0, _)
7+
Warning: Invalid documentation comment:
8+
File "doc_lexer_errors.mld", line 21, character 8 to line 23, character 0:
9+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
10+
Warning: Invalid documentation comment:
11+
File "doc_lexer_errors.mld", line 27, character 8 to line 29, character 0:
12+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
13+
Warning: Invalid documentation comment:
14+
File "doc_lexer_errors.mld", line 33, character 8 to line 35, character 0:
15+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
16+
Warning: Invalid documentation comment:
17+
File "doc_lexer_errors.mld", line 39, character 8 to line 41, character 0:
18+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Regression test for readable lexer error messages in OCaml code blocks.
2+
3+
Each block below triggers a different Lexer.Error variant; without the fix, all
4+
of them would report the cryptic "invalid code block:
5+
Ocamlformat_parser_extended.Lexer.Error" form.
6+
7+
Empty character literal:
8+
9+
{@ocaml[
10+
let _ = ''
11+
]}
12+
13+
Unterminated string:
14+
15+
{@ocaml[
16+
let _ = "abc
17+
]}
18+
19+
Unterminated comment:
20+
21+
{@ocaml[
22+
let _ = (* abc
23+
]}
24+
25+
Invalid literal:
26+
27+
{@ocaml[
28+
let _ = 0xz
29+
]}
30+
31+
Capitalized label:
32+
33+
{@ocaml[
34+
let _ = f ~Foo:1
35+
]}
36+
37+
Keyword used as label:
38+
39+
{@ocaml[
40+
let _ = f ~let:1
41+
]}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Warning: Invalid documentation comment:
2+
File "doc_lexer_errors.mld", line 9, character 8 to line 11, character 0:
3+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(1, _)
4+
Warning: Invalid documentation comment:
5+
File "doc_lexer_errors.mld", line 15, character 8 to line 17, character 0:
6+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(0, _)
7+
Warning: Invalid documentation comment:
8+
File "doc_lexer_errors.mld", line 21, character 8 to line 23, character 0:
9+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
10+
Warning: Invalid documentation comment:
11+
File "doc_lexer_errors.mld", line 27, character 8 to line 29, character 0:
12+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
13+
Warning: Invalid documentation comment:
14+
File "doc_lexer_errors.mld", line 33, character 8 to line 35, character 0:
15+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
16+
Warning: Invalid documentation comment:
17+
File "doc_lexer_errors.mld", line 39, character 8 to line 41, character 0:
18+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Regression test for readable lexer error messages in OCaml code blocks.
2+
3+
Each block below triggers a different Lexer.Error variant; without the fix, all
4+
of them would report the cryptic "invalid code block:
5+
Ocamlformat_parser_extended.Lexer.Error" form.
6+
7+
Empty character literal:
8+
9+
{@ocaml[
10+
let _ = ''
11+
]}
12+
13+
Unterminated string:
14+
15+
{@ocaml[
16+
let _ = "abc
17+
]}
18+
19+
Unterminated comment:
20+
21+
{@ocaml[
22+
let _ = (* abc
23+
]}
24+
25+
Invalid literal:
26+
27+
{@ocaml[
28+
let _ = 0xz
29+
]}
30+
31+
Capitalized label:
32+
33+
{@ocaml[
34+
let _ = f ~Foo:1
35+
]}
36+
37+
Keyword used as label:
38+
39+
{@ocaml[
40+
let _ = f ~let:1
41+
]}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Warning: Invalid documentation comment:
2+
File "doc_lexer_errors.mld", line 9, character 8 to line 11, character 0:
3+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(1, _)
4+
Warning: Invalid documentation comment:
5+
File "doc_lexer_errors.mld", line 15, character 8 to line 17, character 0:
6+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(0, _)
7+
Warning: Invalid documentation comment:
8+
File "doc_lexer_errors.mld", line 21, character 8 to line 23, character 0:
9+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
10+
Warning: Invalid documentation comment:
11+
File "doc_lexer_errors.mld", line 27, character 8 to line 29, character 0:
12+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
13+
Warning: Invalid documentation comment:
14+
File "doc_lexer_errors.mld", line 33, character 8 to line 35, character 0:
15+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
16+
Warning: Invalid documentation comment:
17+
File "doc_lexer_errors.mld", line 39, character 8 to line 41, character 0:
18+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Regression test for readable lexer error messages in OCaml code blocks.
2+
3+
Each block below triggers a different Lexer.Error variant; without the
4+
fix, all of them would report the cryptic
5+
"invalid code block: Ocamlformat_parser_extended.Lexer.Error" form.
6+
7+
Empty character literal:
8+
9+
{@ocaml[
10+
let _ = ''
11+
]}
12+
13+
Unterminated string:
14+
15+
{@ocaml[
16+
let _ = "abc
17+
]}
18+
19+
Unterminated comment:
20+
21+
{@ocaml[
22+
let _ = (* abc
23+
]}
24+
25+
Invalid literal:
26+
27+
{@ocaml[
28+
let _ = 0xz
29+
]}
30+
31+
Capitalized label:
32+
33+
{@ocaml[
34+
let _ = f ~Foo:1
35+
]}
36+
37+
Keyword used as label:
38+
39+
{@ocaml[
40+
let _ = f ~let:1
41+
]}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Warning: Invalid documentation comment:
2+
File "doc_lexer_errors.mld", line 9, character 8 to line 11, character 0:
3+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(1, _)
4+
Warning: Invalid documentation comment:
5+
File "doc_lexer_errors.mld", line 15, character 8 to line 17, character 0:
6+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(0, _)
7+
Warning: Invalid documentation comment:
8+
File "doc_lexer_errors.mld", line 21, character 8 to line 23, character 0:
9+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
10+
Warning: Invalid documentation comment:
11+
File "doc_lexer_errors.mld", line 27, character 8 to line 29, character 0:
12+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
13+
Warning: Invalid documentation comment:
14+
File "doc_lexer_errors.mld", line 33, character 8 to line 35, character 0:
15+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
16+
Warning: Invalid documentation comment:
17+
File "doc_lexer_errors.mld", line 39, character 8 to line 41, character 0:
18+
invalid code block: Ocamlformat_parser_extended.Lexer.Error(_, _)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Regression test for readable lexer error messages in OCaml code blocks.
2+
3+
Each block below triggers a different Lexer.Error variant; without the fix, all
4+
of them would report the cryptic "invalid code block:
5+
Ocamlformat_parser_extended.Lexer.Error" form.
6+
7+
Empty character literal:
8+
9+
{@ocaml[
10+
let _ = ''
11+
]}
12+
13+
Unterminated string:
14+
15+
{@ocaml[
16+
let _ = "abc
17+
]}
18+
19+
Unterminated comment:
20+
21+
{@ocaml[
22+
let _ = (* abc
23+
]}
24+
25+
Invalid literal:
26+
27+
{@ocaml[
28+
let _ = 0xz
29+
]}
30+
31+
Capitalized label:
32+
33+
{@ocaml[
34+
let _ = f ~Foo:1
35+
]}
36+
37+
Keyword used as label:
38+
39+
{@ocaml[
40+
let _ = f ~let:1
41+
]}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Regression test for readable lexer error messages in OCaml code blocks.
2+
3+
Each block below triggers a different Lexer.Error variant; without the
4+
fix, all of them would report the cryptic
5+
"invalid code block: Ocamlformat_parser_extended.Lexer.Error" form.
6+
7+
Empty character literal:
8+
9+
{@ocaml[
10+
let _ = ''
11+
]}
12+
13+
Unterminated string:
14+
15+
{@ocaml[
16+
let _ = "abc
17+
]}
18+
19+
Unterminated comment:
20+
21+
{@ocaml[
22+
let _ = (* abc
23+
]}
24+
25+
Invalid literal:
26+
27+
{@ocaml[
28+
let _ = 0xz
29+
]}
30+
31+
Capitalized label:
32+
33+
{@ocaml[
34+
let _ = f ~Foo:1
35+
]}
36+
37+
Keyword used as label:
38+
39+
{@ocaml[
40+
let _ = f ~let:1
41+
]}

0 commit comments

Comments
 (0)