Files
core/test/rust/compiler/numeric/mod.rs
T
2026-11-03 03:32:07 +00:00

77 lines
3.4 KiB
Rust

use super::checked;
mod handler_range;
mod range;
#[test]
fn decimal_and_float_clauses_cover_their_actual_value_domains() {
for text in [
"pick(value: Decimal < 0.0) (answer: Int) { answer = -1 }\npick(value: Decimal >= 0.0) (answer: Int) { answer = 1 }",
"pick(value: other) (answer: Int) { answer = 1 }\npick(value: -0.0) (answer: Int) { answer = 0 }",
"pick(value: null) (answer: Int) { answer = 0 }\npick(value: Decimal < 0.0) (answer: Int) { answer = -1 }\npick(value: other) (answer: Int) { answer = 1 }",
"pick(value: 1.0e0) (answer: Int) { answer = 1 }\npick(value: other) (answer: Int) { answer = 0 }",
"pick(value: null) (answer: Int) { answer = 0 }\npick(value: 0.0e0) (answer: Int) { answer = 1 }\npick(value: other) (answer: Int) { answer = 2 }",
"pick(value: Int <= 9223372036854775807) () {}",
"pick(value: Int >= -9223372036854775808) () {}",
] {
checked(text).unwrap_or_else(|error| panic!("{text}\n{error:?}"));
}
for text in [
"pick(value: Decimal < 0.0) () {}",
"pick(value: Decimal <= 0.0) () {}\npick(value: Decimal >= 0.0) () {}",
"pick(value: 1.0) () {}\npick(value: 1.00) () {}\npick(value: other) () {}",
"pick(value: 0.0e0) () {}\npick(value: -0.0e0) () {}\npick(value: other) () {}",
"pick(value: 1.0e0) () {}",
"pick(value: Float) () {}\npick(value: other) () {}",
"pick(value: Int > 9223372036854775807) () {}\npick(value: other) () {}",
] {
let error = checked(text).unwrap_err();
assert_eq!(error.code, "C009", "{text}: {error:?}");
}
}
#[test]
fn decimal_partitions_use_exact_successors_at_precision_and_exponent_limits() {
for (left, right) in [
("1.0", "1.000000000000000000000000000000001"),
("0.0", "1e-6176"),
("-1e-6176", "0.0"),
(
"9.999999999999999999999999999999998e6144",
"9.999999999999999999999999999999999e6144",
),
] {
let text = format!(
"pick(value: Decimal <= {left}) () {{}}\npick(value: Decimal >= {right}) () {{}}"
);
checked(&text).unwrap_or_else(|error| panic!("{text}: {error:?}"));
}
for text in [
"pick(value: Decimal <= 1.0) () {}\npick(value: Decimal >= 1.000000000000000000000000000000002) () {}",
"pick(value: Decimal > 9.999999999999999999999999999999999e6144) () {}\npick(value: other) () {}",
"pick(value: Decimal < -9.999999999999999999999999999999999e6144) () {}\npick(value: other) () {}",
] {
assert_eq!(checked(text).unwrap_err().code, "C009", "{text}");
}
}
#[test]
fn numeric_pattern_validation_rejects_invalid_bounds_and_mixed_types() {
for (text, code) in [
("pick(value: 9223372036854775808) () {}", "C008"),
("pick(value: 1e9999) () {}", "C008"),
(
"pick(value: Decimal < 0.12345678901234567890123456789012345) () {}",
"C008",
),
("pick(value: Int < 1.5) () {}", "C008"),
("pick(value: Float < 1.0e0) () {}", "C005"),
("pick(value: Decimal? < 1.0) () {}", "C005"),
("pick(value: 1.0) () {}\npick(value: Float) () {}", "C005"),
] {
assert_eq!(checked(text).unwrap_err().code, code, "{text}");
}
assert!(checked("pick(value: Int >= 1 and) () {}").is_err());
assert!(checked("pick(value: Decimal < 1.0 and) () {}").is_err());
}