123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- package inf_test
- import (
- "math/big"
- "testing"
- "gopkg.in/inf.v0"
- )
- var decRounderInputs = [...]struct {
- quo *inf.Dec
- rA, rB *big.Int
- }{
- // examples from go language spec
- {inf.NewDec(1, 0), big.NewInt(2), big.NewInt(3)}, // 5 / 3
- {inf.NewDec(-1, 0), big.NewInt(-2), big.NewInt(3)}, // -5 / 3
- {inf.NewDec(-1, 0), big.NewInt(2), big.NewInt(-3)}, // 5 / -3
- {inf.NewDec(1, 0), big.NewInt(-2), big.NewInt(-3)}, // -5 / -3
- // examples from godoc
- {inf.NewDec(-1, 1), big.NewInt(-8), big.NewInt(10)},
- {inf.NewDec(-1, 1), big.NewInt(-5), big.NewInt(10)},
- {inf.NewDec(-1, 1), big.NewInt(-2), big.NewInt(10)},
- {inf.NewDec(0, 1), big.NewInt(-8), big.NewInt(10)},
- {inf.NewDec(0, 1), big.NewInt(-5), big.NewInt(10)},
- {inf.NewDec(0, 1), big.NewInt(-2), big.NewInt(10)},
- {inf.NewDec(0, 1), big.NewInt(0), big.NewInt(1)},
- {inf.NewDec(0, 1), big.NewInt(2), big.NewInt(10)},
- {inf.NewDec(0, 1), big.NewInt(5), big.NewInt(10)},
- {inf.NewDec(0, 1), big.NewInt(8), big.NewInt(10)},
- {inf.NewDec(1, 1), big.NewInt(2), big.NewInt(10)},
- {inf.NewDec(1, 1), big.NewInt(5), big.NewInt(10)},
- {inf.NewDec(1, 1), big.NewInt(8), big.NewInt(10)},
- }
- var decRounderResults = [...]struct {
- rounder inf.Rounder
- results [len(decRounderInputs)]*inf.Dec
- }{
- {inf.RoundExact, [...]*inf.Dec{nil, nil, nil, nil,
- nil, nil, nil, nil, nil, nil,
- inf.NewDec(0, 1), nil, nil, nil, nil, nil, nil}},
- {inf.RoundDown, [...]*inf.Dec{
- inf.NewDec(1, 0), inf.NewDec(-1, 0), inf.NewDec(-1, 0), inf.NewDec(1, 0),
- inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
- inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
- inf.NewDec(0, 1),
- inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
- inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1)}},
- {inf.RoundUp, [...]*inf.Dec{
- inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
- inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-2, 1),
- inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
- inf.NewDec(0, 1),
- inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1),
- inf.NewDec(2, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
- {inf.RoundHalfDown, [...]*inf.Dec{
- inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
- inf.NewDec(-2, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
- inf.NewDec(-1, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
- inf.NewDec(0, 1),
- inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(1, 1),
- inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(2, 1)}},
- {inf.RoundHalfUp, [...]*inf.Dec{
- inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
- inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-1, 1),
- inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(0, 1),
- inf.NewDec(0, 1),
- inf.NewDec(0, 1), inf.NewDec(1, 1), inf.NewDec(1, 1),
- inf.NewDec(1, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
- {inf.RoundHalfEven, [...]*inf.Dec{
- inf.NewDec(2, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(2, 0),
- inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-1, 1),
- inf.NewDec(-1, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
- inf.NewDec(0, 1),
- inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(1, 1),
- inf.NewDec(1, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
- {inf.RoundFloor, [...]*inf.Dec{
- inf.NewDec(1, 0), inf.NewDec(-2, 0), inf.NewDec(-2, 0), inf.NewDec(1, 0),
- inf.NewDec(-2, 1), inf.NewDec(-2, 1), inf.NewDec(-2, 1),
- inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
- inf.NewDec(0, 1),
- inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
- inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1)}},
- {inf.RoundCeil, [...]*inf.Dec{
- inf.NewDec(2, 0), inf.NewDec(-1, 0), inf.NewDec(-1, 0), inf.NewDec(2, 0),
- inf.NewDec(-1, 1), inf.NewDec(-1, 1), inf.NewDec(-1, 1),
- inf.NewDec(0, 1), inf.NewDec(0, 1), inf.NewDec(0, 1),
- inf.NewDec(0, 1),
- inf.NewDec(1, 1), inf.NewDec(1, 1), inf.NewDec(1, 1),
- inf.NewDec(2, 1), inf.NewDec(2, 1), inf.NewDec(2, 1)}},
- }
- func TestDecRounders(t *testing.T) {
- for i, a := range decRounderResults {
- for j, input := range decRounderInputs {
- q := new(inf.Dec).Set(input.quo)
- rA, rB := new(big.Int).Set(input.rA), new(big.Int).Set(input.rB)
- res := a.rounder.Round(new(inf.Dec), q, rA, rB)
- if a.results[j] == nil && res == nil {
- continue
- }
- if (a.results[j] == nil && res != nil) ||
- (a.results[j] != nil && res == nil) ||
- a.results[j].Cmp(res) != 0 {
- t.Errorf("#%d,%d Rounder got %v; expected %v", i, j, res, a.results[j])
- }
- }
- }
- }
|