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  }