| 1 | // vtest build: tinyc && !musl? && !sanitized_job? |
| 2 | import os |
| 3 | import document as doc |
| 4 | |
| 5 | // fn test_generate_with_pos() {} |
| 6 | // fn test_generate() {} |
| 7 | // fn test_generate_from_ast() {} |
| 8 | fn 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 | |
| 21 | fn 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] |
| 32 | pub 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] |
| 44 | pub struct EndOptions { |
| 45 | pub: |
| 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] |
| 55 | pub struct PipelineContainer { |
| 56 | pub 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 | |
| 66 | fn 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 | |
| 88 | fn 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 | |
| 97 | fn test_merge_doc_comments_preserves_readme_markdown() { |
| 98 | readme := '# Description |
| 99 | |
| 100 | `regex` is a small but powerful regular expression library, |
| 101 | written in pure V. |
| 102 | |
| 103 | 1. 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 | |
| 118 | fn 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. |
| 131 | pub enum Foo { |
| 132 | foo |
| 133 | } |
| 134 | |
| 135 | // Bar ipsum lorem bar. |
| 136 | pub 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 | |
| 149 | fn 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 | |
| 163 | pub 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 | |