counttime_test.go 6.6 KB

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