down_time_test.go 8.3 KB

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