github.com/andoma-go/puddle/v2@v2.2.1/log_test.go (about)

     1  package puddle
     2  
     3  import (
     4  	"math"
     5  	"math/rand"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestLog2Uint(t *testing.T) {
    13  	r := require.New(t)
    14  
    15  	r.Equal(uint8(0), log2Int(1))
    16  	r.Equal(uint8(0), log2Int[uint64](1))
    17  	r.Equal(uint8(1), log2Int[uint32](2))
    18  	r.Equal(uint8(7), log2Int[uint8](math.MaxUint8))
    19  	r.Equal(uint8(15), log2Int[uint16](math.MaxUint16))
    20  	r.Equal(uint8(31), log2Int[uint32](math.MaxUint32))
    21  	r.Equal(uint8(63), log2Int[uint64](math.MaxUint64))
    22  
    23  	r.Panics(func() { log2Int[uint64](0) })
    24  	r.Panics(func() { log2Int[int64](-1) })
    25  }
    26  
    27  func FuzzLog2Uint(f *testing.F) {
    28  	const cnt = 1000
    29  
    30  	rand := rand.New(rand.NewSource(time.Now().UnixNano()))
    31  	for i := 0; i < cnt; i++ {
    32  		val := uint64(rand.Int63())
    33  		// val + 1 not to test val == 0.
    34  		f.Add(val + 1)
    35  	}
    36  
    37  	f.Fuzz(func(t *testing.T, val uint64) {
    38  		var mx uint8
    39  		for i := 63; i >= 0; i-- {
    40  			mask := uint64(1) << i
    41  			if mask&val != 0 {
    42  				mx = uint8(i)
    43  				break
    44  			}
    45  		}
    46  
    47  		require.Equal(t, mx, log2Int(val))
    48  	})
    49  }