You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

110 lines
4.3 KiB

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