export function filledDataView(bytes) { const ab = new ArrayBuffer(bytes.length) const dv = new DataView(ab) for (let i = 0; i < bytes.length; i++) { dv.setInt8(i, bytes[i]) } return dv } export function sizedDataView(length) { const ab = new ArrayBuffer(length) return new DataView(ab) } export function expectDataViewEqual(actual, expected) { const actualBytes = new Uint8Array(actual.buffer, actual.byteOffset, actual.byteLength) const expectedBytes = new Uint8Array(expected.buffer, expected.byteOffset, expected.byteLength) const arraysToString = () => { return `actual: [${Array.from(actualBytes).map(byte => '0x' + byte.toString(16)).join(', ')}]\n` + `expected: [${Array.from(expectedBytes).map(byte => '0x' + byte.toString(16)).join(', ')}]` } if (actualBytes.length !== expectedBytes.length) { throw new Error(`DataView length mismatch: actual: ${actualBytes.length}, expected: ${expectedBytes.length}\n` + arraysToString()) } for (let i = 0; i < actualBytes.length; i++) { if (actualBytes[i] !== expectedBytes[i]) { throw new Error( `Byte mismatch at offset ${i}: 0x${actualBytes[i].toString(16)} !== 0x${expectedBytes[i].toString(16)}\n` + arraysToString() ) } } }