github.com/huner2/gomarkdoc@v0.3.6/lang/package_test.go (about) 1 package lang_test 2 3 import ( 4 "go/build" 5 "os" 6 "path/filepath" 7 "strings" 8 "testing" 9 10 "github.com/matryer/is" 11 "github.com/huner2/gomarkdoc/lang" 12 "github.com/huner2/gomarkdoc/logger" 13 ) 14 15 func TestPackage_Consts(t *testing.T) { 16 is := is.New(t) 17 18 pkg, err := loadPackage("../testData/lang/function") 19 is.NoErr(err) 20 21 consts := pkg.Consts() 22 is.Equal(len(consts), 1) 23 24 decl, err := consts[0].Decl() 25 is.NoErr(err) 26 is.Equal(decl, `const ( 27 ConstA = "string" 28 ConstB = true 29 )`) 30 } 31 32 func TestPackage_Vars(t *testing.T) { 33 is := is.New(t) 34 35 pkg, err := loadPackage("../testData/lang/function") 36 is.NoErr(err) 37 38 vars := pkg.Vars() 39 is.Equal(len(vars), 1) 40 41 decl, err := vars[0].Decl() 42 is.NoErr(err) 43 is.Equal(decl, `var Variable = 5`) 44 } 45 46 func TestPackage_dotImport(t *testing.T) { 47 is := is.New(t) 48 49 err := os.Chdir("../testData/lang/function") 50 is.NoErr(err) 51 52 defer func() { 53 _ = os.Chdir("../../../lang") 54 }() 55 56 pkg, err := loadPackage(".") 57 is.NoErr(err) 58 59 is.Equal(pkg.Import(), `import "github.com/huner2/gomarkdoc/testData/lang/function"`) 60 } 61 62 func TestPackage_strings(t *testing.T) { 63 is := is.New(t) 64 65 buildPkg, err := getBuildPackage("strings") 66 is.NoErr(err) 67 68 log := logger.New(logger.ErrorLevel) 69 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 70 is.NoErr(err) 71 72 is.Equal(pkg.Level(), 1) // level should be root 73 is.True(strings.HasSuffix(pkg.Dir(), filepath.FromSlash("/strings"))) 74 is.Equal(pkg.Dirname(), "strings") 75 is.Equal(pkg.Name(), "strings") 76 is.Equal(pkg.Import(), `import "strings"`) 77 is.Equal(pkg.Summary(), "Package strings implements simple functions to manipulate UTF-8 encoded strings.") 78 is.Equal(len(pkg.Consts()), 0) // strings should have no constants 79 is.Equal(len(pkg.Vars()), 0) // strings should have no vars 80 is.True(len(pkg.Funcs()) > 0) // strings should have top-level functions 81 is.True(len(pkg.Types()) > 0) // strings should have top-level types 82 is.Equal(len(pkg.Examples()), 0) // strings should have no top-level examples 83 } 84 85 func TestPackage_textScanner(t *testing.T) { 86 is := is.New(t) 87 88 buildPkg, err := getBuildPackage("text/scanner") 89 is.NoErr(err) 90 91 log := logger.New(logger.ErrorLevel) 92 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 93 is.NoErr(err) 94 95 is.Equal(pkg.Level(), 1) // level should be root 96 is.True(strings.HasSuffix(pkg.Dir(), filepath.FromSlash("/text/scanner"))) 97 is.Equal(pkg.Dirname(), "scanner") 98 is.Equal(pkg.Name(), "scanner") 99 is.Equal(pkg.Import(), `import "text/scanner"`) 100 is.Equal(pkg.Summary(), "Package scanner provides a scanner and tokenizer for UTF-8-encoded text.") 101 is.True(len(pkg.Consts()) > 0) // text/scanner should have constants 102 is.Equal(len(pkg.Vars()), 0) // text/scanner should have no vars 103 is.True(len(pkg.Funcs()) > 0) // text/scanner should have top-level functions 104 is.True(len(pkg.Types()) > 0) // text/scanner should have top-level types 105 is.True(len(pkg.Examples()) > 0) // text/scanner should have top-level examples 106 } 107 108 func TestPackage_ioIoutil(t *testing.T) { 109 is := is.New(t) 110 111 buildPkg, err := getBuildPackage("io/ioutil") 112 is.NoErr(err) 113 114 log := logger.New(logger.ErrorLevel) 115 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 116 is.NoErr(err) 117 118 is.Equal(pkg.Level(), 1) // level should be root 119 is.True(strings.HasSuffix(pkg.Dir(), filepath.FromSlash("/io/ioutil"))) 120 is.Equal(pkg.Dirname(), "ioutil") 121 is.Equal(pkg.Name(), "ioutil") 122 is.Equal(pkg.Import(), `import "io/ioutil"`) 123 is.Equal(pkg.Summary(), "Package ioutil implements some I/O utility functions.") 124 is.Equal(len(pkg.Consts()), 0) // io/ioutil should have no constants 125 is.True(len(pkg.Vars()) > 0) // io/ioutil should have vars 126 is.True(len(pkg.Funcs()) > 0) // io/ioutil should have top-level functions 127 is.Equal(len(pkg.Types()), 0) // io/ioutil should have no top-level types 128 is.Equal(len(pkg.Examples()), 0) // io/ioutil should have no top-level examples 129 } 130 131 func TestPackage_encoding(t *testing.T) { 132 is := is.New(t) 133 134 buildPkg, err := getBuildPackage("encoding") 135 is.NoErr(err) 136 137 log := logger.New(logger.ErrorLevel) 138 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 139 is.NoErr(err) 140 141 is.Equal(pkg.Level(), 1) // level should be root 142 is.True(strings.HasSuffix(pkg.Dir(), filepath.FromSlash("/encoding"))) 143 is.Equal(pkg.Dirname(), "encoding") 144 is.Equal(pkg.Name(), "encoding") 145 is.Equal(pkg.Import(), `import "encoding"`) 146 is.Equal(pkg.Summary(), "Package encoding defines interfaces shared by other packages that convert data to and from byte-level and textual representations.") 147 is.Equal(len(pkg.Consts()), 0) // encoding should have no constants 148 is.Equal(len(pkg.Vars()), 0) // encoding should have no vars 149 is.Equal(len(pkg.Funcs()), 0) // encoding should have no top-level functions 150 is.True(len(pkg.Types()) > 0) // encoding should have top-level types 151 is.Equal(len(pkg.Examples()), 0) // encoding should have no top-level examples 152 } 153 154 func getBuildPackage(path string) (*build.Package, error) { 155 wd, err := os.Getwd() 156 if err != nil { 157 return nil, err 158 } 159 160 return build.Import(path, wd, build.ImportComment) 161 } 162 163 func loadPackage(dir string) (*lang.Package, error) { 164 buildPkg, err := getBuildPackage(dir) 165 if err != nil { 166 return nil, err 167 } 168 169 log := logger.New(logger.ErrorLevel) 170 pkg, err := lang.NewPackageFromBuild(log, buildPkg) 171 if err != nil { 172 return nil, err 173 } 174 175 return pkg, nil 176 }