github.com/jd-ly/tools@v0.5.7/internal/lsp/source/comment_test.go (about)

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