counttime_test.go 7.1 KB

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