down_time_test.go 7.9 KB

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