use rong_test::*;
#[test]
fn test_array_buffer_creation() {
run(|ctx| {
let empty_buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &[])?;
assert_eq!(empty_buffer.len(), 0);
assert!(empty_buffer.is_empty());
let data = vec![1, 2, 3, 4, 5];
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &data)?;
assert_eq!(buffer.len(), 5);
assert!(!buffer.is_empty());
let data = vec![1, 0, 2, 0]; let buffer: JSArrayBuffer<i16> = JSArrayBuffer::from_bytes(ctx, &data)?;
assert_eq!(buffer.len(), 4);
assert_eq!(buffer.element_count(), 2);
Ok(())
});
}
#[test]
fn test_array_buffer_empty() {
run(|ctx| {
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &[])?;
assert_eq!(buffer.len(), 0);
assert!(buffer.is_empty());
assert_eq!(buffer.element_count(), 0);
assert_eq!(buffer.as_slice(), &[] as &[u8]);
assert_eq!(buffer.to_vec(), Vec::<u8>::new());
Ok(())
});
}
#[test]
fn test_array_buffer_mutations() {
run(|ctx| {
let mut buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &[1, 2, 3])?;
assert_eq!(buffer.as_slice(), &[1, 2, 3]);
assert_eq!(buffer.element_count(), 3);
{
let slice = buffer.as_mut_slice();
slice[0] = 42;
slice[1] = 43;
slice[2] = 44;
}
assert_eq!(buffer.as_slice(), &[42, 43, 44]);
let vec_copy = buffer.to_vec();
assert_eq!(vec_copy, vec![42, 43, 44]);
Ok(())
});
}
#[test]
fn test_array_buffer_alignment() {
run(|ctx| {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8];
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &data)?;
assert!(buffer.validate_alignment(0));
assert!(buffer.validate_alignment(1));
assert!(buffer.validate_alignment(2));
let buffer: JSArrayBuffer<i16> = JSArrayBuffer::from_bytes(ctx, &data)?;
assert!(buffer.validate_alignment(0));
assert!(!buffer.validate_alignment(1));
let buffer: JSArrayBuffer<i32> = JSArrayBuffer::from_bytes(ctx, &data)?;
assert!(buffer.validate_alignment(0));
assert!(!buffer.validate_alignment(1));
Ok(())
});
}
#[test]
fn test_array_buffer_slice() {
run(|ctx| {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8];
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &data)?;
let slice = buffer.as_slice();
assert_eq!(slice, &data[..]);
let bytes = buffer.as_bytes().unwrap();
assert_eq!(bytes, &data[..]);
Ok(())
});
}
#[test]
fn test_array_buffer_js_interop() {
run(|ctx| {
let data = vec![1, 2, 3, 4];
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &data)?;
let global = ctx.global();
global.set("testBuffer", buffer)?;
ctx.eval::<()>(Source::from_bytes(
b"let view = new Uint8Array(testBuffer); view[0] = 100;",
))?;
let modified_buffer: JSArrayBuffer<u8> = ctx.global().get("testBuffer")?;
let slice = modified_buffer.as_slice();
assert_eq!(slice[0], 100);
Ok(())
});
}
#[test]
fn test_array_buffer_zero_copy() {
run(|ctx| {
let data = vec![1, 2, 3, 4, 5];
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes_owned(ctx, data)?;
assert_eq!(buffer.len(), 5);
let boxed_data = vec![6, 7, 8, 9, 10].into_boxed_slice();
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes_owned(ctx, boxed_data)?;
assert_eq!(buffer.len(), 5);
Ok(())
});
}
#[test]
fn test_array_buffer_error_cases() {
run(|ctx| {
let data = vec![1, 2, 3]; let result: Result<JSArrayBuffer<i16>, _> = JSArrayBuffer::from_bytes(ctx, &data);
assert!(result.is_err());
let data = vec![1, 2, 3, 4, 5, 6]; let result: Result<JSArrayBuffer<i32>, _> = JSArrayBuffer::from_bytes(ctx, &data);
assert!(result.is_err());
let obj = JSObject::new(ctx);
assert!(JSArrayBuffer::<u8>::from_object(obj).is_none());
Ok(())
});
}