v2 / cmd / tools / vdoc / document / doc_test.v
172 lines · 150 sloc · 4.32 KB · 57238a1c6da6e94fbe5373add35e273d4430d34c
Raw
1// vtest build: tinyc && !musl? && !sanitized_job?
2import os
3import document as doc
4
5// fn test_generate_with_pos() {}
6// fn test_generate() {}
7// fn test_generate_from_ast() {}
8fn test_generate_from_mod() {
9 nested_mod_name := 'net.http.chunked'
10 nested_mod_doc := doc.generate_from_mod(nested_mod_name, false, true) or {
11 eprintln(err)
12 assert false
13 doc.Doc{}
14 }
15 assert nested_mod_doc.head.name == nested_mod_name
16 assert nested_mod_doc.head.content == 'module ${nested_mod_name}'
17 assert nested_mod_doc.contents.len == 3
18 assert nested_mod_doc.contents['ChunkScanner'].children.len == 3
19}
20
21fn test_tags_with_flag_struct_attribute() {
22 mod_name := 'gg'
23 mod_doc := doc.generate_from_mod(mod_name, false, true) or {
24 eprintln(err)
25 assert false
26 doc.Doc{}
27 }
28 assert mod_doc.head.name == mod_name
29
30 mouse_buttons := mod_doc.contents['MouseButtons']!
31 assert mouse_buttons.content == '@[flag]
32pub enum MouseButtons {
33 left
34 right
35 middle
36}'
37 assert mouse_buttons.attrs == {
38 'flag': '@[flag]'
39 }
40 assert mouse_buttons.tags == ['@[flag]']
41
42 end_options := mod_doc.contents['EndOptions']
43 assert end_options.content == '@[params]
44pub struct EndOptions {
45pub:
46 how EndEnum
47}'
48 assert end_options.attrs == {
49 'params': '@[params]'
50 }
51 assert end_options.tags == ['@[params]']
52
53 pipeline_container := mod_doc.contents['PipelineContainer']
54 assert pipeline_container.content == '@[heap]
55pub struct PipelineContainer {
56pub mut:
57 alpha sgl.Pipeline
58 add sgl.Pipeline
59}'
60 assert pipeline_container.attrs == {
61 'heap': '@[heap]'
62 }
63 assert pipeline_container.tags == ['@[heap]']
64}
65
66fn test_generated_enum_helpers_are_documented() {
67 mod_doc := doc.generate_from_mod('gg', false, true) or {
68 eprintln(err)
69 assert false
70 doc.Doc{}
71 }
72
73 mouse_buttons := mod_doc.contents['MouseButtons']!
74 mouse_button_methods := mouse_buttons.children.filter(it.kind == .method).map(it.name)
75 assert 'all' in mouse_button_methods
76 assert 'has' in mouse_button_methods
77 assert 'is_empty' in mouse_button_methods
78
79 mouse_buttons_from := mod_doc.contents['MouseButtons.from']!
80 assert mouse_buttons_from.kind == .method
81 assert mouse_buttons_from.content.contains('MouseButtons.from')
82
83 mouse_buttons_zero := mod_doc.contents['MouseButtons.zero']!
84 assert mouse_buttons_zero.kind == .method
85 assert mouse_buttons_zero.content.contains('MouseButtons.zero')
86}
87
88fn test_merge_doc_comments_keeps_blockquotes_on_separate_lines() {
89 comments := [
90 doc.DocComment{
91 text: '> **Note**\n> line one\n> line two'
92 },
93 ]
94 assert doc.merge_doc_comments(comments).trim_space() == '> **Note**\n> line one\n> line two'
95}
96
97fn test_merge_doc_comments_preserves_readme_markdown() {
98 readme := '# Description
99
100`regex` is a small but powerful regular expression library,
101written in pure V.
102
1031. The basic atomic elements of this regex engine are the tokens.
104 In a query string a simple character is a token.
105
106> **Note**
107> `regex` is *not* PCRE compatible.
108'
109 comments := [
110 doc.DocComment{
111 is_readme: true
112 text: readme
113 },
114 ]
115 assert doc.merge_doc_comments(comments) == readme
116}
117
118fn test_enum_comments_after_top_level_comptime_if_are_documented() {
119 mod_dir := os.join_path(os.vtmp_dir(), 'vdoc_issue_23338_${os.getpid()}')
120 os.rmdir_all(mod_dir) or {}
121 os.mkdir_all(mod_dir)!
122 defer {
123 os.rmdir_all(mod_dir) or {}
124 }
125 os.write_file(os.join_path(mod_dir, 'issue_23338.v'), 'module issue_23338
126
127\$if macos {
128}
129
130// Foo lorem ipsum foo.
131pub enum Foo {
132 foo
133}
134
135// Bar ipsum lorem bar.
136pub enum Bar {
137 bar
138}
139')!
140 mod_doc := doc.generate(mod_dir, false, true, .auto) or {
141 eprintln(err)
142 assert false
143 doc.Doc{}
144 }
145 assert mod_doc.contents['Foo']!.merge_comments_without_examples() == 'Foo lorem ipsum foo.'
146 assert mod_doc.contents['Bar']!.merge_comments_without_examples() == 'Bar ipsum lorem bar.'
147}
148
149fn test_module_comments_after_top_level_comptime_if_stay_on_module() {
150 mod_dir := os.join_path(os.vtmp_dir(), 'vdoc_issue_23338_module_${os.getpid()}')
151 os.rmdir_all(mod_dir) or {}
152 os.mkdir_all(mod_dir)!
153 defer {
154 os.rmdir_all(mod_dir) or {}
155 }
156 os.write_file(os.join_path(mod_dir, 'issue_23338.v'), 'module issue_23338
157
158\$if macos {
159}
160
161// `issue_23338` module overview.
162
163pub fn foo() {}
164')!
165 mod_doc := doc.generate(mod_dir, false, true, .auto) or {
166 eprintln(err)
167 assert false
168 doc.Doc{}
169 }
170 assert mod_doc.head.merge_comments_without_examples() == '`issue_23338` module overview.'
171 assert mod_doc.contents['foo']!.comments.len == 0
172}
173