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()); }