Skip to content

Commit

Permalink
Fix negation with overflow (#657)
Browse files Browse the repository at this point in the history
* Fix negation with overflow
* Extend scope of tests to remove blindness
---------

Co-authored-by: Paul Mason <paul@salsa.dev>
  • Loading branch information
benschulz and paupino authored Apr 11, 2024
1 parent 913dc5b commit 6f7d295
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/decimal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1990,7 +1990,7 @@ impl FromPrimitive for Decimal {
unsigned = n as u128;
flags = 0;
} else {
unsigned = -n as u128;
unsigned = n.unsigned_abs();
flags = SIGN_MASK;
};
// Check if we overflow
Expand Down
25 changes: 19 additions & 6 deletions tests/decimal_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2967,11 +2967,18 @@ fn it_converts_from_i128() {
(92233720368547758089, Some("92233720368547758089")),
(0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF, Some("79228162514264337593543950335")),
(0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF, None),
(i128::MIN, None),
(i128::MAX, None),
];
for (value, expected) in tests {
if let Some(expected_value) = expected {
let decimal = Decimal::from_str(expected_value).unwrap();
assert_eq!(num_traits::FromPrimitive::from_i128(*value), Some(decimal));
let from_i128 = num_traits::FromPrimitive::from_i128(*value);

match expected {
Some(expected_value) => {
let decimal = Decimal::from_str(expected_value).unwrap();
assert_eq!(from_i128, Some(decimal));
}
None => assert!(from_i128.is_none()),
}
}
}
Expand All @@ -2983,11 +2990,17 @@ fn it_converts_from_u128() {
(0xFFFF_FFFF_FFFF_FFFF, Some("18446744073709551615")),
(0xFFFF_FFFF_FFFF_FFFF_FFFF_FFFF, Some("79228162514264337593543950335")),
(0x7FFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF_FFFF, None),
(u128::MAX, None),
];
for (value, expected) in tests {
if let Some(expected_value) = expected {
let decimal = Decimal::from_str(expected_value).unwrap();
assert_eq!(num_traits::FromPrimitive::from_u128(*value), Some(decimal));
let from_u128 = num_traits::FromPrimitive::from_u128(*value);

match expected {
Some(expected_value) => {
let decimal = Decimal::from_str(expected_value).unwrap();
assert_eq!(from_u128, Some(decimal));
}
None => assert!(from_u128.is_none()),
}
}
}
Expand Down

0 comments on commit 6f7d295

Please sign in to comment.