@@ -81,17 +81,45 @@ def self.name
81
81
assert_predicate ( subject , :valid? )
82
82
end
83
83
84
- def test_virtual_attribute_with_precision
84
+ def test_virtual_attribute_with_precision_round_down
85
85
model_class . attribute ( :virtual_decimal_number , :decimal , precision : 5 )
86
86
model_class . validates_numericality_of (
87
87
:virtual_decimal_number , equal_to : 123.45
88
88
)
89
89
90
- subject = model_class . new ( virtual_decimal_number : 123.455 )
90
+ subject = model_class . new ( virtual_decimal_number : 123.454 )
91
91
92
92
assert_predicate subject , :valid?
93
93
end
94
94
95
+ def test_virtual_attribute_with_precision_round_half_even
96
+ model_class . attribute ( :virtual_decimal_number , :decimal , precision : 5 )
97
+ model_class . validates_numericality_of (
98
+ :virtual_decimal_number , equal_to : 123.45
99
+ )
100
+
101
+ subject = model_class . new ( virtual_decimal_number : 123.455 )
102
+
103
+ if RUBY_VERSION > "3.0.0"
104
+ # BigDecimal's to_d behavior changed in BigDecimal 3.0.1, see https://github.com/ruby/bigdecimal/issues/70
105
+ # TOOD: replace this with a check against BigDecimal::VERSION
106
+ assert_not_predicate subject , :valid?
107
+ else
108
+ assert_predicate subject , :valid?
109
+ end
110
+ end
111
+
112
+ def test_virtual_attribute_with_precision_round_up
113
+ model_class . attribute ( :virtual_decimal_number , :decimal , precision : 5 )
114
+ model_class . validates_numericality_of (
115
+ :virtual_decimal_number , equal_to : 123.45
116
+ )
117
+
118
+ subject = model_class . new ( virtual_decimal_number : 123.456 )
119
+
120
+ assert_not_predicate subject , :valid?
121
+ end
122
+
95
123
def test_virtual_attribute_with_scale
96
124
model_class . attribute ( :virtual_decimal_number , :decimal , scale : 2 )
97
125
model_class . validates_numericality_of (
0 commit comments