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  }