result_test.go 4.6 KB

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