github.com/MetalBlockchain/metalgo@v1.11.9/utils/math/safe_math_test.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package math 5 6 import ( 7 "math" 8 "testing" 9 10 "github.com/stretchr/testify/require" 11 ) 12 13 const maxUint64 uint64 = math.MaxUint64 14 15 func TestAdd64(t *testing.T) { 16 require := require.New(t) 17 18 sum, err := Add64(0, maxUint64) 19 require.NoError(err) 20 require.Equal(maxUint64, sum) 21 22 sum, err = Add64(maxUint64, 0) 23 require.NoError(err) 24 require.Equal(maxUint64, sum) 25 26 sum, err = Add64(uint64(1<<62), uint64(1<<62)) 27 require.NoError(err) 28 require.Equal(uint64(1<<63), sum) 29 30 _, err = Add64(1, maxUint64) 31 require.ErrorIs(err, ErrOverflow) 32 33 _, err = Add64(maxUint64, 1) 34 require.ErrorIs(err, ErrOverflow) 35 36 _, err = Add64(maxUint64, maxUint64) 37 require.ErrorIs(err, ErrOverflow) 38 } 39 40 func TestSub(t *testing.T) { 41 require := require.New(t) 42 43 got, err := Sub(uint64(2), uint64(1)) 44 require.NoError(err) 45 require.Equal(uint64(1), got) 46 47 got, err = Sub(uint64(2), uint64(2)) 48 require.NoError(err) 49 require.Zero(got) 50 51 got, err = Sub(maxUint64, maxUint64) 52 require.NoError(err) 53 require.Zero(got) 54 55 got, err = Sub(uint64(3), uint64(2)) 56 require.NoError(err) 57 require.Equal(uint64(1), got) 58 59 _, err = Sub(uint64(1), uint64(2)) 60 require.ErrorIs(err, ErrUnderflow) 61 62 _, err = Sub(maxUint64-1, maxUint64) 63 require.ErrorIs(err, ErrUnderflow) 64 } 65 66 func TestMul64(t *testing.T) { 67 require := require.New(t) 68 69 got, err := Mul64(0, maxUint64) 70 require.NoError(err) 71 require.Zero(got) 72 73 got, err = Mul64(maxUint64, 0) 74 require.NoError(err) 75 require.Zero(got) 76 77 got, err = Mul64(uint64(1), uint64(3)) 78 require.NoError(err) 79 require.Equal(uint64(3), got) 80 81 got, err = Mul64(uint64(3), uint64(1)) 82 require.NoError(err) 83 require.Equal(uint64(3), got) 84 85 got, err = Mul64(uint64(2), uint64(3)) 86 require.NoError(err) 87 require.Equal(uint64(6), got) 88 89 got, err = Mul64(maxUint64, 0) 90 require.NoError(err) 91 require.Zero(got) 92 93 _, err = Mul64(maxUint64-1, 2) 94 require.ErrorIs(err, ErrOverflow) 95 } 96 97 func TestAbsDiff(t *testing.T) { 98 require := require.New(t) 99 100 require.Equal(maxUint64, AbsDiff(0, maxUint64)) 101 require.Equal(maxUint64, AbsDiff(maxUint64, 0)) 102 require.Equal(uint64(2), AbsDiff(uint64(3), uint64(1))) 103 require.Equal(uint64(2), AbsDiff(uint64(1), uint64(3))) 104 require.Zero(AbsDiff(uint64(1), uint64(1))) 105 require.Zero(AbsDiff(uint64(0), uint64(0))) 106 }