rounder_test.go 5.0 KB

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