...

Source file src/gopkg.in/inf.v0/rounder_test.go

Documentation: gopkg.in/inf.v0

     1  package inf_test
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"gopkg.in/inf.v0"
     8  )
     9  
    10  var decRounderInputs = [...]struct {
    11  	quo    *inf.Dec
    12  	rA, rB *big.Int
    13  }{
    14  	// examples from go language spec
    15  	{inf.NewDec(1, 0), big.NewInt(2), big.NewInt(3)},   //  5 /  3
    16  	{inf.NewDec(-1, 0), big.NewInt(-2), big.NewInt(3)}, // -5 /  3
    17  	{inf.NewDec(-1, 0), big.NewInt(2), big.NewInt(-3)}, //  5 / -3
    18  	{inf.NewDec(1, 0), big.NewInt(-2), big.NewInt(-3)}, // -5 / -3
    19  	// examples from godoc
    20  	{inf.NewDec(-1, 1), big.NewInt(-8), big.NewInt(10)},
    21  	{inf.NewDec(-1, 1), big.NewInt(-5), big.NewInt(10)},
    22  	{inf.NewDec(-1, 1), big.NewInt(-2), big.NewInt(10)},
    23  	{inf.NewDec(0, 1), big.NewInt(-8), big.NewInt(10)},
    24  	{inf.NewDec(0, 1), big.NewInt(-5), big.NewInt(10)},
    25  	{inf.NewDec(0, 1), big.NewInt(-2), big.NewInt(10)},
    26  	{inf.NewDec(0, 1), big.NewInt(0), big.NewInt(1)},
    27  	{inf.NewDec(0, 1), big.NewInt(2), big.NewInt(10)},
    28  	{inf.NewDec(0, 1), big.NewInt(5), big.NewInt(10)},
    29  	{inf.NewDec(0, 1), big.NewInt(8), big.NewInt(10)},
    30  	{inf.NewDec(1, 1), big.NewInt(2), big.NewInt(10)},
    31  	{inf.NewDec(1, 1), big.NewInt(5), big.NewInt(10)},
    32  	{inf.NewDec(1, 1), big.NewInt(8), big.NewInt(10)},
    33  }
    34  
    35  var decRounderResults = [...]struct {
    36  	rounder inf.Rounder
    37  	results [len(decRounderInputs)]*inf.Dec
    38  }{
    39  	{inf.RoundExact, [...]*inf.Dec{nil, nil, nil, nil,
    40  		nil, nil, nil, nil, nil, nil,
    41  		inf.NewDec(0, 1), nil, nil, nil, nil, nil, nil}},
    42  	{inf.RoundDown, [...]*inf.Dec{
    43  		inf.NewDec(1, 0), inf.NewDec(-1, 0), inf.NewDec(-1, 0), inf.NewDec(1, 0),
    44  		inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
    45  		inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
    46  		inf.NewDec(0, 1),
    47  		inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
    48  		inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1)}},
    49  	{inf.RoundUp, [...]*inf.Dec{
    50  		inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
    51  		inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-2, 1),
    52  		inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
    53  		inf.NewDec(0, 1),
    54  		inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1),
    55  		inf.NewDec(2, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
    56  	{inf.RoundHalfDown, [...]*inf.Dec{
    57  		inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
    58  		inf.NewDec(-2, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
    59  		inf.NewDec(-1, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
    60  		inf.NewDec(0, 1),
    61  		inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(1, 1),
    62  		inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(2, 1)}},
    63  	{inf.RoundHalfUp, [...]*inf.Dec{
    64  		inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
    65  		inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-1, 1),
    66  		inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(0, 1),
    67  		inf.NewDec(0, 1),
    68  		inf.NewDec(0, 1), inf.NewDec(1, 1), inf.NewDec(1, 1),
    69  		inf.NewDec(1, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
    70  	{inf.RoundHalfEven, [...]*inf.Dec{
    71  		inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
    72  		inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-1, 1),
    73  		inf.NewDec(-1, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
    74  		inf.NewDec(0, 1),
    75  		inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(1, 1),
    76  		inf.NewDec(1, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
    77  	{inf.RoundFloor, [...]*inf.Dec{
    78  		inf.NewDec(1, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(1, 0),
    79  		inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-2, 1),
    80  		inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
    81  		inf.NewDec(0, 1),
    82  		inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
    83  		inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1)}},
    84  	{inf.RoundCeil, [...]*inf.Dec{
    85  		inf.NewDec(2, 0), inf.NewDec(-1, 0), inf.NewDec(-1, 0), inf.NewDec(2, 0),
    86  		inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
    87  		inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
    88  		inf.NewDec(0, 1),
    89  		inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1),
    90  		inf.NewDec(2, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
    91  }
    92  
    93  func TestDecRounders(t *testing.T) {
    94  	for i, a := range decRounderResults {
    95  		for j, input := range decRounderInputs {
    96  			q := new(inf.Dec).Set(input.quo)
    97  			rA, rB := new(big.Int).Set(input.rA), new(big.Int).Set(input.rB)
    98  			res := a.rounder.Round(new(inf.Dec), q, rA, rB)
    99  			if a.results[j] == nil && res == nil {
   100  				continue
   101  			}
   102  			if (a.results[j] == nil && res != nil) ||
   103  				(a.results[j] != nil && res == nil) ||
   104  				a.results[j].Cmp(res) != 0 {
   105  				t.Errorf("#%d,%d Rounder got %v; expected %v", i, j, res, a.results[j])
   106  			}
   107  		}
   108  	}
   109  }
   110  

View as plain text