use crate::object::JsArrayBuffer;
use crate::{TestAction, run_test_actions};
#[test]
fn create_byte_data_block() {
run_test_actions([TestAction::inspect_context(|context| {
assert!(super::create_byte_data_block(100, None, context).is_ok());
assert!(super::create_byte_data_block(u64::MAX, None, context).is_err());
})]);
}
#[test]
fn create_shared_byte_data_block() {
run_test_actions([TestAction::inspect_context(|context| {
assert!(super::shared::create_shared_byte_data_block(100, context).is_ok());
assert!(super::shared::create_shared_byte_data_block(u64::MAX, context).is_err());
})]);
}
#[test]
fn resize() {
run_test_actions([TestAction::inspect_context(|context| {
let data_block = super::create_byte_data_block(100, None, context).unwrap();
let js_arr = JsArrayBuffer::from_byte_block(data_block, context)
.unwrap()
.with_max_byte_length(100);
let mut arr = js_arr.borrow_mut();
assert_eq!(arr.data_mut().resize(50), Ok(()));
assert!(arr.data_mut().resize(u64::MAX).is_err());
})]);
}
#[test]
fn get_values() {
run_test_actions([
TestAction::run(
r#"
var buffer = new ArrayBuffer(12);
var sample = new DataView(buffer, 0);
sample.setUint8(0, 127);
sample.setUint8(1, 255);
sample.setUint8(2, 255);
sample.setUint8(3, 255);
sample.setUint8(4, 128);
sample.setUint8(5, 0);
sample.setUint8(6, 0);
sample.setUint8(7, 0);
sample.setUint8(8, 1);
sample.setUint8(9, 0);
sample.setUint8(10, 0);
sample.setUint8(11, 0);
"#,
),
TestAction::assert("sample.getUint32(0, false) == 2147483647"),
TestAction::assert("sample.getUint32(1, false) == 4294967168"),
TestAction::assert("sample.getUint32(2, false) == 4294934528"),
TestAction::assert("sample.getUint32(3, false) == 4286578688"),
TestAction::assert("sample.getUint32(4, false) == 2147483648"),
TestAction::assert("sample.getUint32(5, false) == 1"),
TestAction::assert("sample.getUint32(6, false) == 256"),
TestAction::assert("sample.getUint32(7, false) == 65536"),
TestAction::assert("sample.getUint32(8, false) == 16777216"),
TestAction::assert("sample.getUint32(0, true) == 4294967167"),
TestAction::assert("sample.getUint32(1, true) == 2164260863"),
TestAction::assert("sample.getUint32(2, true) == 8454143"),
TestAction::assert("sample.getUint32(3, true) == 33023"),
TestAction::assert("sample.getUint32(4, true) == 128"),
TestAction::assert("sample.getUint32(5, true) == 16777216"),
TestAction::assert("sample.getUint32(6, true) == 65536"),
TestAction::assert("sample.getUint32(7, true) == 256"),
TestAction::assert("sample.getUint32(8, true) == 1"),
]);
}
#[test]
fn sort() {
run_test_actions([
TestAction::run(
r#"
// This cmp function is needed as the harness does not support TypedArray comparison.
function cmp(a, b) {
return a.length === b.length && a.every((v, i) => v === b[i]);
}
var TypedArrayCtor = [
Int8Array,
Uint8Array,
Int16Array,
Uint16Array,
Int32Array,
Uint32Array,
Float32Array,
Float64Array,
];
var descending = TypedArrayCtor.map((ctor) => new ctor([4, 3, 2, 1]).sort());
var mixed = TypedArrayCtor.map((ctor) => new ctor([3, 4, 1, 2]).sort());
var repeating = TypedArrayCtor.map((ctor) => new ctor([0, 1, 1, 2, 3, 3, 4]).sort());
"#,
),
TestAction::assert("cmp(descending[0], [1, 2, 3, 4])"),
TestAction::assert("cmp(descending[1], [1, 2, 3, 4])"),
TestAction::assert("cmp(descending[2], [1, 2, 3, 4])"),
TestAction::assert("cmp(descending[3], [1, 2, 3, 4])"),
TestAction::assert("cmp(descending[4], [1, 2, 3, 4])"),
TestAction::assert("cmp(descending[5], [1, 2, 3, 4])"),
TestAction::assert("cmp(descending[6], [1, 2, 3, 4])"),
TestAction::assert("cmp(descending[7], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[0], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[1], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[2], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[3], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[4], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[5], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[6], [1, 2, 3, 4])"),
TestAction::assert("cmp(mixed[7], [1, 2, 3, 4])"),
TestAction::assert("cmp(repeating[0], [0, 1, 1, 2, 3, 3, 4])"),
TestAction::assert("cmp(repeating[1], [0, 1, 1, 2, 3, 3, 4])"),
TestAction::assert("cmp(repeating[2], [0, 1, 1, 2, 3, 3, 4])"),
TestAction::assert("cmp(repeating[3], [0, 1, 1, 2, 3, 3, 4])"),
TestAction::assert("cmp(repeating[4], [0, 1, 1, 2, 3, 3, 4])"),
TestAction::assert("cmp(repeating[5], [0, 1, 1, 2, 3, 3, 4])"),
TestAction::assert("cmp(repeating[6], [0, 1, 1, 2, 3, 3, 4])"),
TestAction::assert("cmp(repeating[7], [0, 1, 1, 2, 3, 3, 4])"),
]);
}
#[test]
fn sort_negative_zero() {
run_test_actions([
TestAction::run(
r#"
// This cmp function is needed as the harness does not support TypedArray comparison.
function cmp(a, b) {
return a.length === b.length && a.every((v, i) => v === b[i]);
}
var TypedArrayCtor = [Float32Array, Float64Array];
var negativeZero = TypedArrayCtor.map((ctor) => new ctor([1, 0, -0, 2]).sort());
var infinities = TypedArrayCtor.map((ctor) => new ctor([3, 4, Infinity, -Infinity, 1, 2]).sort());
"#,
),
TestAction::assert("cmp(negativeZero[0], [-0, 0, 1, 2])"),
TestAction::assert("cmp(negativeZero[1], [-0, 0, 1, 2])"),
TestAction::assert("cmp(infinities[0], [-Infinity, 1, 2, 3, 4, Infinity])"),
TestAction::assert("cmp(infinities[1], [-Infinity, 1, 2, 3, 4, Infinity])"),
]);
}