assert_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package flags
  2. import (
  3. "fmt"
  4. "io"
  5. "io/ioutil"
  6. "os"
  7. "os/exec"
  8. "path"
  9. "runtime"
  10. "testing"
  11. )
  12. func assertCallerInfo() (string, int) {
  13. ptr := make([]uintptr, 15)
  14. n := runtime.Callers(1, ptr)
  15. if n == 0 {
  16. return "", 0
  17. }
  18. mef := runtime.FuncForPC(ptr[0])
  19. mefile, meline := mef.FileLine(ptr[0])
  20. for i := 2; i < n; i++ {
  21. f := runtime.FuncForPC(ptr[i])
  22. file, line := f.FileLine(ptr[i])
  23. if file != mefile {
  24. return file, line
  25. }
  26. }
  27. return mefile, meline
  28. }
  29. func assertErrorf(t *testing.T, format string, args ...interface{}) {
  30. msg := fmt.Sprintf(format, args...)
  31. file, line := assertCallerInfo()
  32. t.Errorf("%s:%d: %s", path.Base(file), line, msg)
  33. }
  34. func assertFatalf(t *testing.T, format string, args ...interface{}) {
  35. msg := fmt.Sprintf(format, args...)
  36. file, line := assertCallerInfo()
  37. t.Fatalf("%s:%d: %s", path.Base(file), line, msg)
  38. }
  39. func assertString(t *testing.T, a string, b string) {
  40. if a != b {
  41. assertErrorf(t, "Expected %#v, but got %#v", b, a)
  42. }
  43. }
  44. func assertStringArray(t *testing.T, a []string, b []string) {
  45. if len(a) != len(b) {
  46. assertErrorf(t, "Expected %#v, but got %#v", b, a)
  47. return
  48. }
  49. for i, v := range a {
  50. if b[i] != v {
  51. assertErrorf(t, "Expected %#v, but got %#v", b, a)
  52. return
  53. }
  54. }
  55. }
  56. func assertBoolArray(t *testing.T, a []bool, b []bool) {
  57. if len(a) != len(b) {
  58. assertErrorf(t, "Expected %#v, but got %#v", b, a)
  59. return
  60. }
  61. for i, v := range a {
  62. if b[i] != v {
  63. assertErrorf(t, "Expected %#v, but got %#v", b, a)
  64. return
  65. }
  66. }
  67. }
  68. func assertParserSuccess(t *testing.T, data interface{}, args ...string) (*Parser, []string) {
  69. parser := NewParser(data, Default&^PrintErrors)
  70. ret, err := parser.ParseArgs(args)
  71. if err != nil {
  72. t.Fatalf("Unexpected parse error: %s", err)
  73. return nil, nil
  74. }
  75. return parser, ret
  76. }
  77. func assertParseSuccess(t *testing.T, data interface{}, args ...string) []string {
  78. _, ret := assertParserSuccess(t, data, args...)
  79. return ret
  80. }
  81. func assertError(t *testing.T, err error, typ ErrorType, msg string) {
  82. if err == nil {
  83. assertFatalf(t, "Expected error: %s", msg)
  84. return
  85. }
  86. if e, ok := err.(*Error); !ok {
  87. assertFatalf(t, "Expected Error type, but got %#v", err)
  88. } else {
  89. if e.Type != typ {
  90. assertErrorf(t, "Expected error type {%s}, but got {%s}", typ, e.Type)
  91. }
  92. if e.Message != msg {
  93. assertErrorf(t, "Expected error message %#v, but got %#v", msg, e.Message)
  94. }
  95. }
  96. }
  97. func assertParseFail(t *testing.T, typ ErrorType, msg string, data interface{}, args ...string) []string {
  98. parser := NewParser(data, Default&^PrintErrors)
  99. ret, err := parser.ParseArgs(args)
  100. assertError(t, err, typ, msg)
  101. return ret
  102. }
  103. func diff(a, b string) (string, error) {
  104. atmp, err := ioutil.TempFile("", "help-diff")
  105. if err != nil {
  106. return "", err
  107. }
  108. btmp, err := ioutil.TempFile("", "help-diff")
  109. if err != nil {
  110. return "", err
  111. }
  112. if _, err := io.WriteString(atmp, a); err != nil {
  113. return "", err
  114. }
  115. if _, err := io.WriteString(btmp, b); err != nil {
  116. return "", err
  117. }
  118. ret, err := exec.Command("diff", "-u", "-d", "--label", "got", atmp.Name(), "--label", "expected", btmp.Name()).Output()
  119. os.Remove(atmp.Name())
  120. os.Remove(btmp.Name())
  121. if err.Error() == "exit status 1" {
  122. return string(ret), nil
  123. }
  124. return string(ret), err
  125. }
  126. func assertDiff(t *testing.T, actual, expected, msg string) {
  127. if actual == expected {
  128. return
  129. }
  130. ret, err := diff(actual, expected)
  131. if err != nil {
  132. assertErrorf(t, "Unexpected diff error: %s", err)
  133. assertErrorf(t, "Unexpected %s, expected:\n\n%s\n\nbut got\n\n%s", msg, expected, actual)
  134. } else {
  135. assertErrorf(t, "Unexpected %s:\n\n%s", msg, ret)
  136. }
  137. }