counttime_test.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package counttime
  2. import (
  3. "testing"
  4. "time"
  5. . "gitp78su.ipnodns.ru/svi/kern"
  6. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  7. )
  8. /*
  9. Тест для счётчика времени
  10. */
  11. // Тестер для счётчика времени
  12. type tester struct {
  13. t *testing.T
  14. ct *CountTime
  15. isCall ISafeBool // Признак обратного вызова
  16. }
  17. // Обратный вызов для счётчика времени
  18. func (sf *tester) call() {
  19. <-sf.ct.chCall
  20. }
  21. func TestCountTime(t *testing.T) {
  22. test := &tester{
  23. t: t,
  24. isCall: NewSafeBool(),
  25. }
  26. time.Sleep(time.Millisecond * 100)
  27. test.create()
  28. test.setInt()
  29. test.setStr()
  30. test.checkTick()
  31. test.cancel()
  32. }
  33. // Оменяет работу таймера
  34. func (sf *tester) cancel() {
  35. sf.t.Logf("=cancel=\n")
  36. ct := NewCountTime()
  37. for len(ct.chTick) > 0 {
  38. <-ct.chTick
  39. }
  40. ctx := GetKernelCtx()
  41. ctx.Cancel()
  42. time.Sleep(time.Millisecond * 150)
  43. }
  44. // Проверяет обработчик тика
  45. func (sf *tester) checkTick() {
  46. ct := NewCountTime()
  47. { // Секундный тик
  48. ct.Parse("00:00:08")
  49. time.Sleep(time.Second * 1)
  50. ct.chTick <- 1
  51. time.Sleep(time.Millisecond * 20)
  52. if val := ct.String(); val != "00:00:08" {
  53. sf.t.Errorf("checkTick(): счётчик(%v)!='00:00:08'", val)
  54. }
  55. }
  56. { // Проверка времени прямо сейчас
  57. ct.chTick <- 1
  58. time.Sleep(time.Millisecond * 20)
  59. if val := ct.String(); val != "00:00:08" {
  60. sf.t.Errorf("checkTick(): счётчик(%v)!='00:00:08'", val)
  61. }
  62. }
  63. { // Проверка обратного вызова прямо сейчас
  64. strTime := time.Now().UTC().Format("15:04:05")
  65. ct.Parse(strTime)
  66. if val := ct.String(); val != strTime {
  67. sf.t.Errorf("checkTick(): счётчик(%v)!=%s", val, strTime)
  68. }
  69. ct.chTick <- 1
  70. // Выход из функции -- и есть факт обратного вызова
  71. sf.call()
  72. { // Проверка отсутствия обратного вызова прямо сейчас
  73. ct.Parse("00:00:00")
  74. ct.chTick <- 1
  75. // Выход из функции -- и есть факт обратного вызова
  76. sf.call()
  77. if val := ct.Get(); val != 0 {
  78. sf.t.Errorf("checkTick(): счётчик(%v)!=0", val)
  79. }
  80. ct.Stop()
  81. time.Sleep(time.Millisecond * 50)
  82. }
  83. }
  84. }
  85. func (sf *tester) setStrBad1(strBad string) {
  86. sf.ct.Parse(strBad)
  87. }
  88. // Устанавливает строковое значение времени
  89. func (sf *tester) setStr() {
  90. go sf.call()
  91. ct := NewCountTime()
  92. ct.Parse("") // BAD-1 пустая строка
  93. // BAD-2 неформатная строка
  94. sf.setStrBad1(":::")
  95. // BAD-3 кривые часы
  96. sf.setStrBad1("a1:02:03")
  97. // BAD-4 кривые минуты
  98. sf.setStrBad1("01:a2:03")
  99. // BAD-5 кривые секунды
  100. sf.setStrBad1("01:02:a3")
  101. // BAD-6 кривые только секунды
  102. sf.setStrBad1("a3")
  103. // BAD-7 кривые минуты +секунды
  104. sf.setStrBad1("a2:03")
  105. // BAD-8 кривые часы +минуты +секунды
  106. sf.setStrBad1("a1:02:03")
  107. // BAD-9 минуты +кривые секунды
  108. sf.setStrBad1("02:a3")
  109. // BAD-10 кривые минуты +секунды
  110. sf.setStrBad1("60:03")
  111. // BAD-11 кривые минуты +секунды
  112. sf.setStrBad1("-1:03")
  113. // BAD-12 минуты +кривые секунды
  114. sf.setStrBad1("01:60")
  115. // BAD-13 минуты +кривые секунды
  116. sf.setStrBad1("01:-1")
  117. // BAD-14 кривые часы +минуты + секунды
  118. sf.setStrBad1("-1:02:03")
  119. // BAD-15 кривые часы +минуты + секунды
  120. //sf.setStrBad1("24:02:03")
  121. ct.Parse("03") // GOOD-1 секунды
  122. ct.Parse("02:03") // GOOD-2 минуты секунды
  123. ct.Parse("01:02:03") // GOOD-3 часы минуты секунды
  124. }
  125. // Устанавливает число секунд для отсчёта
  126. func (sf *tester) setInt() {
  127. go sf.call()
  128. ct := NewCountTime()
  129. ct.Set(-1) // Bad-1 Отрицательное число
  130. { // GOOD-1
  131. ct.Set(8)
  132. if ct.parser.Hour().Get() != 0 {
  133. sf.t.Errorf("setInt(): GOOD-1 hour(%v)!=0", sf.ct.parser.Hour().Get())
  134. }
  135. if ct.parser.Min().Get() != 0 {
  136. sf.t.Errorf("setInt(): GOOD-1 min(%v)!=0", sf.ct.parser.Min().Get())
  137. }
  138. if ct.parser.Sec().Get() != 8 {
  139. sf.t.Errorf("setInt(): GOOD-1 sec(%v)!=8", sf.ct.parser.Sec().Get())
  140. }
  141. if strVal := ct.String(); strVal != "00:00:08" {
  142. sf.t.Errorf("setInt(): GOOD-1 strVal(%v)!='00:00:08'", strVal)
  143. }
  144. }
  145. { // GOOD-2
  146. ct.Set(121)
  147. if ct.parser.Hour().Get() != 0 {
  148. sf.t.Errorf("setInt(): GOOD-2 hour(%v)!=0", sf.ct.parser.Hour().Get())
  149. }
  150. if ct.parser.Min().Get() != 2 {
  151. sf.t.Errorf("setInt(): GOOD-2 min(%v)!=2", sf.ct.parser.Min().Get())
  152. }
  153. if ct.parser.Sec().Get() != 1 {
  154. sf.t.Errorf("setInt(): GOOD-2 sec(%v)!=1", sf.ct.parser.Sec().Get())
  155. }
  156. if strVal := ct.String(); strVal != "00:02:01" {
  157. sf.t.Errorf("setInt(): GOOD-2 strVal(%v)!='00:02:01'", strVal)
  158. }
  159. }
  160. { // GOOD-3
  161. ct.Set(7203)
  162. if ct.parser.Hour().Get() != 2 {
  163. sf.t.Errorf("setInt(): GOOD-3 hour(%v)!=2", sf.ct.parser.Hour().Get())
  164. }
  165. if ct.parser.Min().Get() != 0 {
  166. sf.t.Errorf("setInt(): GOOD-3 min(%v)!=0", sf.ct.parser.Min().Get())
  167. }
  168. if ct.parser.Sec().Get() != 3 {
  169. sf.t.Errorf("setInt(): GOOD-3 sec(%v)!=3", sf.ct.parser.Sec().Get())
  170. }
  171. if strVal := ct.String(); strVal != "02:00:03" {
  172. sf.t.Errorf("setInt(): GOOD-3 strVal(%v)!='02:00:03'", strVal)
  173. }
  174. }
  175. }
  176. // Правильное создание
  177. func (sf *tester) createGood1() {
  178. ct := NewCountTime()
  179. if ct == nil {
  180. sf.t.Errorf("createGood1(): countTime==nil")
  181. }
  182. if val := ct.Get(); val != 0 {
  183. sf.t.Errorf("createGood1(): val(%v)!=0", val)
  184. }
  185. }
  186. // Создание счётчика обратного времени
  187. func (sf *tester) create() {
  188. sf.createGood1()
  189. }