go-ml.dev/pkg/base@v0.0.0-20200610162856-60c38abac71b/tests/counter_test.go (about) 1 package tests 2 3 import ( 4 "go-ml.dev/pkg/base/fu" 5 "gotest.tools/assert" 6 "gotest.tools/assert/cmp" 7 "sync" 8 "testing" 9 ) 10 11 func Test_Counter1(t *testing.T) { 12 assert.Assert(t, cmp.Panics(func() { 13 wc := fu.WaitCounter{Value: 10} 14 wc.Wait(1) 15 })) 16 wc := fu.WaitCounter{Value: 0} 17 wc.Inc() 18 wc.Wait(1) 19 wc.Inc() 20 assert.Assert(t, wc.Value == 2) 21 } 22 23 func Test_Counter2(t *testing.T) { 24 assert.Assert(t, cmp.Panics(func() { 25 wc := fu.WaitCounter{Value: 10} 26 wc.Wait(1) 27 })) 28 29 wc1 := fu.WaitCounter{Value: 0} 30 wc2 := fu.WaitCounter{Value: 0} 31 wc3 := fu.WaitCounter{Value: 0} 32 33 N := 10 34 x := make([]int, N) 35 wg := sync.WaitGroup{} 36 37 for i := 0; i < N; i++ { 38 wg.Add(1) 39 go func(i int) { 40 if wc1.Wait(uint64(i)) { 41 x[i] = i + 1 42 wc1.Inc() 43 } 44 if wc2.Wait(uint64(i + 1)) { 45 x[i] = N - i 46 wc2.Inc() 47 } 48 if wc3.Wait(uint64(i + 1)) { 49 x[i] = 0 50 wc3.Inc() 51 } 52 wg.Done() 53 }(i) 54 } 55 56 wc1.Wait(uint64(N)) 57 for i := 0; i < N; i++ { 58 assert.Assert(t, x[i] == i+1) 59 } 60 assert.Assert(t, wc2.Inc() == true) 61 assert.Assert(t, wc2.Stopped() == false) 62 wc2.Wait(uint64(N + 1)) 63 for i := 0; i < N; i++ { 64 assert.Assert(t, x[i] == N-i) 65 } 66 wc3.Stop() 67 assert.Assert(t, wc3.Inc() == false) 68 assert.Assert(t, wc3.Stopped() == true) 69 wg.Wait() 70 for i := 0; i < N; i++ { 71 assert.Assert(t, x[i] == N-i) 72 } 73 }