use std::panic::{self, AssertUnwindSafe};
use structio::{Options, beve, json};
struct Boom;
impl json::Write for Boom {
fn write<O: Options>(&self, w: &mut json::Writer<'_, O>) {
json::Write::write(&1u32, w);
panic!("structio test: unencodable");
}
}
impl beve::Write for Boom {
fn write<O: Options>(&self, w: &mut beve::Writer<'_, O>) {
beve::Write::write(&vec![1.5f64, 2.5], w);
panic!("structio test: unencodable");
}
}
fn unwound(f: impl FnOnce()) -> bool {
panic::catch_unwind(AssertUnwindSafe(f)).is_err()
}
fn framed() -> Vec<u8> {
let mut out = Vec::with_capacity(256);
out.extend_from_slice(b"\x00\x01\x02\x03header");
out
}
#[test]
fn json_append_leaves_the_prefix_alone() {
let mut out = framed();
let (before, ptr) = (out.clone(), out.as_ptr());
assert!(unwound(|| json::append(&Boom, &mut out)));
assert_eq!(out, before);
assert!(std::ptr::eq(out.as_ptr(), ptr));
}
#[test]
fn beve_append_leaves_the_prefix_alone() {
let mut out = framed();
let (before, ptr) = (out.clone(), out.as_ptr());
assert!(unwound(|| beve::append(&Boom, &mut out)));
assert_eq!(out, before);
assert!(std::ptr::eq(out.as_ptr(), ptr));
}
#[test]
fn beve_append_aligned_leaves_the_prefix_alone() {
let mut out = framed();
let (before, ptr) = (out.clone(), out.as_ptr());
assert!(unwound(|| beve::append_aligned(&Boom, &mut out)));
assert_eq!(out, before);
assert!(std::ptr::eq(out.as_ptr(), ptr));
}
#[test]
fn an_empty_buffer_is_still_empty() {
let mut out = Vec::new();
assert!(unwound(|| json::append(&Boom, &mut out)));
assert!(out.is_empty());
}
#[test]
fn a_buffer_appended_to_again_carries_on_from_the_header() {
#[derive(Default)]
struct Reading {
id: u32,
}
structio::object!(Reading { id });
let mut out = framed();
let header = out.len();
assert!(unwound(|| json::append(&Boom, &mut out)));
json::append(&Reading { id: 7 }, &mut out);
assert_eq!(&out[header..], br#"{"id":7}"#);
}
#[test]
fn json_write_into_is_left_empty() {
let mut out = String::from(r#"{"id":1}"#);
assert!(unwound(|| json::write_into(&Boom, &mut out)));
assert!(out.is_empty());
}
#[test]
fn beve_write_into_is_left_empty() {
let mut out = vec![1u8, 2, 3];
assert!(unwound(|| beve::write_into(&Boom, &mut out)));
assert!(out.is_empty());
}