use super::*; #[test] fn test_valid_unsigned_casting() { Tester::new_single_source_expect_ok("cast u8", " func foo() -> bool { u64 large_width = 255; u8 small_width = 255; // Explicit casting auto large_exp_to_08 = cast (large_width); auto large_exp_to_16 = cast(large_width); auto large_exp_to_32 = cast(large_width); auto large_exp_to_64 = cast(large_width); auto small_exp_to_08 = cast (small_width); auto small_exp_to_16 = cast(small_width); auto small_exp_to_32 = cast(small_width); auto small_exp_to_64 = cast(small_width); // Implicit casting u8 large_imp_to_08 = cast(large_width); u16 large_imp_to_16 = cast(large_width); u32 large_imp_to_32 = cast(large_width); u64 large_imp_to_64 = cast(large_width); u8 small_imp_to_08 = cast(small_width); u16 small_imp_to_16 = cast(small_width); u32 small_imp_to_32 = cast(small_width); u64 small_imp_to_64 = cast(small_width); return large_exp_to_08 == 255 && large_exp_to_16 == 255 && large_exp_to_32 == 255 && large_exp_to_64 == 255 && small_exp_to_08 == 255 && small_exp_to_16 == 255 && small_exp_to_32 == 255 && small_exp_to_64 == 255 && large_imp_to_08 == 255 && large_imp_to_16 == 255 && large_imp_to_32 == 255 && large_imp_to_64 == 255 && small_imp_to_08 == 255 && small_imp_to_16 == 255 && small_imp_to_32 == 255 && small_imp_to_64 == 255; } ").for_function("foo", |f| { f .call_ok(Some(Value::Bool(true))); }); } #[test] fn test_invalid_casting() { fn generate_source(input_type: &str, input_value: &str, output_type: &str) -> String { return format!(" func foo() -> u32 {{ {} value = {}; {} result = cast(value); return 0; }} ", input_type, input_value, output_type); } fn perform_test(input_type: &str, input_value: &str, output_type: &str) { Tester::new_single_source_expect_ok( format!("invalid cast {} to {}", input_type, output_type), generate_source(input_type, input_value, output_type) ).for_function("foo", |f| { f.call_err(&format!("'{}' which doesn't fit in a type '{}'", input_value, output_type)); }); } // Not exhaustive, good enough let tests = [ // Unsigned large to small width ("u16", "256", "u8"), ("u32", "256", "u8"), ("u64", "256", "u8"), ("u32", "65536", "u16"), ("u64", "65536", "u16"), // Signed to unsigned ("s8", "-1", "u8"), ("s32", "-1", "u16"), ("s32", "65536", "u16"), // Signed to signed of smaller width ("s16", "-129", "s8"), ("s16", "128", "s8"), // Unsigned to signed ("u8", "128", "s8"), ("u16", "32768", "s16") ]; for (input_type, input_value, output_type) in &tests { perform_test(input_type, input_value, output_type); } }