github.com/v2fly/tools@v0.100.0/internal/lsp/source/comment_test.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package source 6 7 import ( 8 "bytes" 9 "reflect" 10 "strings" 11 "testing" 12 ) 13 14 // This file is a copy of go/doc/comment_test.go with the exception for 15 // the test cases for TestEmphasize and TestCommentEscape 16 17 var headingTests = []struct { 18 line string 19 ok bool 20 }{ 21 {"Section", true}, 22 {"A typical usage", true}, 23 {"ΔΛΞ is Greek", true}, 24 {"Foo 42", true}, 25 {"", false}, 26 {"section", false}, 27 {"A typical usage:", false}, 28 {"This code:", false}, 29 {"δ is Greek", false}, 30 {"Foo §", false}, 31 {"Fermat's Last Sentence", true}, 32 {"Fermat's", true}, 33 {"'sX", false}, 34 {"Ted 'Too' Bar", false}, 35 {"Use n+m", false}, 36 {"Scanning:", false}, 37 {"N:M", false}, 38 } 39 40 func TestIsHeading(t *testing.T) { 41 for _, tt := range headingTests { 42 if h := heading(tt.line); (len(h) > 0) != tt.ok { 43 t.Errorf("isHeading(%q) = %v, want %v", tt.line, h, tt.ok) 44 } 45 } 46 } 47 48 var blocksTests = []struct { 49 in string 50 out []block 51 text string 52 }{ 53 { 54 in: `Para 1. 55 Para 1 line 2. 56 57 Para 2. 58 59 Section 60 61 Para 3. 62 63 pre 64 pre1 65 66 Para 4. 67 68 pre 69 pre1 70 71 pre2 72 73 Para 5. 74 75 76 pre 77 78 79 pre1 80 pre2 81 82 Para 6. 83 pre 84 pre2 85 `, 86 out: []block{ 87 {opPara, []string{"Para 1.\n", "Para 1 line 2.\n"}}, 88 {opPara, []string{"Para 2.\n"}}, 89 {opHead, []string{"Section"}}, 90 {opPara, []string{"Para 3.\n"}}, 91 {opPre, []string{"pre\n", "pre1\n"}}, 92 {opPara, []string{"Para 4.\n"}}, 93 {opPre, []string{"pre\n", "pre1\n", "\n", "pre2\n"}}, 94 {opPara, []string{"Para 5.\n"}}, 95 {opPre, []string{"pre\n", "\n", "\n", "pre1\n", "pre2\n"}}, 96 {opPara, []string{"Para 6.\n"}}, 97 {opPre, []string{"pre\n", "pre2\n"}}, 98 }, 99 text: `. Para 1. Para 1 line 2. 100 101 . Para 2. 102 103 104 . Section 105 106 . Para 3. 107 108 $ pre 109 $ pre1 110 111 . Para 4. 112 113 $ pre 114 $ pre1 115 116 $ pre2 117 118 . Para 5. 119 120 $ pre 121 122 123 $ pre1 124 $ pre2 125 126 . Para 6. 127 128 $ pre 129 $ pre2 130 `, 131 }, 132 { 133 in: "Para.\n\tshould not be ``escaped''", 134 out: []block{ 135 {opPara, []string{"Para.\n"}}, 136 {opPre, []string{"should not be ``escaped''"}}, 137 }, 138 text: ". Para.\n\n$ should not be ``escaped''", 139 }, 140 { 141 in: "// A very long line of 46 char for line wrapping.", 142 out: []block{ 143 {opPara, []string{"// A very long line of 46 char for line wrapping."}}, 144 }, 145 text: `. // A very long line of 46 char for line 146 . // wrapping. 147 `, 148 }, 149 { 150 in: `/* A very long line of 46 char for line wrapping. 151 A very long line of 46 char for line wrapping. */`, 152 out: []block{ 153 {opPara, []string{"/* A very long line of 46 char for line wrapping.\n", "A very long line of 46 char for line wrapping. */"}}, 154 }, 155 text: `. /* A very long line of 46 char for line 156 . wrapping. A very long line of 46 char 157 . for line wrapping. */ 158 `, 159 }, 160 } 161 162 func TestBlocks(t *testing.T) { 163 for i, tt := range blocksTests { 164 b := blocks(tt.in) 165 if !reflect.DeepEqual(b, tt.out) { 166 t.Errorf("#%d: mismatch\nhave: %v\nwant: %v", i, b, tt.out) 167 } 168 } 169 } 170 171 // This has been modified from go/doc to use markdown links instead of html ones 172 // and use markdown escaping instead oh html 173 var emphasizeTests = []struct { 174 in, out string 175 }{ 176 {"", ""}, 177 {"http://[::1]:8080/foo.txt", `[http\:\/\/\[\:\:1\]\:8080\/foo\.txt](http://[::1]:8080/foo.txt)`}, 178 {"before (https://www.google.com) after", `before \([https\:\/\/www\.google\.com](https://www.google.com)\) after`}, 179 {"before https://www.google.com:30/x/y/z:b::c. After", `before [https\:\/\/www\.google\.com\:30\/x\/y\/z\:b\:\:c](https://www.google.com:30/x/y/z:b::c)\. After`}, 180 {"http://www.google.com/path/:;!-/?query=%34b#093124", `[http\:\/\/www\.google\.com\/path\/\:\;\!\-\/\?query\=\%34b\#093124](http://www.google.com/path/:;!-/?query=%34b#093124)`}, 181 {"http://www.google.com/path/:;!-/?query=%34bar#093124", `[http\:\/\/www\.google\.com\/path\/\:\;\!\-\/\?query\=\%34bar\#093124](http://www.google.com/path/:;!-/?query=%34bar#093124)`}, 182 {"http://www.google.com/index.html! After", `[http\:\/\/www\.google\.com\/index\.html](http://www.google.com/index.html)\! After`}, 183 {"http://www.google.com/", `[http\:\/\/www\.google\.com\/](http://www.google.com/)`}, 184 {"https://www.google.com/", `[https\:\/\/www\.google\.com\/](https://www.google.com/)`}, 185 {"http://www.google.com/path.", `[http\:\/\/www\.google\.com\/path](http://www.google.com/path)\.`}, 186 {"http://en.wikipedia.org/wiki/Camellia_(cipher)", `[http\:\/\/en\.wikipedia\.org\/wiki\/Camellia\_\(cipher\)](http://en.wikipedia.org/wiki/Camellia_\(cipher\))`}, 187 {"(http://www.google.com/)", `\([http\:\/\/www\.google\.com\/](http://www.google.com/)\)`}, 188 {"http://gmail.com)", `[http\:\/\/gmail\.com](http://gmail.com)\)`}, 189 {"((http://gmail.com))", `\(\([http\:\/\/gmail\.com](http://gmail.com)\)\)`}, 190 {"http://gmail.com ((http://gmail.com)) ()", `[http\:\/\/gmail\.com](http://gmail.com) \(\([http\:\/\/gmail\.com](http://gmail.com)\)\) \(\)`}, 191 {"Foo bar http://example.com/ quux!", `Foo bar [http\:\/\/example\.com\/](http://example.com/) quux\!`}, 192 {"Hello http://example.com/%2f/ /world.", `Hello [http\:\/\/example\.com\/\%2f\/](http://example.com/%2f/) \/world\.`}, 193 {"Lorem http: ipsum //host/path", `Lorem http\: ipsum \/\/host\/path`}, 194 {"javascript://is/not/linked", `javascript\:\/\/is\/not\/linked`}, 195 {"http://foo", `[http\:\/\/foo](http://foo)`}, 196 {"art by [[https://www.example.com/person/][Person Name]]", `art by \[\[[https\:\/\/www\.example\.com\/person\/](https://www.example.com/person/)\]\[Person Name\]\]`}, 197 {"please visit (http://golang.org/)", `please visit \([http\:\/\/golang\.org\/](http://golang.org/)\)`}, 198 {"please visit http://golang.org/hello())", `please visit [http\:\/\/golang\.org\/hello\(\)](http://golang.org/hello\(\))\)`}, 199 {"http://git.qemu.org/?p=qemu.git;a=blob;f=qapi-schema.json;hb=HEAD", `[http\:\/\/git\.qemu\.org\/\?p\=qemu\.git\;a\=blob\;f\=qapi\-schema\.json\;hb\=HEAD](http://git.qemu.org/?p=qemu.git;a=blob;f=qapi-schema.json;hb=HEAD)`}, 200 {"https://foo.bar/bal/x(])", `[https\:\/\/foo\.bar\/bal\/x\(](https://foo.bar/bal/x\()\]\)`}, 201 {"foo [ http://bar(])", `foo \[ [http\:\/\/bar\(](http://bar\()\]\)`}, 202 } 203 204 func TestEmphasize(t *testing.T) { 205 for i, tt := range emphasizeTests { 206 var buf bytes.Buffer 207 emphasize(&buf, tt.in, true) 208 out := buf.String() 209 if out != tt.out { 210 t.Errorf("#%d: mismatch\nhave: %v\nwant: %v", i, out, tt.out) 211 } 212 } 213 } 214 215 func TestCommentEscape(t *testing.T) { 216 //ldquo -> ulquo and rdquo -> urquo 217 commentTests := []struct { 218 in, out string 219 }{ 220 {"typically invoked as ``go tool asm'',", "typically invoked as " + ulquo + "go tool asm" + urquo + ","}, 221 {"For more detail, run ``go help test'' and ``go help testflag''", "For more detail, run " + ulquo + "go help test" + urquo + " and " + ulquo + "go help testflag" + urquo}} 222 for i, tt := range commentTests { 223 var buf strings.Builder 224 commentEscape(&buf, tt.in, true) 225 out := buf.String() 226 if out != tt.out { 227 t.Errorf("#%d: mismatch\nhave: %q\nwant: %q", i, out, tt.out) 228 } 229 } 230 }