github.com/huner2/gomarkdoc@v0.3.6/lang/func_test.go (about) 1 package lang_test 2 3 import ( 4 "errors" 5 "strings" 6 "testing" 7 8 "github.com/matryer/is" 9 "github.com/huner2/gomarkdoc/lang" 10 "github.com/huner2/gomarkdoc/logger" 11 ) 12 13 func TestFunc_Level_standalone(t *testing.T) { 14 is := is.New(t) 15 16 fn, err := loadFunc("../testData/lang/function", "Standalone") 17 is.NoErr(err) 18 19 is.Equal(fn.Level(), 2) 20 } 21 22 func TestFunc_Level_receiver(t *testing.T) { 23 is := is.New(t) 24 25 fn, err := loadFunc("../testData/lang/function", "WithReceiver") 26 is.NoErr(err) 27 28 is.Equal(fn.Level(), 3) 29 } 30 31 func TestFunc_Level_initializer(t *testing.T) { 32 is := is.New(t) 33 34 fn, err := loadFunc("../testData/lang/function", "New") 35 is.NoErr(err) 36 37 is.Equal(fn.Level(), 3) 38 } 39 40 func TestFunc_Name_standalone(t *testing.T) { 41 is := is.New(t) 42 43 fn, err := loadFunc("../testData/lang/function", "Standalone") 44 is.NoErr(err) 45 46 is.Equal(fn.Name(), "Standalone") 47 } 48 49 func TestFunc_Name_receiver(t *testing.T) { 50 is := is.New(t) 51 52 fn, err := loadFunc("../testData/lang/function", "WithReceiver") 53 is.NoErr(err) 54 55 is.Equal(fn.Name(), "WithReceiver") 56 } 57 58 func TestFunc_Receiver_standalone(t *testing.T) { 59 is := is.New(t) 60 61 fn, err := loadFunc("../testData/lang/function", "Standalone") 62 is.NoErr(err) 63 64 is.Equal(fn.Receiver(), "") 65 } 66 67 func TestFunc_Receiver_receiver(t *testing.T) { 68 is := is.New(t) 69 70 fn, err := loadFunc("../testData/lang/function", "WithReceiver") 71 is.NoErr(err) 72 73 is.Equal(fn.Receiver(), "Receiver") 74 } 75 76 func TestFunc_Doc(t *testing.T) { 77 is := is.New(t) 78 79 fn, err := loadFunc("../testData/lang/function", "Standalone") 80 is.NoErr(err) 81 82 doc := fn.Doc() 83 blocks := doc.Blocks() 84 is.Equal(len(blocks), 5) 85 86 is.Equal(blocks[0].Kind(), lang.ParagraphBlock) 87 is.Equal(blocks[0].Level(), 3) 88 is.Equal(blocks[0].Text(), "Standalone provides a function that is not part of a type.") 89 90 is.Equal(blocks[1].Kind(), lang.ParagraphBlock) 91 is.Equal(blocks[1].Level(), 3) 92 is.Equal(blocks[1].Text(), "Additional description can be provided in subsequent paragraphs, including code blocks and headers") 93 94 is.Equal(blocks[2].Kind(), lang.HeaderBlock) 95 is.Equal(blocks[2].Level(), 3) 96 is.Equal(blocks[2].Text(), "Header A") 97 98 is.Equal(blocks[3].Kind(), lang.ParagraphBlock) 99 is.Equal(blocks[3].Level(), 3) 100 is.Equal(blocks[3].Text(), "This section contains a code block.") 101 102 is.Equal(blocks[4].Kind(), lang.CodeBlock) 103 is.Equal(blocks[4].Level(), 3) 104 is.Equal(blocks[4].Text(), "Code Block\nMore of Code Block\n") 105 } 106 107 func TestFunc_Location(t *testing.T) { 108 is := is.New(t) 109 110 fn, err := loadFunc("../testData/lang/function", "Standalone") 111 is.NoErr(err) 112 113 loc := fn.Location() 114 is.Equal(loc.Start.Line, 14) 115 is.Equal(loc.Start.Col, 1) 116 is.Equal(loc.End.Line, 14) 117 is.Equal(loc.End.Col, 48) 118 is.True(strings.HasSuffix(loc.Filepath, "func.go")) 119 } 120 121 func TestFunc_stringsCompare(t *testing.T) { 122 is := is.New(t) 123 124 buildPkg, err := getBuildPackage("strings") 125 is.NoErr(err) 126 127 log := logger.New(logger.ErrorLevel) 128 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 129 is.NoErr(err) 130 131 var fn *lang.Func 132 for _, f := range pkg.Funcs() { 133 if f.Name() == "Compare" { 134 fn = f 135 break 136 } 137 } 138 139 is.True(fn != nil) // didn't find the function we were looking for 140 141 sig, err := fn.Signature() 142 is.NoErr(err) 143 144 is.Equal(fn.Name(), "Compare") 145 is.Equal(fn.Level(), 2) 146 is.Equal(fn.Title(), "func Compare") 147 is.Equal(fn.Summary(), "Compare returns an integer comparing two strings lexicographically.") 148 is.Equal(sig, "func Compare(a, b string) int") 149 is.Equal(len(fn.Examples()), 1) 150 } 151 152 func TestFunc_textScannerInit(t *testing.T) { 153 is := is.New(t) 154 155 buildPkg, err := getBuildPackage("text/scanner") 156 is.NoErr(err) 157 158 log := logger.New(logger.ErrorLevel) 159 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 160 is.NoErr(err) 161 162 var typ *lang.Type 163 for _, t := range pkg.Types() { 164 if t.Name() == "Scanner" { 165 typ = t 166 break 167 } 168 } 169 is.True(typ != nil) 170 171 var fn *lang.Func 172 for _, f := range typ.Methods() { 173 if f.Name() == "Init" { 174 fn = f 175 break 176 } 177 } 178 179 is.True(fn != nil) // didn't find the function we were looking for 180 181 sig, err := fn.Signature() 182 is.NoErr(err) 183 184 is.Equal(fn.Name(), "Init") 185 is.Equal(fn.Level(), 3) 186 is.Equal(fn.Title(), "func (*Scanner) Init") 187 is.Equal(fn.Summary(), "Init initializes a Scanner with a new source and returns s.") 188 is.Equal(sig, "func (s *Scanner) Init(src io.Reader) *Scanner") 189 is.Equal(len(fn.Examples()), 0) 190 } 191 192 func TestFunc_ioIoutilTempFile(t *testing.T) { 193 is := is.New(t) 194 195 buildPkg, err := getBuildPackage("io/ioutil") 196 is.NoErr(err) 197 198 log := logger.New(logger.ErrorLevel) 199 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 200 is.NoErr(err) 201 202 var fn *lang.Func 203 for _, f := range pkg.Funcs() { 204 if f.Name() == "TempFile" { 205 fn = f 206 break 207 } 208 } 209 210 is.True(fn != nil) // didn't find the function we were looking for 211 212 sig, err := fn.Signature() 213 is.NoErr(err) 214 215 is.Equal(fn.Name(), "TempFile") 216 is.Equal(fn.Level(), 2) 217 is.Equal(fn.Title(), "func TempFile") 218 is.Equal(fn.Summary(), "TempFile creates a new temporary file in the directory dir, opens the file for reading and writing, and returns the resulting *os.File.") 219 is.Equal(sig, "func TempFile(dir, pattern string) (f *os.File, err error)") 220 is.Equal(len(fn.Examples()), 2) 221 } 222 223 func loadFunc(dir, name string) (*lang.Func, error) { 224 buildPkg, err := getBuildPackage(dir) 225 if err != nil { 226 return nil, err 227 } 228 229 log := logger.New(logger.ErrorLevel) 230 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 231 if err != nil { 232 return nil, err 233 } 234 235 for _, f := range pkg.Funcs() { 236 if f.Name() == name { 237 return f, nil 238 } 239 } 240 241 for _, t := range pkg.Types() { 242 for _, f := range t.Funcs() { 243 if f.Name() == name { 244 return f, nil 245 } 246 } 247 248 for _, f := range t.Methods() { 249 if f.Name() == name { 250 return f, nil 251 } 252 } 253 } 254 255 return nil, errors.New("func not found") 256 }