count_time_test.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. package count_time
  2. import (
  3. "testing"
  4. "time"
  5. "wartank/pkg/components/safebool"
  6. "wartank/pkg/mock/mockapp"
  7. "wartank/pkg/types"
  8. )
  9. /*
  10. Тест для счётчика времени
  11. */
  12. // Тестер для счётчика времени
  13. type tester struct {
  14. t *testing.T
  15. app *mockapp.MockApp
  16. bot types.IBot
  17. ct *CountTime
  18. err error
  19. isCall *safebool.SafeBool // Признак обратного вызова
  20. }
  21. // Обратный вызов для счётчика времени
  22. func (sf *tester) call() {
  23. <-sf.ct.chCall
  24. }
  25. func TestCountTime(t *testing.T) {
  26. test := &tester{
  27. t: t,
  28. isCall: safebool.NewSafeBool(),
  29. app: mockapp.NewMockApp(),
  30. }
  31. time.Sleep(time.Millisecond * 100)
  32. test.create()
  33. test.setInt()
  34. test.setStr()
  35. test.checkTick()
  36. test.cancel()
  37. }
  38. // Оменяет работу таймера
  39. func (sf *tester) cancel() {
  40. sf.t.Logf("=cancel=\n")
  41. ct := NewCountTime(sf.bot)
  42. for len(ct.chTick) > 0 {
  43. <-ct.chTick
  44. }
  45. sf.app.CancelApp()
  46. time.Sleep(time.Millisecond * 150)
  47. }
  48. // Проверяет обработчик тика
  49. func (sf *tester) checkTick() {
  50. ct := NewCountTime(sf.bot)
  51. { // Секундный тик
  52. ct.Parse("00:00:08")
  53. time.Sleep(time.Second * 1)
  54. ct.chTick <- 1
  55. time.Sleep(time.Millisecond * 20)
  56. if val := ct.String(); val != "00:00:08" {
  57. sf.t.Errorf("checkTick(): счётчик(%v)!='00:00:08'", val)
  58. }
  59. }
  60. { // Проверка времени прямо сейчас
  61. ct.chTick <- 1
  62. time.Sleep(time.Millisecond * 20)
  63. if val := ct.String(); val != "00:00:08" {
  64. sf.t.Errorf("checkTick(): счётчик(%v)!='00:00:08'", val)
  65. }
  66. }
  67. { // Проверка обратного вызова прямо сейчас
  68. strTime := time.Now().UTC().Format("15:04:05")
  69. ct.Parse(strTime)
  70. if val := ct.String(); val != strTime {
  71. sf.t.Errorf("checkTick(): счётчик(%v)!=%s", val, strTime)
  72. }
  73. ct.chTick <- 1
  74. // Выход из функции -- и есть факт обратного вызова
  75. sf.call()
  76. { // Проверка отсутствия обратного вызова прямо сейчас
  77. ct.Parse("00:00:00")
  78. ct.chTick <- 1
  79. // Выход из функции -- и есть факт обратного вызова
  80. sf.call()
  81. if val := ct.Get(); val != 0 {
  82. sf.t.Errorf("checkTick(): счётчик(%v)!=0", val)
  83. }
  84. ct.Stop()
  85. sf.app.CancelApp()
  86. time.Sleep(time.Millisecond * 50)
  87. }
  88. }
  89. }
  90. func (sf *tester) setStrBad1(strBad string) {
  91. defer func() {
  92. if _panic := recover(); _panic == nil {
  93. sf.t.Errorf("setStrBad1(): panic==nil\n")
  94. }
  95. }()
  96. if sf.err = sf.ct.Parse(strBad); sf.err == nil {
  97. sf.t.Errorf("setStrBad1(): BAD-2 err==nil")
  98. }
  99. }
  100. // Устанавливает строковое значение времени
  101. func (sf *tester) setStr() {
  102. go sf.call()
  103. ct := NewCountTime(sf.bot)
  104. { // BAD-1 пустая строка
  105. if sf.err = ct.Parse(""); sf.err == nil {
  106. sf.t.Errorf("setStr(): BAD-1 err==nil")
  107. }
  108. }
  109. // BAD-2 неформатная строка
  110. sf.setStrBad1(":::")
  111. // BAD-3 кривые часы
  112. sf.setStrBad1("a1:02:03")
  113. // BAD-4 кривые минуты
  114. sf.setStrBad1("01:a2:03")
  115. // BAD-5 кривые секунды
  116. sf.setStrBad1("01:02:a3")
  117. // BAD-6 кривые только секунды
  118. sf.setStrBad1("a3")
  119. // BAD-7 кривые минуты +секунды
  120. sf.setStrBad1("a2:03")
  121. // BAD-8 кривые часы +минуты +секунды
  122. sf.setStrBad1("a1:02:03")
  123. // BAD-9 минуты +кривые секунды
  124. sf.setStrBad1("02:a3")
  125. // BAD-10 кривые минуты +секунды
  126. sf.setStrBad1("60:03")
  127. // BAD-11 кривые минуты +секунды
  128. sf.setStrBad1("-1:03")
  129. // BAD-12 минуты +кривые секунды
  130. sf.setStrBad1("01:60")
  131. // BAD-13 минуты +кривые секунды
  132. sf.setStrBad1("01:-1")
  133. // BAD-14 кривые часы +минуты + секунды
  134. sf.setStrBad1("-1:02:03")
  135. // BAD-15 кривые часы +минуты + секунды
  136. //sf.setStrBad1("24:02:03")
  137. { // GOOD-1 секунды
  138. if sf.err = ct.Parse("03"); sf.err != nil {
  139. sf.t.Errorf("setStr(): GOOD-1 err=%v", sf.err)
  140. }
  141. }
  142. { // GOOD-2 минуты секунды
  143. if sf.err = ct.Parse("02:03"); sf.err != nil {
  144. sf.t.Errorf("setStr(): GOOD-2 err=%v", sf.err)
  145. }
  146. }
  147. { // GOOD-3 часы минуты секунды
  148. if sf.err = ct.Parse("01:02:03"); sf.err != nil {
  149. sf.t.Errorf("setStr(): GOOD-3 err=%v", sf.err)
  150. }
  151. }
  152. }
  153. // Устанавливает число секунд для отсчёта
  154. func (sf *tester) setInt() {
  155. go sf.call()
  156. ct := NewCountTime(sf.bot)
  157. { // Bad-1 Отрицательное число
  158. if sf.err = ct.Set(-1); sf.err == nil {
  159. sf.t.Errorf("setInt(): BAD-1 err==nil")
  160. }
  161. }
  162. { // GOOD-1
  163. if sf.err = ct.Set(8); sf.err != nil {
  164. sf.t.Errorf("setInt(): GOOD-1 err=%v", sf.err)
  165. }
  166. if ct.parser.Hour().Get() != 0 {
  167. sf.t.Errorf("setInt(): GOOD-1 hour(%v)!=0", sf.ct.parser.Hour().Get())
  168. }
  169. if ct.parser.Min().Get() != 0 {
  170. sf.t.Errorf("setInt(): GOOD-1 min(%v)!=0", sf.ct.parser.Min().Get())
  171. }
  172. if ct.parser.Sec().Get() != 8 {
  173. sf.t.Errorf("setInt(): GOOD-1 sec(%v)!=8", sf.ct.parser.Sec().Get())
  174. }
  175. if strVal := ct.String(); strVal != "00:00:08" {
  176. sf.t.Errorf("setInt(): GOOD-1 strVal(%v)!='00:00:08'", strVal)
  177. }
  178. }
  179. { // GOOD-2
  180. if sf.err = ct.Set(121); sf.err != nil {
  181. sf.t.Errorf("setInt(): GOOD-2 err=%v", sf.err)
  182. }
  183. if ct.parser.Hour().Get() != 0 {
  184. sf.t.Errorf("setInt(): GOOD-2 hour(%v)!=0", sf.ct.parser.Hour().Get())
  185. }
  186. if ct.parser.Min().Get() != 2 {
  187. sf.t.Errorf("setInt(): GOOD-2 min(%v)!=2", sf.ct.parser.Min().Get())
  188. }
  189. if ct.parser.Sec().Get() != 1 {
  190. sf.t.Errorf("setInt(): GOOD-2 sec(%v)!=1", sf.ct.parser.Sec().Get())
  191. }
  192. if strVal := ct.String(); strVal != "00:02:01" {
  193. sf.t.Errorf("setInt(): GOOD-2 strVal(%v)!='00:02:01'", strVal)
  194. }
  195. }
  196. { // GOOD-3
  197. if sf.err = ct.Set(7203); sf.err != nil {
  198. sf.t.Errorf("setInt(): GOOD-3 err=%v", sf.err)
  199. }
  200. if ct.parser.Hour().Get() != 2 {
  201. sf.t.Errorf("setInt(): GOOD-3 hour(%v)!=2", sf.ct.parser.Hour().Get())
  202. }
  203. if ct.parser.Min().Get() != 0 {
  204. sf.t.Errorf("setInt(): GOOD-3 min(%v)!=0", sf.ct.parser.Min().Get())
  205. }
  206. if ct.parser.Sec().Get() != 3 {
  207. sf.t.Errorf("setInt(): GOOD-3 sec(%v)!=3", sf.ct.parser.Sec().Get())
  208. }
  209. if strVal := ct.String(); strVal != "02:00:03" {
  210. sf.t.Errorf("setInt(): GOOD-3 strVal(%v)!='02:00:03'", strVal)
  211. }
  212. }
  213. }
  214. // Нет обратного канала
  215. func (sf *tester) createBad1() {
  216. defer func() {
  217. if _panic := recover(); _panic == nil {
  218. sf.t.Errorf("createBad1(): panic==nil")
  219. }
  220. }()
  221. sf.ct = NewCountTime(nil)
  222. if sf.ct != nil {
  223. sf.t.Errorf("createBad1(): countTime!=nil")
  224. }
  225. }
  226. // Правильное создание
  227. func (sf *tester) createGood1() {
  228. defer func() {
  229. if _panic := recover(); _panic != nil {
  230. sf.t.Errorf("createGood1(): panic=%v", _panic)
  231. }
  232. }()
  233. ct := NewCountTime(sf.bot)
  234. if ct == nil {
  235. sf.t.Errorf("createGood1(): countTime==nil")
  236. }
  237. if val := ct.Get(); val != 0 {
  238. sf.t.Errorf("createGood1(): val(%v)!=0", val)
  239. }
  240. }
  241. // Создание счётчика обратного времени
  242. func (sf *tester) create() {
  243. sf.createBad1()
  244. sf.createGood1()
  245. }