github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/eval/vals/hash_test.go (about)

     1  package vals
     2  
     3  import (
     4  	"math"
     5  	"math/big"
     6  	"os"
     7  	"testing"
     8  	"unsafe"
     9  
    10  	"github.com/markusbkk/elvish/pkg/persistent/hash"
    11  	. "github.com/markusbkk/elvish/pkg/tt"
    12  )
    13  
    14  type hasher struct{}
    15  
    16  func (hasher) Hash() uint32 { return 42 }
    17  
    18  type nonHasher struct{}
    19  
    20  func TestHash(t *testing.T) {
    21  	z := big.NewInt(5)
    22  	z.Lsh(z, 8*uint(unsafe.Sizeof(int(0))))
    23  	z.Add(z, big.NewInt(9))
    24  	// z = 5 << wordSize + 9
    25  
    26  	Test(t, Fn("Hash", Hash), Table{
    27  		Args(false).Rets(uint32(0)),
    28  		Args(true).Rets(uint32(1)),
    29  		Args(1).Rets(uint32(1)),
    30  		Args(z).Rets(hash.DJB(1, 9, 5)),
    31  		Args(big.NewRat(3, 2)).Rets(hash.DJB(Hash(big.NewInt(3)), Hash(big.NewInt(2)))),
    32  		Args(1.0).Rets(hash.UInt64(math.Float64bits(1.0))),
    33  		Args("foo").Rets(hash.String("foo")),
    34  		Args(os.Stdin).Rets(hash.UIntPtr(os.Stdin.Fd())),
    35  		Args(MakeList("foo", "bar")).Rets(hash.DJB(Hash("foo"), Hash("bar"))),
    36  		Args(MakeMap("foo", "bar")).
    37  			Rets(hash.DJB(Hash("foo"), Hash("bar"))),
    38  		Args(hasher{}).Rets(uint32(42)),
    39  		Args(nonHasher{}).Rets(uint32(0)),
    40  	})
    41  }