down_time_test.go 7.2 KB

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