use qubit_value::Value;
use qubit_value::ValueWireV1Seed;
use serde::de::DeserializeSeed;
use serde::de::IntoDeserializer;
#[test]
fn test_wide_integer_wire_rejects_number_payload() {
assert!(
crate::decode_value_wire_value(serde_json::json!({"version": 1, "value": {"scalar": {"int128": 1}}})).is_err()
);
}
#[test]
fn test_wide_integer_wire_rejects_invalid_decimal_text() {
for text in ["", "+1", "01", "12x", "-1"] {
let input = serde_json::json!({
"version": 1,
"value": {"scalar": {"uint128": text}},
});
let error = crate::decode_value_wire_value(input).expect_err("invalid unsigned integer text must be rejected");
let message = error.to_string();
if matches!(text, "+1" | "01") {
assert!(message.contains("canonical"), "unexpected error for {text:?}: {error}");
} else {
assert!(
message.contains("invalid") || message.contains("empty"),
"unexpected parse error for {text:?}: {error}"
);
}
}
}
#[test]
fn test_wide_integer_wire_parses_extreme_values() {
for (text, expected) in [
(i128::MIN.to_string(), Value::Int128(i128::MIN).into()),
(i128::MAX.to_string(), Value::Int128(i128::MAX).into()),
] {
assert_eq!(
crate::decode_value_wire_value(serde_json::json!({"version": 1, "value": {"scalar": {"int128": text}}}))
.expect("signed limit must decode")
.into_container(),
expected,
);
}
for (text, expected) in [
(u128::MIN.to_string(), Value::UInt128(u128::MIN).into()),
(u128::MAX.to_string(), Value::UInt128(u128::MAX).into()),
] {
assert_eq!(
crate::decode_value_wire_value(serde_json::json!({"version": 1, "value": {"scalar": {"uint128": text}}}))
.expect("unsigned limit must decode")
.into_container(),
expected,
);
}
}
#[test]
fn test_wide_integer_wire_parses_owned_extreme_strings() {
for (tag, text, expected) in [
("int128", i128::MIN.to_string(), Value::Int128(i128::MIN)),
("uint128", u128::MAX.to_string(), Value::UInt128(u128::MAX)),
] {
let input = serde_json::json!({"version": 1, "value": {"scalar": {tag: text}}});
let wire = ValueWireV1Seed::new()
.deserialize(input.into_deserializer())
.expect("owned extreme integer string must decode");
assert_eq!(wire.into_container(), expected.into());
}
}
#[test]
fn test_wide_integer_wire_rejects_owned_noncanonical_string_precisely() {
let input = serde_json::json!({"version": 1, "value": {"scalar": {"int128": "+1"}}});
let error = ValueWireV1Seed::new()
.deserialize(input.into_deserializer())
.expect_err("owned non-canonical integer string must be rejected");
assert_eq!(error.to_string(), "non-canonical 128-bit integer string",);
}