#![expect(missing_docs)]
use monero_oxide::transaction::Transaction;
use monero_simple_request_rpc::{prelude::MoneroDaemon, SimpleRequestTransport};
use monero_wallet::{extra::MAX_ARBITRARY_DATA_SIZE, send::SendError};
mod runner;
type Rpc = MoneroDaemon<SimpleRequestTransport>;
test!(
add_single_data_less_than_max,
(
async |_, mut builder: Builder, addr| {
let arbitrary_data = vec![b'\0'; MAX_ARBITRARY_DATA_SIZE - 1];
builder.add_data(arbitrary_data.clone()).unwrap();
builder.add_payment(addr, 5);
(builder.build().unwrap(), (arbitrary_data,))
},
async |_rpc: Rpc, block, tx: Transaction, mut scanner: Scanner, data: (Vec<u8>,)| {
let output = scanner.scan(block).unwrap().not_additionally_locked().swap_remove(0);
assert_eq!(output.transaction(), tx.hash());
assert_eq!(output.commitment().amount, 5);
assert_eq!(output.arbitrary_data()[0], data.0);
},
),
);
test!(
add_multiple_data_less_than_max,
(
async |_, mut builder: Builder, addr| {
let mut data = vec![];
for b in 1 ..= 3 {
data.push(vec![b; MAX_ARBITRARY_DATA_SIZE - 1]);
}
for data in &data {
builder.add_data(data.clone()).unwrap();
}
builder.add_payment(addr, 5);
(builder.build().unwrap(), data)
},
async |_rpc: Rpc, block, tx: Transaction, mut scanner: Scanner, data: Vec<Vec<u8>>| {
let output = scanner.scan(block).unwrap().not_additionally_locked().swap_remove(0);
assert_eq!(output.transaction(), tx.hash());
assert_eq!(output.commitment().amount, 5);
assert_eq!(output.arbitrary_data(), data);
},
),
);
test!(
add_single_data_more_than_max,
(
async |_, mut builder: Builder, addr| {
let mut data = vec![b'a'; MAX_ARBITRARY_DATA_SIZE + 1];
assert_eq!(builder.add_data(data.clone()), Err(SendError::TooMuchArbitraryData));
data.pop();
builder.add_data(data.clone()).unwrap();
builder.add_payment(addr, 5);
(builder.build().unwrap(), data)
},
async |_rpc: Rpc, block, tx: Transaction, mut scanner: Scanner, data: Vec<u8>| {
let output = scanner.scan(block).unwrap().not_additionally_locked().swap_remove(0);
assert_eq!(output.transaction(), tx.hash());
assert_eq!(output.commitment().amount, 5);
assert_eq!(output.arbitrary_data(), vec![data]);
},
),
);