#![cfg_attr(feature = "alloc_trait", feature(allocator_api))]

extern crate jemallocator;

use jemallocator::Jemalloc;

#[global_allocator]
static A: Jemalloc = Jemalloc;

#[test]
#[cfg(feature = "alloc_trait")]
fn shrink_in_place() {
    unsafe {
        use std::alloc::{Alloc, Layout};

        // allocate a "large" block of memory:
        let orig_sz = 10 * 4096;
        let orig_l = Layout::from_size_align(orig_sz, 1).unwrap();
        let ptr = Jemalloc.alloc(orig_l).unwrap();

        // try to shrink it in place to 1 byte - if this succeeds,
        // the size-class of the new allocation should be different
        // than that of the original allocation:
        let new_sz = 1;
        if let Ok(()) = Jemalloc.shrink_in_place(ptr, orig_l, new_sz) {
            // test that deallocating with the new layout succeeds:
            let new_l = Layout::from_size_align(new_sz, 1).unwrap();
            Jemalloc.dealloc(ptr, new_l);
        } else {
            // if shrink in place failed - deallocate with the old layout
            Jemalloc.dealloc(ptr, orig_l);
        }
    }
}
