use rbs::Value;
use rbatis_codegen::ops::Add;
#[test]
fn test_value_add_value() {
assert_eq!(Value::I32(5).op_add(&Value::I32(3)), Value::I32(8));
assert_eq!(Value::I64(5).op_add(&Value::I64(3)), Value::I64(8));
assert_eq!(Value::U32(5).op_add(&Value::U32(3)), Value::U32(8));
assert_eq!(Value::U64(5).op_add(&Value::U64(3)), Value::U64(8));
assert_eq!(Value::F32(5.0).op_add(&Value::F32(3.0)), Value::F64(8.0));
assert_eq!(Value::F64(5.0).op_add(&Value::F64(3.0)), Value::F64(8.0));
assert_eq!(
Value::String("hello".to_string()).op_add(&Value::String("world".to_string())),
Value::String("helloworld".to_string())
);
}
#[test]
fn test_value_add_primitive() {
assert_eq!(Value::I32(5).op_add(&3i32), 8i64);
assert_eq!(Value::I64(5).op_add(&3i64), 8i64);
assert_eq!(Value::U32(5).op_add(&3u32), 8u64);
assert_eq!(Value::U64(5).op_add(&3u64), 8u64);
assert_eq!(Value::F32(5.0).op_add(&3.0f32), 8.0f64);
assert_eq!(Value::F64(5.0).op_add(&3.0f64), 8.0f64);
let result = Value::String("hello".to_string()).op_add(&"world");
assert_eq!(result, Value::String("helloworld".to_string()));
let string_val = "hello".op_add(&Value::String("world".to_string()));
assert_eq!(string_val, "helloworld".to_string());
}
#[test]
fn test_primitive_add_value() {
assert_eq!(5i32.op_add(&Value::I32(3)), 8i64);
assert_eq!(5i64.op_add(&Value::I64(3)), 8i64);
assert_eq!(5u32.op_add(&Value::U32(3)), 8u64);
assert_eq!(5u64.op_add(&Value::U64(3)), 8u64);
assert_eq!(5.0f32.op_add(&Value::F32(3.0)), 8.0f64);
assert_eq!(5.0f64.op_add(&Value::F64(3.0)), 8.0f64);
let s1 = "hello".to_string();
let s2 = "world".to_string();
let v1 = Value::String(s2);
assert_eq!(s1.clone().op_add(&v1), "helloworld".to_string());
assert_eq!((&s1).op_add(&v1), "helloworld".to_string());
}
#[test]
fn test_string_add_behavior() {
let s1 = "hello".to_string();
let s2 = "world".to_string();
let v1 = Value::String("hello".to_string());
let v2 = Value::String("world".to_string());
assert_eq!(s1.clone().op_add(&v2), "helloworld".to_string());
let result = v1.clone().op_add(&s2);
println!("Value::String + String = {:?}", result);
assert_eq!(result, Value::String("helloworld".to_string()));
assert_eq!("hello".op_add(&v2), "helloworld".to_string());
assert_eq!(v1.op_add(&"world"), Value::String("helloworld".to_string()));
}
#[test]
fn test_string_add_number() {
let s = "number:".to_string();
let v_num = Value::I32(42);
let result = s.op_add(&v_num);
println!("String + Value::Number = {:?}", result);
assert_eq!(result, "number:42".to_string());
let result2 = v_num.op_add(&"42".to_string());
println!("Value::Number + String = {:?}", result2);
}
#[test]
fn test_mixed_type_add() {
let num = 42i32;
let s = "answer".to_string();
let result1 = num.op_add(&Value::String(s.clone()));
println!("Number + Value::String = {:?}", result1);
let result2 = Value::I32(num).op_add(&s);
println!("Value::Number + String = {:?}", result2);
}