use rong_test::*;
#[test]
fn test_typed_array_creation() {
run(|ctx| {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8];
let buffer: JSArrayBuffer<i8> = JSArrayBuffer::from_bytes(ctx, &data)?;
let int8_array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(int8_array.len(), 8);
assert_eq!(int8_array.byte_length(), 8);
assert_eq!(int8_array.bytes_per_element(), 1);
assert_eq!(int8_array.kind(), JSTypedArrayKind::Int8);
let buffer: JSArrayBuffer<i16> = JSArrayBuffer::from_bytes(ctx, &[1, 0, 2, 0, 3, 0, 4, 0])?;
let int16_array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(int16_array.len(), 4);
assert_eq!(int16_array.byte_length(), 8);
assert_eq!(int16_array.bytes_per_element(), 2);
assert_eq!(int16_array.kind(), JSTypedArrayKind::Int16);
let buffer: JSArrayBuffer<i32> = JSArrayBuffer::from_bytes(ctx, &[1, 0, 0, 0, 2, 0, 0, 0])?;
let int32_array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(int32_array.len(), 2);
assert_eq!(int32_array.byte_length(), 8);
assert_eq!(int32_array.bytes_per_element(), 4);
assert_eq!(int32_array.kind(), JSTypedArrayKind::Int32);
Ok(())
});
}
#[test]
fn test_typed_array_with_offset_and_length() {
run(|ctx| {
let data = vec![1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0];
let buffer: JSArrayBuffer<i16> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(
ctx,
buffer.clone(),
2, Some(3), )?;
assert_eq!(array.byte_offset(), 2);
assert_eq!(array.len(), 3);
assert_eq!(array.byte_length(), 6);
assert_eq!(array.bytes_per_element(), 2);
Ok(())
});
}
#[test]
fn test_typed_array_error_handling() {
run(|ctx| {
let buffer: JSArrayBuffer<i16> = JSArrayBuffer::from_bytes(ctx, &[1, 0, 2, 0])?;
let result = JSTypedArray::from_array_buffer(
ctx,
buffer.clone(),
1, None,
);
assert!(result.is_err());
let buffer: JSArrayBuffer<i8> = JSArrayBuffer::from_bytes(ctx, &[1, 2, 3, 4])?;
let result = JSTypedArray::from_array_buffer(
ctx,
buffer.clone(),
5, None,
);
assert!(result.is_err());
let buffer: JSArrayBuffer<i16> = JSArrayBuffer::from_bytes(ctx, &[1, 0, 2, 0])?;
let result = JSTypedArray::from_array_buffer(
ctx,
buffer.clone(),
0,
Some(3), );
assert!(result.is_err());
let buffer: JSArrayBuffer<i8> = JSArrayBuffer::from_bytes(ctx, &[1, 2, 3, 4])?;
let result = JSTypedArray::from_array_buffer(
ctx,
buffer.clone(),
0,
Some(0), );
assert!(result.is_ok());
Ok(())
});
}
#[test]
fn test_typed_array_js_interop() {
run(|ctx| {
let buffer: JSArrayBuffer<i32> = JSArrayBuffer::from_bytes(ctx, &[1, 0, 0, 0, 2, 0, 0, 0])?;
let array = JSTypedArray::from_array_buffer(ctx, buffer, 0, None)?;
ctx.global().set("testArray", array)?;
let sum: i32 = ctx.eval(Source::from_bytes(
r#"
let sum = 0;
for (let i = 0; i < testArray.length; i++) {
sum += testArray[i];
}
sum;
"#,
))?;
assert_eq!(sum, 3);
let _: JSValue = ctx.eval(Source::from_bytes(
r#"
testArray[0] = 42;
"#,
))?;
let modified_array: JSTypedArray = ctx.global().get("testArray")?;
let modified_buffer = modified_array.buffer()?;
assert_eq!(modified_buffer.as_slice()[0], 42);
Ok(())
});
}
#[test]
fn test_all_typed_array_kinds() {
run(|ctx| {
let mut data = Vec::new();
for i in 0..32 {
data.push(i as u8);
}
let buffer: JSArrayBuffer<i8> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Int8);
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Uint8);
let buffer: JSArrayBuffer<i16> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Int16);
let buffer: JSArrayBuffer<u16> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Uint16);
let buffer: JSArrayBuffer<i32> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Int32);
let buffer: JSArrayBuffer<u32> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Uint32);
let buffer: JSArrayBuffer<f32> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Float32);
let buffer: JSArrayBuffer<f64> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::Float64);
let buffer: JSArrayBuffer<i64> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::BigInt64);
let buffer: JSArrayBuffer<u64> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
assert_eq!(array.kind(), JSTypedArrayKind::BigUint64);
Ok(())
});
}
#[test]
fn test_typed_array_buffer_sharing() {
run(|ctx| {
let buffer: JSArrayBuffer<i8> = JSArrayBuffer::from_bytes(ctx, &[1, 2, 3, 4])?;
let array1 = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
let array2 = JSTypedArray::from_array_buffer(ctx, buffer.clone(), 0, None)?;
ctx.global().set("array1", array1)?.set("array2", array2)?;
let _: JSValue = ctx.eval(Source::from_bytes(
r#"
array1[0] = 100;
"#,
))?;
let value: i32 = ctx.eval(Source::from_bytes("array2[0]"))?;
assert_eq!(value, 100);
Ok(())
});
}
#[test]
fn test_typed_array_as_bytes() {
run(|ctx| {
let data = vec![1, 2, 3, 4, 5, 6, 7, 8];
let buffer: JSArrayBuffer<u8> = JSArrayBuffer::from_bytes(ctx, &data)?;
let array = JSTypedArray::from_array_buffer(
ctx,
buffer.clone(),
2, Some(3), )?;
let bytes = array.as_bytes().expect("Should return Some bytes");
assert_eq!(bytes, &[3, 4, 5]);
let invalid_array = JSTypedArray::from_array_buffer(
ctx,
buffer.clone(),
10, None,
);
assert!(invalid_array.is_err());
let buffer_bytes = buffer.as_bytes().expect("Should return Some bytes");
assert_eq!(buffer_bytes, &[1, 2, 3, 4, 5, 6, 7, 8]);
Ok(())
});
}