parser_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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, 6, 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. }
  94. func TestParseWithUnamedReturn(t *testing.T) {
  95. _, err := Parse(testFixture, "Fooer4")
  96. if !strings.HasSuffix(err.Error(), ErrBadReturn.Error()) {
  97. t.Fatalf("expected ErrBadReturn, got %v", err)
  98. }
  99. }
  100. func TestEmbeddedInterface(t *testing.T) {
  101. pkg, err := Parse(testFixture, "Fooer5")
  102. if err != nil {
  103. t.Fatal(err)
  104. }
  105. assertName(t, "foo", pkg.Name)
  106. assertNum(t, 2, len(pkg.Functions))
  107. f := pkg.Functions[0]
  108. assertName(t, "Foo", f.Name)
  109. assertNum(t, 0, len(f.Args))
  110. assertNum(t, 0, len(f.Returns))
  111. f = pkg.Functions[1]
  112. assertName(t, "Boo", f.Name)
  113. assertNum(t, 2, len(f.Args))
  114. assertNum(t, 2, len(f.Returns))
  115. arg := f.Args[0]
  116. assertName(t, "a", arg.Name)
  117. assertName(t, "string", arg.ArgType)
  118. arg = f.Args[1]
  119. assertName(t, "b", arg.Name)
  120. assertName(t, "string", arg.ArgType)
  121. arg = f.Returns[0]
  122. assertName(t, "s", arg.Name)
  123. assertName(t, "string", arg.ArgType)
  124. arg = f.Returns[1]
  125. assertName(t, "err", arg.Name)
  126. assertName(t, "error", arg.ArgType)
  127. }
  128. func assertName(t *testing.T, expected, actual string) {
  129. if expected != actual {
  130. fatalOut(t, fmt.Sprintf("expected name to be `%s`, got: %s", expected, actual))
  131. }
  132. }
  133. func assertNum(t *testing.T, expected, actual int) {
  134. if expected != actual {
  135. fatalOut(t, fmt.Sprintf("expected number to be %d, got: %d", expected, actual))
  136. }
  137. }
  138. func fatalOut(t *testing.T, msg string) {
  139. _, file, ln, _ := runtime.Caller(2)
  140. t.Fatalf("%s:%d: %s", filepath.Base(file), ln, msg)
  141. }