github.com/andy2046/gopie@v0.7.0/pkg/sequence/memsequence_test.go (about) 1 package sequence_test 2 3 import ( 4 . "github.com/andy2046/gopie/pkg/sequence" 5 "testing" 6 ) 7 8 type tester struct { 9 T *testing.T 10 seq Sequencer 11 } 12 13 func (t tester) Next() uint64 { 14 id, err := t.seq.Next() 15 if err != nil { 16 t.T.Fatal("error:", err) 17 } 18 return id 19 } 20 21 func (t tester) NextN(n int) uint64 { 22 id, err := t.seq.NextN(n) 23 if err != nil { 24 t.T.Fatal("error:", err) 25 } 26 return id 27 } 28 29 func TestSequence_Next(t *testing.T) { 30 s := NewMemSeq(0) 31 test := tester{t, s} 32 33 loop := uint64(3) 34 for i := uint64(0); i < loop; i++ { 35 test.Next() 36 } 37 n := test.Next() 38 if n != loop { 39 t.Errorf("error: expected %d got %d", loop, n) 40 } 41 42 n = test.NextN(1000) 43 if n != loop+1 { 44 t.Errorf("error: expected %d got %d", loop+1, n) 45 } 46 47 n = test.Next() 48 if n != loop+1001 { 49 t.Errorf("error: expected %d got %d", loop+1001, n) 50 } 51 } 52 53 func TestSequence_Parallel(t *testing.T) { 54 s := NewMemSeq(0) 55 test := tester{t, s} 56 57 consumer := make(chan uint64) 58 const numID = 10000 59 generate := func() { 60 for i := 0; i < numID; i++ { 61 consumer <- test.Next() 62 } 63 } 64 const numGenerator = 10 65 for i := 0; i < numGenerator; i++ { 66 go generate() 67 } 68 set := make(map[uint64]bool) 69 for i := 0; i < numID*numGenerator; i++ { 70 id := <-consumer 71 if _, exist := set[id]; exist { 72 t.Fatal("error: duplicated") 73 } 74 set[id] = true 75 } 76 }