blob: c8c93ef483303d331eec73f56fa1dc8d2c1ec117 [file] [log] [blame]
use crate::known_deep_size;
use crate::DeepSizeOf;
use alloc::{boxed::Box, string::String, vec};
use core::mem::size_of;
#[test]
fn primitive_types() {
assert_eq!(0u8.deep_size_of(), 1);
assert_eq!(0u16.deep_size_of(), 2);
assert_eq!(0u32.deep_size_of(), 4);
assert_eq!(0u64.deep_size_of(), 8);
assert_eq!(0usize.deep_size_of(), size_of::<usize>());
assert_eq!(0i8.deep_size_of(), 1);
assert_eq!(0i16.deep_size_of(), 2);
assert_eq!(0i32.deep_size_of(), 4);
assert_eq!(0i64.deep_size_of(), 8);
assert_eq!(0isize.deep_size_of(), size_of::<isize>());
assert_eq!(0f32.deep_size_of(), 4);
assert_eq!(0f64.deep_size_of(), 8);
assert_eq!('f'.deep_size_of(), 4);
assert_eq!("Hello World!".deep_size_of(), 12);
assert_eq!((&"Hello World!").deep_size_of(), 16);
assert_eq!(true.deep_size_of(), 1);
}
#[test]
fn boxes() {
let boxed = Box::new(0u32);
assert_eq!(boxed.deep_size_of(), 4 + size_of::<usize>());
}
#[test]
fn arcs() {
use std::sync::Arc;
let test: Arc<[u32]> = vec![1, 2, 3].into();
let multiple = (Arc::clone(&test), Arc::clone(&test), test);
assert_eq!(
multiple.deep_size_of(),
3 * size_of::<Arc<[u32]>>() + 3 * size_of::<u32>()
);
}
#[test]
fn slices() {
let array: Box<[u32]> = vec![0; 64].into_boxed_slice();
assert_eq!(array[5..10].deep_size_of(), 4 * 5);
assert_eq!(array[..32].deep_size_of(), 4 * 32);
assert_eq!(
DeepSizeOf::deep_size_of(&array),
size_of::<usize>() * 2 + size_of::<[u32; 64]>()
);
}
// TODO: find edge cases
#[test]
fn alignment() {
#[repr(align(256))]
struct Test(u8);
known_deep_size!(0; Test);
struct Test2(Test, u8);
known_deep_size!(0; Test2);
let array: [Test; 3] = [Test(5), Test(16), Test(2)];
assert_eq!(size_of::<[Test; 3]>(), array.deep_size_of());
let vec = vec![Test(5), Test(16), Test(2)];
assert_eq!(vec.deep_size_of(), 256 * 3 + 24);
let vec = vec![Test2(Test(5), 0), Test2(Test(16), 0), Test2(Test(2), 0)];
assert_eq!(vec.deep_size_of(), 512 * 3 + 24);
}
#[test]
fn strings() {
let string_a = String::from("01234567");
let string_b = String::from("0123456789012345");
assert_eq!(string_a.deep_size_of(), size_of::<String>() + 8);
assert_eq!(string_b.deep_size_of(), size_of::<String>() + 16);
}
#[test]
fn tuples() {
// Alignment - ######## #.##....
let non_allocating = (45u64, (), (8u8, 16u16));
let text = "Hello World";
let allocating = (Box::new(42u32), String::from(text));
assert_eq!(
non_allocating.deep_size_of(),
size_of::<(u64, (), (u8, u16))>()
);
assert_eq!(
allocating.deep_size_of(),
size_of::<(Box<()>, String)>() + text.len() + size_of::<u32>()
);
}
mod context_tests {
use crate::Context;
#[test]
fn context_arc_test() {
let mut context = Context::new();
let arc = alloc::sync::Arc::new(15);
assert_eq!(context.contains_arc(&arc), false);
context.add_arc(&arc);
assert_eq!(context.contains_arc(&arc), true);
}
#[test]
fn context_rc_test() {
let mut context = Context::new();
let rc = alloc::rc::Rc::new(15);
assert_eq!(context.contains_rc(&rc), false);
context.add_rc(&rc);
assert_eq!(context.contains_rc(&rc), true);
}
}
#[cfg(feature = "derive")]
mod test_derive {
use super::*;
#[test]
fn test_1() {
#[derive(DeepSizeOf)]
struct Example<'a>(&'a u32, &'a u32);
let number = &42;
let example = Example(number, number);
let size = example.deep_size_of();
// Data past references is not counted
assert_eq!(size, 2 * size_of::<usize>());
}
#[test]
fn test_enum() {
#[derive(DeepSizeOf)]
enum ExampleEnum {
One,
Two(),
Three(u32, Box<u8>),
Four { name: Box<u32> },
Five {},
}
let variant_one = ExampleEnum::One;
let variant_two = ExampleEnum::Two();
let variant_three = ExampleEnum::Three(0, Box::new(255));
let variant_four = ExampleEnum::Four {
name: Box::new(65536),
};
let variant_five = ExampleEnum::Five {};
assert_eq!(variant_one.deep_size_of(), size_of::<ExampleEnum>());
assert_eq!(variant_two.deep_size_of(), size_of::<ExampleEnum>());
assert_eq!(
variant_three.deep_size_of(),
size_of::<ExampleEnum>() + size_of::<u8>()
);
assert_eq!(
variant_four.deep_size_of(),
size_of::<ExampleEnum>() + size_of::<u32>()
);
assert_eq!(variant_five.deep_size_of(), size_of::<ExampleEnum>());
}
}