parser_test.go 5.4 KB

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