use serde_json::json;
use sz_rust_macros::compact;
#[test]
fn test_compact_basic_single_variable() {
let code = 1i32;
let map = compact!(code);
assert_eq!(map.len(), 1);
assert_eq!(map["code"], 1);
}
#[test]
fn test_compact_basic_multiple_variables() {
let name = "alice";
let age = 30i32;
let map = compact!(name, age);
assert_eq!(map.len(), 2);
assert_eq!(map["name"], "alice");
assert_eq!(map["age"], 30);
}
#[test]
fn test_compact_empty_arguments() {
let map = compact!();
assert_eq!(map.len(), 0);
assert!(map.is_empty());
}
#[test]
fn test_compact_preserves_field_order() {
let code = 1i32;
let msg = "ok".to_string();
let data = json!({"id": 1});
let map = compact!(code, msg, data);
let keys: Vec<&String> = map.keys().collect();
assert_eq!(keys, vec!["code", "msg", "data"]);
}
#[test]
fn test_compact_order_independent_of_variable_declaration() {
let zebra = "z";
let apple = "a";
let mango = "m";
let map = compact!(apple, mango, zebra);
let keys: Vec<&String> = map.keys().collect();
assert_eq!(keys, vec!["apple", "mango", "zebra"]);
}
#[test]
fn test_compact_supports_i32() {
let value = 42i32;
let map = compact!(value);
assert_eq!(map["value"], 42);
}
#[test]
fn test_compact_supports_i64() {
let value = 9223372036854775807i64;
let map = compact!(value);
assert_eq!(map["value"], 9223372036854775807i64);
}
#[test]
fn test_compact_supports_string() {
let value = "hello".to_string();
let map = compact!(value);
assert_eq!(map["value"], "hello");
}
#[test]
fn test_compact_supports_str() {
let value = "world";
let map = compact!(value);
assert_eq!(map["value"], "world");
}
#[test]
fn test_compact_supports_bool() {
let value = true;
let map = compact!(value);
assert_eq!(map["value"], true);
}
#[test]
fn test_compact_supports_vec() {
let value = vec![1, 2, 3];
let map = compact!(value);
assert_eq!(map["value"], json!([1, 2, 3]));
}
#[test]
fn test_compact_supports_serde_json_value() {
let value = json!({"nested": {"key": "val"}});
let map = compact!(value);
assert_eq!(map["value"]["nested"]["key"], "val");
}
#[test]
fn test_compact_supports_option() {
let some_value: Option<i32> = Some(42);
let none_value: Option<i32> = None;
let map = compact!(some_value, none_value);
assert_eq!(map["some_value"], 42);
assert_eq!(map["none_value"], serde_json::Value::Null);
}
#[test]
fn test_php_consistency_compact_returns_array_with_variable_names_as_keys() {
let code = 1i32;
let msg = "success".to_string();
let data = json!({"list": [], "total": 0});
let result = compact!(code, msg, data);
assert_eq!(result["code"], 1, "键名 'code' 对应变量 $code 的值");
assert_eq!(result["msg"], "success", "键名 'msg' 对应变量 $msg 的值");
assert_eq!(
result["data"]["total"], 0,
"键名 'data' 对应变量 $data 的值"
);
}
#[test]
fn test_php_consistency_compact_field_order_matches_argument_order() {
let data = json!({});
let msg = "ok".to_string();
let code = 1i32;
let result = compact!(code, msg, data);
let keys: Vec<&String> = result.keys().collect();
assert_eq!(
keys,
vec!["code", "msg", "data"],
"字段顺序必须为 code → msg → data(对齐 PHP compact() 参数顺序)"
);
}
#[test]
fn test_php_consistency_compact_render_json_scenario() {
let code = 1i32;
let msg = "".to_string();
let data = json!({});
let result = compact!(code, msg, data);
let keys: Vec<&String> = result.keys().collect();
assert_eq!(keys, vec!["code", "msg", "data"]);
assert_eq!(result["code"], 1);
assert_eq!(result["msg"], "");
assert_eq!(result["data"], json!({}));
}
#[test]
fn test_php_consistency_compact_with_error_code() {
let code = -1i32;
let msg = "未登录".to_string();
let data = json!({});
let result = compact!(code, msg, data);
assert_eq!(
result["code"], -1,
"错误码 -1 = 未登录(对齐 PHP BaseException)"
);
assert_eq!(result["msg"], "未登录");
assert_eq!(result["data"], json!({}));
}
#[test]
fn test_php_consistency_compact_with_complex_data() {
let code = 1i32;
let msg = "查询成功".to_string();
let data = json!({
"list": [{"id": 1, "name": "alice"}, {"id": 2, "name": "bob"}],
"total": 2,
"page": 1,
"size": 10
});
let result = compact!(code, msg, data);
assert_eq!(result["code"], 1);
assert_eq!(result["msg"], "查询成功");
assert_eq!(result["data"]["total"], 2);
assert_eq!(result["data"]["list"][0]["id"], 1);
assert_eq!(result["data"]["list"][0]["name"], "alice");
assert_eq!(result["data"]["list"][1]["id"], 2);
assert_eq!(result["data"]["list"][1]["name"], "bob");
assert_eq!(result["data"]["page"], 1);
assert_eq!(result["data"]["size"], 10);
}