errwrap_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package errwrap
  2. import (
  3. "errors"
  4. "fmt"
  5. "testing"
  6. )
  7. func TestWrappedError_impl(t *testing.T) {
  8. var _ error = new(wrappedError)
  9. }
  10. func TestGetAll(t *testing.T) {
  11. cases := []struct {
  12. Err error
  13. Msg string
  14. Len int
  15. }{
  16. {},
  17. {
  18. fmt.Errorf("foo"),
  19. "foo",
  20. 1,
  21. },
  22. {
  23. fmt.Errorf("bar"),
  24. "foo",
  25. 0,
  26. },
  27. {
  28. Wrapf("bar", fmt.Errorf("foo")),
  29. "foo",
  30. 1,
  31. },
  32. {
  33. Wrapf("{{err}}", fmt.Errorf("foo")),
  34. "foo",
  35. 2,
  36. },
  37. {
  38. Wrapf("bar", Wrapf("baz", fmt.Errorf("foo"))),
  39. "foo",
  40. 1,
  41. },
  42. {
  43. fmt.Errorf("foo: %w", fmt.Errorf("bar")),
  44. "foo: bar",
  45. 1,
  46. },
  47. {
  48. fmt.Errorf("foo: %w", fmt.Errorf("bar")),
  49. "bar",
  50. 1,
  51. },
  52. }
  53. for i, tc := range cases {
  54. actual := GetAll(tc.Err, tc.Msg)
  55. if len(actual) != tc.Len {
  56. t.Fatalf("%d: bad: %#v", i, actual)
  57. }
  58. for _, v := range actual {
  59. if v.Error() != tc.Msg {
  60. t.Fatalf("%d: bad: %#v", i, actual)
  61. }
  62. }
  63. }
  64. }
  65. func TestGetAllType(t *testing.T) {
  66. cases := []struct {
  67. Err error
  68. Type interface{}
  69. Len int
  70. }{
  71. {},
  72. {
  73. fmt.Errorf("foo"),
  74. "foo",
  75. 0,
  76. },
  77. {
  78. fmt.Errorf("bar"),
  79. fmt.Errorf("foo"),
  80. 1,
  81. },
  82. {
  83. Wrapf("bar", fmt.Errorf("foo")),
  84. fmt.Errorf("baz"),
  85. 2,
  86. },
  87. {
  88. Wrapf("bar", Wrapf("baz", fmt.Errorf("foo"))),
  89. Wrapf("", nil),
  90. 0,
  91. },
  92. {
  93. fmt.Errorf("one: %w", fmt.Errorf("two: %w", fmt.Errorf("three"))),
  94. fmt.Errorf("%w", errors.New("")),
  95. 2,
  96. },
  97. }
  98. for i, tc := range cases {
  99. actual := GetAllType(tc.Err, tc.Type)
  100. if len(actual) != tc.Len {
  101. t.Fatalf("%d: bad: %#v", i, actual)
  102. }
  103. }
  104. }
  105. func TestWrappedError_IsCompatibleWithErrorsUnwrap(t *testing.T) {
  106. inner := errors.New("inner error")
  107. err := Wrap(errors.New("outer"), inner)
  108. actual := errors.Unwrap(err)
  109. if actual != inner {
  110. t.Fatal("wrappedError did not unwrap to inner")
  111. }
  112. }