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
15 {inf.NewDec(1, 0), big.NewInt(2), big.NewInt(3)},
16 {inf.NewDec(-1, 0), big.NewInt(-2), big.NewInt(3)},
17 {inf.NewDec(-1, 0), big.NewInt(2), big.NewInt(-3)},
18 {inf.NewDec(1, 0), big.NewInt(-2), big.NewInt(-3)},
19
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