panic.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package assertions
  2. import (
  3. "errors"
  4. "fmt"
  5. )
  6. // ShouldPanic receives a void, niladic function and expects to recover a panic.
  7. func ShouldPanic(actual interface{}, expected ...interface{}) (message string) {
  8. if fail := need(0, expected); fail != success {
  9. return fail
  10. }
  11. action, _ := actual.(func())
  12. if action == nil {
  13. message = shouldUseVoidNiladicFunction
  14. return
  15. }
  16. defer func() {
  17. recovered := recover()
  18. if recovered == nil {
  19. message = shouldHavePanicked
  20. } else {
  21. message = success
  22. }
  23. }()
  24. action()
  25. return
  26. }
  27. // ShouldNotPanic receives a void, niladic function and expects to execute the function without any panic.
  28. func ShouldNotPanic(actual interface{}, expected ...interface{}) (message string) {
  29. if fail := need(0, expected); fail != success {
  30. return fail
  31. }
  32. action, _ := actual.(func())
  33. if action == nil {
  34. message = shouldUseVoidNiladicFunction
  35. return
  36. }
  37. defer func() {
  38. recovered := recover()
  39. if recovered != nil {
  40. message = fmt.Sprintf(shouldNotHavePanicked, recovered)
  41. } else {
  42. message = success
  43. }
  44. }()
  45. action()
  46. return
  47. }
  48. // ShouldPanicWith receives a void, niladic function and expects to recover a panic with the second argument as the content.
  49. // If the expected value is an error and the recovered value is an error, errors.Is is used to compare them.
  50. func ShouldPanicWith(actual interface{}, expected ...interface{}) (message string) {
  51. if fail := need(1, expected); fail != success {
  52. return fail
  53. }
  54. action, _ := actual.(func())
  55. if action == nil {
  56. message = shouldUseVoidNiladicFunction
  57. return
  58. }
  59. defer func() {
  60. recovered := recover()
  61. if recovered == nil {
  62. message = shouldHavePanicked
  63. } else {
  64. recoveredErr, errFound := recovered.(error)
  65. expectedErr, expectedFound := expected[0].(error)
  66. if errFound && expectedFound && errors.Is(recoveredErr, expectedErr) {
  67. message = success
  68. } else if equal := ShouldEqual(recovered, expected[0]); equal != success {
  69. message = serializer.serialize(expected[0], recovered, fmt.Sprintf(shouldHavePanickedWith, expected[0], recovered))
  70. } else {
  71. message = success
  72. }
  73. }
  74. }()
  75. action()
  76. return
  77. }
  78. // ShouldNotPanicWith receives a void, niladic function and expects to recover a panic whose content differs from the second argument.
  79. // If the expected value is an error and the recovered value is an error, errors.Is is used to compare them.
  80. func ShouldNotPanicWith(actual interface{}, expected ...interface{}) (message string) {
  81. if fail := need(1, expected); fail != success {
  82. return fail
  83. }
  84. action, _ := actual.(func())
  85. if action == nil {
  86. message = shouldUseVoidNiladicFunction
  87. return
  88. }
  89. defer func() {
  90. recovered := recover()
  91. if recovered == nil {
  92. message = success
  93. } else {
  94. recoveredErr, errFound := recovered.(error)
  95. expectedErr, expectedFound := expected[0].(error)
  96. if errFound && expectedFound && errors.Is(recoveredErr, expectedErr) {
  97. message = fmt.Sprintf(shouldNotHavePanickedWith, expected[0])
  98. } else if equal := ShouldEqual(recovered, expected[0]); equal == success {
  99. message = fmt.Sprintf(shouldNotHavePanickedWith, expected[0])
  100. } else {
  101. message = success
  102. }
  103. }
  104. }()
  105. action()
  106. return
  107. }