github.com/demonoid81/moby@v0.0.0-20200517203328-62dd8e17c460/pkg/plugins/pluginrpc-gen/parser_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "runtime" 7 "strings" 8 "testing" 9 ) 10 11 const testFixture = "fixtures/foo.go" 12 13 func TestParseEmptyInterface(t *testing.T) { 14 pkg, err := Parse(testFixture, "Fooer") 15 if err != nil { 16 t.Fatal(err) 17 } 18 19 assertName(t, "foo", pkg.Name) 20 assertNum(t, 0, len(pkg.Functions)) 21 } 22 23 func TestParseNonInterfaceType(t *testing.T) { 24 _, err := Parse(testFixture, "wobble") 25 if _, ok := err.(errUnexpectedType); !ok { 26 t.Fatal("expected type error when parsing non-interface type") 27 } 28 } 29 30 func TestParseWithOneFunction(t *testing.T) { 31 pkg, err := Parse(testFixture, "Fooer2") 32 if err != nil { 33 t.Fatal(err) 34 } 35 36 assertName(t, "foo", pkg.Name) 37 assertNum(t, 1, len(pkg.Functions)) 38 assertName(t, "Foo", pkg.Functions[0].Name) 39 assertNum(t, 0, len(pkg.Functions[0].Args)) 40 assertNum(t, 0, len(pkg.Functions[0].Returns)) 41 } 42 43 func TestParseWithMultipleFuncs(t *testing.T) { 44 pkg, err := Parse(testFixture, "Fooer3") 45 if err != nil { 46 t.Fatal(err) 47 } 48 49 assertName(t, "foo", pkg.Name) 50 assertNum(t, 7, len(pkg.Functions)) 51 52 f := pkg.Functions[0] 53 assertName(t, "Foo", f.Name) 54 assertNum(t, 0, len(f.Args)) 55 assertNum(t, 0, len(f.Returns)) 56 57 f = pkg.Functions[1] 58 assertName(t, "Bar", f.Name) 59 assertNum(t, 1, len(f.Args)) 60 assertNum(t, 0, len(f.Returns)) 61 arg := f.Args[0] 62 assertName(t, "a", arg.Name) 63 assertName(t, "string", arg.ArgType) 64 65 f = pkg.Functions[2] 66 assertName(t, "Baz", f.Name) 67 assertNum(t, 1, len(f.Args)) 68 assertNum(t, 1, len(f.Returns)) 69 arg = f.Args[0] 70 assertName(t, "a", arg.Name) 71 assertName(t, "string", arg.ArgType) 72 arg = f.Returns[0] 73 assertName(t, "err", arg.Name) 74 assertName(t, "error", arg.ArgType) 75 76 f = pkg.Functions[3] 77 assertName(t, "Qux", f.Name) 78 assertNum(t, 2, len(f.Args)) 79 assertNum(t, 2, len(f.Returns)) 80 arg = f.Args[0] 81 assertName(t, "a", f.Args[0].Name) 82 assertName(t, "string", f.Args[0].ArgType) 83 arg = f.Args[1] 84 assertName(t, "b", arg.Name) 85 assertName(t, "string", arg.ArgType) 86 arg = f.Returns[0] 87 assertName(t, "val", arg.Name) 88 assertName(t, "string", arg.ArgType) 89 arg = f.Returns[1] 90 assertName(t, "err", arg.Name) 91 assertName(t, "error", arg.ArgType) 92 93 f = pkg.Functions[4] 94 assertName(t, "Wobble", f.Name) 95 assertNum(t, 0, len(f.Args)) 96 assertNum(t, 1, len(f.Returns)) 97 arg = f.Returns[0] 98 assertName(t, "w", arg.Name) 99 assertName(t, "*wobble", arg.ArgType) 100 101 f = pkg.Functions[5] 102 assertName(t, "Wiggle", f.Name) 103 assertNum(t, 0, len(f.Args)) 104 assertNum(t, 1, len(f.Returns)) 105 arg = f.Returns[0] 106 assertName(t, "w", arg.Name) 107 assertName(t, "wobble", arg.ArgType) 108 109 f = pkg.Functions[6] 110 assertName(t, "WiggleWobble", f.Name) 111 assertNum(t, 6, len(f.Args)) 112 assertNum(t, 6, len(f.Returns)) 113 expectedArgs := [][]string{ 114 {"a", "[]*wobble"}, 115 {"b", "[]wobble"}, 116 {"c", "map[string]*wobble"}, 117 {"d", "map[*wobble]wobble"}, 118 {"e", "map[string][]wobble"}, 119 {"f", "[]*otherfixture.Spaceship"}, 120 } 121 for i, arg := range f.Args { 122 assertName(t, expectedArgs[i][0], arg.Name) 123 assertName(t, expectedArgs[i][1], arg.ArgType) 124 } 125 expectedReturns := [][]string{ 126 {"g", "map[*wobble]wobble"}, 127 {"h", "[][]*wobble"}, 128 {"i", "otherfixture.Spaceship"}, 129 {"j", "*otherfixture.Spaceship"}, 130 {"k", "map[*otherfixture.Spaceship]otherfixture.Spaceship"}, 131 {"l", "[]otherfixture.Spaceship"}, 132 } 133 for i, ret := range f.Returns { 134 assertName(t, expectedReturns[i][0], ret.Name) 135 assertName(t, expectedReturns[i][1], ret.ArgType) 136 } 137 } 138 139 func TestParseWithUnnamedReturn(t *testing.T) { 140 _, err := Parse(testFixture, "Fooer4") 141 if !strings.HasSuffix(err.Error(), errBadReturn.Error()) { 142 t.Fatalf("expected ErrBadReturn, got %v", err) 143 } 144 } 145 146 func TestEmbeddedInterface(t *testing.T) { 147 pkg, err := Parse(testFixture, "Fooer5") 148 if err != nil { 149 t.Fatal(err) 150 } 151 152 assertName(t, "foo", pkg.Name) 153 assertNum(t, 2, len(pkg.Functions)) 154 155 f := pkg.Functions[0] 156 assertName(t, "Foo", f.Name) 157 assertNum(t, 0, len(f.Args)) 158 assertNum(t, 0, len(f.Returns)) 159 160 f = pkg.Functions[1] 161 assertName(t, "Boo", f.Name) 162 assertNum(t, 2, len(f.Args)) 163 assertNum(t, 2, len(f.Returns)) 164 165 arg := f.Args[0] 166 assertName(t, "a", arg.Name) 167 assertName(t, "string", arg.ArgType) 168 169 arg = f.Args[1] 170 assertName(t, "b", arg.Name) 171 assertName(t, "string", arg.ArgType) 172 173 arg = f.Returns[0] 174 assertName(t, "s", arg.Name) 175 assertName(t, "string", arg.ArgType) 176 177 arg = f.Returns[1] 178 assertName(t, "err", arg.Name) 179 assertName(t, "error", arg.ArgType) 180 } 181 182 func TestParsedImports(t *testing.T) { 183 cases := []string{"Fooer6", "Fooer7", "Fooer8", "Fooer9", "Fooer10", "Fooer11"} 184 for _, testCase := range cases { 185 pkg, err := Parse(testFixture, testCase) 186 if err != nil { 187 t.Fatal(err) 188 } 189 190 assertNum(t, 1, len(pkg.Imports)) 191 importPath := strings.Split(pkg.Imports[0].Path, "/") 192 assertName(t, "otherfixture\"", importPath[len(importPath)-1]) 193 assertName(t, "", pkg.Imports[0].Name) 194 } 195 } 196 197 func TestAliasedImports(t *testing.T) { 198 pkg, err := Parse(testFixture, "Fooer12") 199 if err != nil { 200 t.Fatal(err) 201 } 202 203 assertNum(t, 1, len(pkg.Imports)) 204 assertName(t, "aliasedio", pkg.Imports[0].Name) 205 } 206 207 func assertName(t *testing.T, expected, actual string) { 208 if expected != actual { 209 fatalOut(t, fmt.Sprintf("expected name to be `%s`, got: %s", expected, actual)) 210 } 211 } 212 213 func assertNum(t *testing.T, expected, actual int) { 214 if expected != actual { 215 fatalOut(t, fmt.Sprintf("expected number to be %d, got: %d", expected, actual)) 216 } 217 } 218 219 func fatalOut(t *testing.T, msg string) { 220 _, file, ln, _ := runtime.Caller(2) 221 t.Fatalf("%s:%d: %s", filepath.Base(file), ln, msg) 222 }