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 }