use miniconf::{Indices, KeyError, Packed, Path, Shape, Tree, TreeSchema, TreeSerialize};
mod common;
#[derive(Tree, Default)]
struct Settings {
a: f32,
b: [f32; 2],
}
#[test]
fn packed() {
let info = Settings::SCHEMA.get(Packed::EMPTY).unwrap();
assert_eq!((info.depth, info.schema.is_leaf()), (0, false));
for iter_path in Settings::SCHEMA
.nodes::<Path<String>, 2>()
.map(Result::unwrap)
{
let packed: Packed = Settings::SCHEMA.transcode(iter_path.as_ref()).unwrap();
let path: Path<String> = Settings::SCHEMA.transcode(packed).unwrap();
assert_eq!(path, iter_path);
println!(
"{path:?} {iter_path:?}, {:#06b} {} {:?}",
packed.get() >> 60,
packed.into_lsb(),
Settings::SCHEMA.get(iter_path.as_ref()).unwrap().depth
);
}
println!(
"{:?}",
Settings::SCHEMA
.nodes::<Packed, 2>()
.map(|p| p.unwrap().into_lsb())
.collect::<Vec<_>>()
);
let a = Packed::from_lsb(0b10.try_into().unwrap());
let path: Path<String> = Settings::SCHEMA.transcode(a).unwrap();
assert_eq!(Settings::SCHEMA.get(a).unwrap().depth, 1);
assert_eq!(path.as_ref(), "/a");
}
#[test]
fn top() {
#[derive(Tree)]
struct S {
baz: [i32; 1],
foo: i32,
}
assert_eq!(
S::SCHEMA
.nodes::<Path<String>, 2>()
.map(|p| p.unwrap().into_inner())
.collect::<Vec<_>>(),
["/baz/0", "/foo"]
);
assert_eq!(
S::SCHEMA
.nodes::<Indices<_>, 2>()
.map(|p| p.unwrap())
.collect::<Vec<_>>(),
[Indices::new([0, 0], 2), Indices::new([1, 0], 1)]
);
let p: Packed = S::SCHEMA.transcode([1usize]).unwrap();
assert_eq!(
(p.into_lsb().get(), S::SCHEMA.get([1usize]).unwrap().depth),
(0b11, 1)
);
assert_eq!(
S::SCHEMA
.nodes::<Packed, 2>()
.map(|p| p.unwrap().into_lsb().get())
.collect::<Vec<_>>(),
[0b100, 0b11]
);
}
#[test]
fn zero_key() {
assert_eq!(
Option::<()>::SCHEMA
.nodes::<Packed, 2>()
.next()
.unwrap()
.unwrap()
.into_lsb()
.get(),
0b1
);
assert_eq!(
<[usize; 1]>::SCHEMA
.nodes::<Packed, 2>()
.next()
.unwrap()
.unwrap()
.into_lsb()
.get(),
0b10
);
let a11 = [[0]];
let a22 = [[0; 2]; 2];
let mut buf = [0u8; 100];
let mut ser = serde_json_core::ser::Serializer::new(&mut buf);
for (depth, result) in [
Err(KeyError::TooShort.into()),
Err(KeyError::TooShort.into()),
Ok(()),
]
.iter()
.enumerate()
{
assert_eq!(
TreeSerialize::serialize_by_key(
&a11,
Packed::from_lsb((0b1 << depth).try_into().unwrap()),
&mut ser
),
*result
);
assert_eq!(
TreeSerialize::serialize_by_key(
&a22,
Packed::from_lsb((0b1 << depth).try_into().unwrap()),
&mut ser
),
*result
);
}
}
#[test]
fn size() {
type A31 = [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[(); 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1];
1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1]; 1];
assert_eq!(core::mem::size_of::<A31>(), 0);
let packed = Packed::new_from_lsb(1 << 31).unwrap();
let path = A31::SCHEMA.transcode::<Path<String>>(packed).unwrap();
assert_eq!(A31::SCHEMA.get(packed).unwrap().depth, 31);
assert_eq!(path.as_ref().len(), 2 * 31);
const META: Shape = A31::SCHEMA.shape();
assert_eq!(META.max_bits, 31);
assert_eq!(META.max_depth, 31);
assert_eq!(META.count.get(), 1usize.pow(31));
assert_eq!(META.max_length, 31);
type A16 = [[[[[[[[[[[[[[[[(); 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 3]; 1];
assert_eq!(core::mem::size_of::<A16>(), 0);
let packed = Packed::new_from_lsb(1 << 31).unwrap();
let path = A16::SCHEMA.transcode::<Path<String>>(packed).unwrap();
assert_eq!(A16::SCHEMA.get(packed).unwrap().depth, 16);
assert_eq!(path.as_ref().len(), 2 * 16);
const META16: Shape = A16::SCHEMA.shape();
assert_eq!(META16.max_bits, 31);
assert_eq!(META16.max_depth, 16);
assert_eq!(META16.count.get(), 3usize.pow(15));
assert_eq!(META16.max_length, 16);
}