rounder_test.go 3.7 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(1, 0), big.NewInt(2), big.NewInt(3)}, // 5 / 3
  12. {NewDec(-1, 0), big.NewInt(-2), big.NewInt(3)}, // -5 / 3
  13. {NewDec(-1, 0), big.NewInt(2), big.NewInt(-3)}, // 5 / -3
  14. {NewDec(1, 0), big.NewInt(-2), big.NewInt(-3)}, // -5 / -3
  15. // examples from godoc
  16. {NewDec(-1, 1), big.NewInt(-8), big.NewInt(10)},
  17. {NewDec(-1, 1), big.NewInt(-5), big.NewInt(10)},
  18. {NewDec(-1, 1), big.NewInt(-2), big.NewInt(10)},
  19. {NewDec(0, 1), big.NewInt(-8), big.NewInt(10)},
  20. {NewDec(0, 1), big.NewInt(-5), big.NewInt(10)},
  21. {NewDec(0, 1), big.NewInt(-2), big.NewInt(10)},
  22. {NewDec(0, 1), big.NewInt(0), big.NewInt(1)},
  23. {NewDec(0, 1), big.NewInt(2), big.NewInt(10)},
  24. {NewDec(0, 1), big.NewInt(5), big.NewInt(10)},
  25. {NewDec(0, 1), big.NewInt(8), big.NewInt(10)},
  26. {NewDec(1, 1), big.NewInt(2), big.NewInt(10)},
  27. {NewDec(1, 1), big.NewInt(5), big.NewInt(10)},
  28. {NewDec(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(0, 1), nil, nil, nil, nil, nil, nil}},
  37. {RoundDown, [...]*Dec{
  38. NewDec(1, 0), NewDec(-1, 0), NewDec(-1, 0), NewDec(1, 0),
  39. NewDec(-1, 1), NewDec(-1, 1), NewDec(-1, 1),
  40. NewDec(0, 1), NewDec(0, 1), NewDec(0, 1),
  41. NewDec(0, 1),
  42. NewDec(0, 1), NewDec(0, 1), NewDec(0, 1),
  43. NewDec(1, 1), NewDec(1, 1), NewDec(1, 1)}},
  44. {RoundUp, [...]*Dec{
  45. NewDec(2, 0), NewDec(-2, 0), NewDec(-2, 0), NewDec(2, 0),
  46. NewDec(-2, 1), NewDec(-2, 1), NewDec(-2, 1),
  47. NewDec(-1, 1), NewDec(-1, 1), NewDec(-1, 1),
  48. NewDec(0, 1),
  49. NewDec(1, 1), NewDec(1, 1), NewDec(1, 1),
  50. NewDec(2, 1), NewDec(2, 1), NewDec(2, 1)}},
  51. {RoundHalfDown, [...]*Dec{
  52. NewDec(2, 0), NewDec(-2, 0), NewDec(-2, 0), NewDec(2, 0),
  53. NewDec(-2, 1), NewDec(-1, 1), NewDec(-1, 1),
  54. NewDec(-1, 1), NewDec(0, 1), NewDec(0, 1),
  55. NewDec(0, 1),
  56. NewDec(0, 1), NewDec(0, 1), NewDec(1, 1),
  57. NewDec(1, 1), NewDec(1, 1), NewDec(2, 1)}},
  58. {RoundHalfUp, [...]*Dec{
  59. NewDec(2, 0), NewDec(-2, 0), NewDec(-2, 0), NewDec(2, 0),
  60. NewDec(-2, 1), NewDec(-2, 1), NewDec(-1, 1),
  61. NewDec(-1, 1), NewDec(-1, 1), NewDec(0, 1),
  62. NewDec(0, 1),
  63. NewDec(0, 1), NewDec(1, 1), NewDec(1, 1),
  64. NewDec(1, 1), NewDec(2, 1), NewDec(2, 1)}},
  65. {RoundHalfEven, [...]*Dec{
  66. NewDec(2, 0), NewDec(-2, 0), NewDec(-2, 0), NewDec(2, 0),
  67. NewDec(-2, 1), NewDec(-2, 1), NewDec(-1, 1),
  68. NewDec(-1, 1), NewDec(0, 1), NewDec(0, 1),
  69. NewDec(0, 1),
  70. NewDec(0, 1), NewDec(0, 1), NewDec(1, 1),
  71. NewDec(1, 1), NewDec(2, 1), NewDec(2, 1)}},
  72. {RoundFloor, [...]*Dec{
  73. NewDec(1, 0), NewDec(-2, 0), NewDec(-2, 0), NewDec(1, 0),
  74. NewDec(-2, 1), NewDec(-2, 1), NewDec(-2, 1),
  75. NewDec(-1, 1), NewDec(-1, 1), NewDec(-1, 1),
  76. NewDec(0, 1),
  77. NewDec(0, 1), NewDec(0, 1), NewDec(0, 1),
  78. NewDec(1, 1), NewDec(1, 1), NewDec(1, 1)}},
  79. {RoundCeil, [...]*Dec{
  80. NewDec(2, 0), NewDec(-1, 0), NewDec(-1, 0), NewDec(2, 0),
  81. NewDec(-1, 1), NewDec(-1, 1), NewDec(-1, 1),
  82. NewDec(0, 1), NewDec(0, 1), NewDec(0, 1),
  83. NewDec(0, 1),
  84. NewDec(1, 1), NewDec(1, 1), NewDec(1, 1),
  85. NewDec(2, 1), NewDec(2, 1), NewDec(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. }