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  }