#![cfg(feature = "capnp")]
use nautilus_model::types::{Price, Quantity};
use nautilus_serialization::capnp::{FromCapnp, ToCapnp, types_capnp};
use rstest::rstest;
#[rstest]
#[case(Price::from("100.50"))]
#[case(Price::from("0.00001"))]
#[case(Price::from("99999.999"))]
#[case(Price::from("1.0"))]
fn test_price_roundtrip(#[case] price: Price) {
let mut message = capnp::message::Builder::new_default();
let builder = message.init_root::<types_capnp::price::Builder>();
price.to_capnp(builder);
let mut bytes = Vec::new();
capnp::serialize::write_message(&mut bytes, &message).unwrap();
let reader =
capnp::serialize::read_message(&mut &bytes[..], capnp::message::ReaderOptions::new())
.unwrap();
let root = reader.get_root::<types_capnp::price::Reader>().unwrap();
let decoded = Price::from_capnp(root).unwrap();
assert_eq!(price, decoded);
}
#[rstest]
#[case(Quantity::from("1000.5"))]
#[case(Quantity::from("0.0001"))]
#[case(Quantity::from("999999.999"))]
#[case(Quantity::from("1.0"))]
fn test_quantity_roundtrip(#[case] qty: Quantity) {
let mut message = capnp::message::Builder::new_default();
let builder = message.init_root::<types_capnp::quantity::Builder>();
qty.to_capnp(builder);
let mut bytes = Vec::new();
capnp::serialize::write_message(&mut bytes, &message).unwrap();
let reader =
capnp::serialize::read_message(&mut &bytes[..], capnp::message::ReaderOptions::new())
.unwrap();
let root = reader.get_root::<types_capnp::quantity::Reader>().unwrap();
let decoded = Quantity::from_capnp(root).unwrap();
assert_eq!(qty, decoded);
}
#[rstest]
fn test_price_with_helper_functions() {
let price = Price::from("123.45");
let bytes = nautilus_serialization::capnp::conversions::serialize_price(&price).unwrap();
let decoded = nautilus_serialization::capnp::conversions::deserialize_price(&bytes).unwrap();
assert_eq!(price, decoded);
}
#[rstest]
fn test_quantity_with_helper_functions() {
let qty = Quantity::from("100.5");
let bytes = nautilus_serialization::capnp::conversions::serialize_quantity(&qty).unwrap();
let decoded = nautilus_serialization::capnp::conversions::deserialize_quantity(&bytes).unwrap();
assert_eq!(qty, decoded);
}
#[rstest]
fn test_price_zero() {
let price = Price::from("0.0");
let mut message = capnp::message::Builder::new_default();
let builder = message.init_root::<types_capnp::price::Builder>();
price.to_capnp(builder);
let mut bytes = Vec::new();
capnp::serialize::write_message(&mut bytes, &message).unwrap();
let reader =
capnp::serialize::read_message(&mut &bytes[..], capnp::message::ReaderOptions::new())
.unwrap();
let root = reader.get_root::<types_capnp::price::Reader>().unwrap();
let decoded = Price::from_capnp(root).unwrap();
assert_eq!(price, decoded);
}
#[rstest]
fn test_quantity_zero() {
let qty = Quantity::from("0.0");
let mut message = capnp::message::Builder::new_default();
let builder = message.init_root::<types_capnp::quantity::Builder>();
qty.to_capnp(builder);
let mut bytes = Vec::new();
capnp::serialize::write_message(&mut bytes, &message).unwrap();
let reader =
capnp::serialize::read_message(&mut &bytes[..], capnp::message::ReaderOptions::new())
.unwrap();
let root = reader.get_root::<types_capnp::quantity::Reader>().unwrap();
let decoded = Quantity::from_capnp(root).unwrap();
assert_eq!(qty, decoded);
}
#[rstest]
fn test_price_negative() {
let price = Price::from("-50.25");
let mut message = capnp::message::Builder::new_default();
let builder = message.init_root::<types_capnp::price::Builder>();
price.to_capnp(builder);
let mut bytes = Vec::new();
capnp::serialize::write_message(&mut bytes, &message).unwrap();
let reader =
capnp::serialize::read_message(&mut &bytes[..], capnp::message::ReaderOptions::new())
.unwrap();
let root = reader.get_root::<types_capnp::price::Reader>().unwrap();
let decoded = Price::from_capnp(root).unwrap();
assert_eq!(price, decoded);
}
#[rstest]
fn test_price_max_precision() {
let price = Price::from("123.123456789");
let mut message = capnp::message::Builder::new_default();
let builder = message.init_root::<types_capnp::price::Builder>();
price.to_capnp(builder);
let mut bytes = Vec::new();
capnp::serialize::write_message(&mut bytes, &message).unwrap();
let reader =
capnp::serialize::read_message(&mut &bytes[..], capnp::message::ReaderOptions::new())
.unwrap();
let root = reader.get_root::<types_capnp::price::Reader>().unwrap();
let decoded = Price::from_capnp(root).unwrap();
assert_eq!(price, decoded);
}
#[rstest]
fn test_quantity_max_precision() {
let qty = Quantity::from("100.123456789");
let mut message = capnp::message::Builder::new_default();
let builder = message.init_root::<types_capnp::quantity::Builder>();
qty.to_capnp(builder);
let mut bytes = Vec::new();
capnp::serialize::write_message(&mut bytes, &message).unwrap();
let reader =
capnp::serialize::read_message(&mut &bytes[..], capnp::message::ReaderOptions::new())
.unwrap();
let root = reader.get_root::<types_capnp::quantity::Reader>().unwrap();
let decoded = Quantity::from_capnp(root).unwrap();
assert_eq!(qty, decoded);
}