use super::alloc::User;
use super::alloc::{copy_from_userspace, copy_to_userspace};

#[test]
fn test_copy_to_userspace_function() {
    let mut src = [0u8; 100];
    let mut dst = User::<[u8]>::uninitialized(100);

    for i in 0..src.len() {
        src[i] = i as _;
    }

    for size in 0..48 {
        // For all possible alignment
        for offset in 0..8 {
            // overwrite complete dst
            dst.copy_from_enclave(&[0u8; 100]);

            // Copy src[0..size] to dst + offset
            unsafe { copy_to_userspace(src.as_ptr(), dst.as_mut_ptr().add(offset), size) };

            // Verify copy
            for byte in 0..size {
                unsafe {
                    assert_eq!(*dst.as_ptr().add(offset + byte), src[byte as usize]);
                }
            }
        }
    }
}

#[test]
fn test_copy_from_userspace_function() {
    let mut dst = [0u8; 100];
    let mut src = User::<[u8]>::uninitialized(100);

    src.copy_from_enclave(&[0u8; 100]);

    for size in 0..48 {
        // For all possible alignment
        for offset in 0..8 {
            // overwrite complete dst
            dst = [0u8; 100];

            // Copy src[0..size] to dst + offset
            unsafe { copy_from_userspace(src.as_ptr().offset(offset), dst.as_mut_ptr(), size) };

            // Verify copy
            for byte in 0..size {
                unsafe {
                    assert_eq!(dst[byte as usize], *src.as_ptr().offset(offset + byte as isize));
                }
            }
        }
    }
}
