kresult_test.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package ktypes
  2. import (
  3. "fmt"
  4. "runtime"
  5. "testing"
  6. )
  7. type testerResult struct {
  8. t *testing.T
  9. }
  10. func TestResult(t *testing.T) {
  11. sf := &testerResult{
  12. t: t,
  13. }
  14. sf.create()
  15. sf.notCheck()
  16. }
  17. // Создаёт новый результат и не проверяет его
  18. func (sf *testerResult) notCheck() {
  19. sf.t.Log("notCheck")
  20. defer func() {
  21. if _panic := recover(); _panic == nil {
  22. sf.t.Fatalf("notCheck(): panic==nil")
  23. }
  24. }()
  25. res := NewOk("test")
  26. {
  27. val := res.Val()
  28. if val != "test" {
  29. sf.t.Fatalf("notCheck() test!=test")
  30. }
  31. }
  32. runtime.Gosched()
  33. runtime.GC()
  34. res.destroy(&res)
  35. }
  36. // Создаёт новый Result
  37. func (sf *testerResult) create() {
  38. sf.t.Log("create")
  39. sf.createOkBad1()
  40. sf.createOkGood1()
  41. sf.createOkGood2()
  42. sf.createErrBad1()
  43. sf.createErrGood1()
  44. }
  45. func (sf *testerResult) createErrGood1() {
  46. sf.t.Log("createErrGood1")
  47. defer func() {
  48. if _panic := recover(); _panic != nil {
  49. sf.t.Fatalf("createErrGood1(): panic=%v", _panic)
  50. }
  51. }()
  52. err := fmt.Errorf("test err")
  53. res := NewErr[string](err)
  54. if res.IsOk() {
  55. sf.t.Fatalf("createErrGood1(): is ok")
  56. }
  57. if !res.IsErr() {
  58. sf.t.Fatalf("createErrGood1(): not err")
  59. }
  60. if val := res.ValOr("test2"); val != "test2" {
  61. sf.t.Fatalf("createErrGood1(): val bad")
  62. }
  63. if val := res.ValOr("test1"); val != "test1" {
  64. sf.t.Fatalf("createErrGood1(): val bad")
  65. }
  66. if val := res.ValOrFn(sf.fnWrap2); val != "test5" {
  67. sf.t.Fatalf("createErrGood1(): val bad")
  68. }
  69. if err := res.Err(); err == nil {
  70. sf.t.Fatalf("createErrGood1(): err == nil")
  71. }
  72. {
  73. res0 := WrapErr(res, err)
  74. if res0.IsOk() {
  75. sf.t.Fatalf("createErrGood1(): err == nil")
  76. }
  77. _ = res0.Error()
  78. }
  79. {
  80. res := NewOk("test_ok")
  81. if val := res.ValOr("test_ok1"); val != "test_ok" {
  82. sf.t.Fatalf("createErrGood1(): val(%v) != 'test_ok'", val)
  83. }
  84. }
  85. sf.unwrapErr(res)
  86. sf.hassert(res)
  87. sf.hassert2(res)
  88. sf.assert2()
  89. }
  90. func (sf *testerResult) assert2() {
  91. sf.t.Log("assert2")
  92. err := fmt.Errorf("test_error")
  93. res := NewErr[bool](err)
  94. defer func() {
  95. if _panic := recover(); _panic == nil {
  96. sf.t.Fatalf("assert2(): panic==nil")
  97. }
  98. }()
  99. res.Assert("test assert2")
  100. }
  101. func (sf *testerResult) hassert2(res Result[string]) {
  102. sf.t.Log("hassert2")
  103. defer func() {
  104. if _panic := recover(); _panic == nil {
  105. sf.t.Fatalf("assert(): panic==nil")
  106. }
  107. }()
  108. res.Hassert("test hassert2")
  109. }
  110. func (sf *testerResult) hassert(res Result[string]) {
  111. sf.t.Log("hassert")
  112. defer func() {
  113. if _panic := recover(); _panic == nil {
  114. sf.t.Fatalf("hassert(): panic==nil")
  115. }
  116. }()
  117. res.Hassert("test hassert")
  118. }
  119. func (sf *testerResult) unwrapErr(res Result[string]) {
  120. sf.t.Log("unwrapErr")
  121. defer func() {
  122. if _panic := recover(); _panic == nil {
  123. sf.t.Fatalf("unwrapErr(): panic==nil")
  124. }
  125. }()
  126. _ = res.Val()
  127. }
  128. // Нет ошибки
  129. func (sf *testerResult) createErrBad1() {
  130. sf.t.Log("createErrBad1")
  131. defer func() {
  132. if _panic := recover(); _panic == nil {
  133. sf.t.Fatalf("createErrBad1(): panic==nil")
  134. }
  135. }()
  136. var err error
  137. _ = NewErr[bool](err)
  138. }
  139. func (sf *testerResult) createOkGood2() {
  140. sf.t.Log("createOkGood2")
  141. defer func() {
  142. if _panic := recover(); _panic != nil {
  143. sf.t.Fatalf("createOkGood2(): panic=%v", _panic)
  144. }
  145. }()
  146. str := "test val"
  147. res := NewOk(str)
  148. if !res.IsOk() {
  149. sf.t.Fatalf("createOkGood1(): not ok")
  150. }
  151. if res.IsErr() {
  152. sf.t.Fatalf("createOkGood1(): is err")
  153. }
  154. if val := res.Val(); val != "test val" {
  155. sf.t.Fatalf("createOkGood1(): val bad")
  156. }
  157. if val := res.ValOr("test1"); val != "test val" {
  158. sf.t.Fatalf("createOkGood1(): val bad")
  159. }
  160. if val := res.ValOr("test1"); val != "test val" {
  161. sf.t.Fatalf("createOkGood1(): val bad")
  162. }
  163. if val := res.ValOrFn(sf.fnWrap); val != "test val" {
  164. sf.t.Fatalf("createOkGood1(): val bad")
  165. }
  166. res0 := NewErr[any](fmt.Errorf("test_error"))
  167. if err := res0.Err(); err == nil {
  168. sf.t.Fatalf("createOkGood1(): err ==nil")
  169. }
  170. res.Hassert("test")
  171. res.Assert("test")
  172. }
  173. // Функция высшего порядка для замещения ошибки
  174. func (sf *testerResult) fnWrap2() string {
  175. return "test5"
  176. }
  177. // Функция высшего порядка для замещения ошибки
  178. func (sf *testerResult) fnWrap() string {
  179. return "test1"
  180. }
  181. func (sf *testerResult) createOkGood1() {
  182. sf.t.Log("createOkGood1")
  183. defer func() {
  184. if _panic := recover(); _panic != nil {
  185. sf.t.Fatalf("createOkGood1(): panic=%v", _panic)
  186. }
  187. }()
  188. str := "test val"
  189. _ = NewOk(&str)
  190. }
  191. // Нет результата
  192. func (sf *testerResult) createOkBad1() {
  193. sf.t.Log("createOkBad1")
  194. defer func() {
  195. if _panic := recover(); _panic == nil {
  196. sf.t.Fatalf("createOkBad1(): panic==nil")
  197. }
  198. }()
  199. var str *string
  200. _ = NewOk(str)
  201. }