github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/num_queue_test.go (about)

     1  package utils
     2  
     3  import (
     4  	"math/rand"
     5  	"sync"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestNumQueue(t *testing.T) {
    12  
    13  	t.Run("Simple", func(t *testing.T) {
    14  		N := uint64(100)
    15  		q := NewNumQueue(0)
    16  		for i := uint64(1); i <= N; i++ {
    17  			var iter sync.WaitGroup
    18  			iter.Add(1)
    19  			go func(i uint64) {
    20  				defer iter.Done()
    21  				q.WaitFor(i)
    22  			}(i)
    23  
    24  			q.Done(i)
    25  			iter.Wait()
    26  		}
    27  	})
    28  
    29  	t.Run("Random", func(t *testing.T) {
    30  		require := require.New(t)
    31  		N := 100
    32  
    33  		q := NewNumQueue(0)
    34  		output := make(chan uint64, 10)
    35  		nums := rand.Perm(N)
    36  
    37  		for _, n := range nums {
    38  			go func(n uint64) {
    39  				q.WaitFor(n - 1)
    40  				output <- n
    41  				if n == uint64(N) {
    42  					close(output)
    43  				}
    44  				q.Done(n)
    45  
    46  			}(uint64(n + 1))
    47  		}
    48  
    49  		var prev uint64
    50  		for got := range output {
    51  			require.Less(prev, got)
    52  			prev = got
    53  		}
    54  	})
    55  }