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  }