use crate::{
db::{
executor::aggregate::numeric::add_numeric_decimal, numeric::average_decimal_terms_checked,
},
error::{ErrorClass, ErrorDetail, ErrorOrigin, QueryErrorDetail},
types::Decimal,
};
#[test]
fn aggregate_numeric_addition_reports_checked_overflow() {
let left = Decimal::from_i128_with_scale(i128::MAX, 0);
let right = Decimal::from_i128_with_scale(1, 0);
let err = add_numeric_decimal(left, right).expect_err("overflow should fail checked addition");
assert_eq!(err.class(), ErrorClass::Unsupported);
assert_eq!(err.origin(), ErrorOrigin::Query);
assert!(
matches!(
err.detail(),
Some(ErrorDetail::Query(QueryErrorDetail::NumericOverflow))
),
"numeric overflow should preserve structured query error detail"
);
}
#[test]
fn aggregate_numeric_avg_division_uses_shared_rounding_semantics() {
let sum = Decimal::from_num(-1_i64).expect("sum decimal");
let result =
average_decimal_terms_checked(sum, 6_u64).expect("decimal avg should produce one value");
assert_eq!(
result,
Decimal::from_i128_with_scale(-166_666_666_666_666_667, 18)
);
}