#[path = "../conformance_common.rs"]
mod common;
use common::{CHECK_SCAFFOLD, eval_string, make_ctx, run_checks};
#[test]
fn test_buffer_conformance_suite() {
let mut ctx = make_ctx();
let alloc_src = format!(
r##"
{scaffold}
check("alloc_zero_filled", function() {{
var b = Buffer.alloc(5);
if (b.length !== 5) return false;
for (var i = 0; i < 5; i++) if (b[i] !== 0) return false;
return true;
}});
check("alloc_with_fill", function() {{
var b = Buffer.alloc(4, 0x41);
return b.length === 4 && b[0] === 0x41 && b[3] === 0x41;
}});
check("allocUnsafe_length", function() {{
var b = Buffer.allocUnsafe(8);
return b.length === 8;
}});
check("allocUnsafeSlow_length", function() {{
var b = Buffer.allocUnsafeSlow(4);
return b.length === 4;
}});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &alloc_src);
let from_src = format!(
r##"
{scaffold}
check("from_string_default_utf8", function() {{
var b = Buffer.from("hello");
return b.length === 5 && b[0] === 0x68 && b[4] === 0x6f;
}});
check("from_string_hex", function() {{
var b = Buffer.from("48656c6c6f", "hex");
return b.length === 5 && b.toString() === "Hello";
}});
check("from_string_base64", function() {{
var b = Buffer.from("aGVsbG8=", "base64");
return b.length === 5 && b.toString() === "hello";
}});
check("from_array", function() {{
var b = Buffer.from([72, 101, 108, 108, 111]);
return b.length === 5 && b.toString() === "Hello";
}});
check("from_buffer_copy", function() {{
var a = Buffer.from("abc");
var b = Buffer.from(a);
a[0] = 88;
return b[0] === 0x61; // independent copy
}});
check("from_uint8array", function() {{
var u = new Uint8Array([1,2,3]);
var b = Buffer.from(u);
return b.length === 3 && b[0] === 1;
}});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &from_src);
let concat_src = format!(
r##"
{scaffold}
check("concat_basic", function() {{
var a = Buffer.from("hel");
var b = Buffer.from("lo");
var c = Buffer.concat([a, b]);
return c.length === 5 && c.toString() === "hello";
}});
check("concat_empty", function() {{
var c = Buffer.concat([]);
return c.length === 0;
}});
check("concat_basic_three_parts", function() {{
var c = Buffer.concat([Buffer.from("a"), Buffer.from("b"), Buffer.from("c")]);
return c.length === 3 && c.toString() === "abc";
}});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &concat_src);
let tostring_src = format!(
r##"
{scaffold}
var b = Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]); // "hello"
check("toString_utf8", function() {{ return b.toString("utf8") === "hello"; }});
check("toString_default", function() {{ return b.toString() === "hello"; }});
check("toString_hex", function() {{ return b.toString("hex") === "68656c6c6f"; }});
check("toString_ascii", function() {{ return b.toString("ascii") === "hello"; }});
check("toString_base64_nonempty", function() {{
return typeof b.toString("base64") === "string" && b.toString("base64").length > 0;
}});
check("toString_latin1", function() {{ return b.toString("latin1") === "hello"; }});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &tostring_src);
let idx_src = format!(
r##"
{scaffold}
var b = Buffer.from("hello world hello");
check("indexOf_string", function() {{ return b.indexOf("hello") === 0; }});
check("indexOf_second", function() {{ return b.indexOf("hello", 1) === 12; }});
check("indexOf_not_found", function() {{ return b.indexOf("xyz") === -1; }});
check("indexOf_byte", function() {{ return b.indexOf(0x6f) === 4; }});
check("includes_true", function() {{ return b.includes("world") === true; }});
check("includes_false", function() {{ return b.includes("xyz") === false; }});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &idx_src);
let slice_src = format!(
r##"
{scaffold}
var b = Buffer.from("hello world");
check("slice_basic", function() {{ return b.slice(0, 5).toString() === "hello"; }});
check("slice_negative", function() {{ return b.slice(-5).toString() === "world"; }});
check("slice_default_end", function() {{ return b.slice(6).toString() === "world"; }});
check("subarray_basic", function() {{ return b.subarray(0, 5).toString() === "hello"; }});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &slice_src);
let eq_src = format!(
r##"
{scaffold}
check("equals_same", function() {{
return Buffer.from("abc").equals(Buffer.from("abc")) === true;
}});
check("equals_diff", function() {{
return Buffer.from("abc").equals(Buffer.from("abd")) === false;
}});
check("compare_less", function() {{
return Buffer.from("a").compare(Buffer.from("b")) < 0;
}});
check("compare_equal", function() {{
return Buffer.from("a").compare(Buffer.from("a")) === 0;
}});
check("compare_greater", function() {{
return Buffer.from("b").compare(Buffer.from("a")) > 0;
}});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &eq_src);
let write_src = format!(
r##"
{scaffold}
check("write_utf8_returns_bytes", function() {{
var b = Buffer.alloc(10);
var n = b.write("hi", 0, "utf8");
return n === 2 && b[0] === 0x68 && b[1] === 0x69;
}});
check("write_default_offset", function() {{
var b = Buffer.alloc(10);
var n = b.write("hi");
return n === 2 && b[0] === 0x68;
}});
check("copy_target", function() {{
var src = Buffer.from("hello");
var dst = Buffer.alloc(5);
src.copy(dst, 0, 0, 5);
return dst.toString() === "hello";
}});
check("fill_value", function() {{
var b = Buffer.alloc(5);
b.fill(0x41);
return b.toString() === "AAAAA";
}});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &write_src);
let static_src = format!(
r##"
{scaffold}
check("isBuffer_true", function() {{
return Buffer.isBuffer(Buffer.alloc(1)) === true;
}});
check("isBuffer_false", function() {{
return Buffer.isBuffer("no") === false && Buffer.isBuffer(null) === false;
}});
check("isBuffer_uint8array", function() {{
return Buffer.isBuffer(new Uint8Array(1)) === false;
}});
check("byteLength_string", function() {{
return Buffer.byteLength("hello") === 5;
}});
check("byteLength_utf8_multibyte", function() {{
return Buffer.byteLength("héllo", "utf8") === 6;
}});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &static_src);
let mod_src = format!(
r##"
{scaffold}
var bufferMod = require('buffer');
check("module_Buffer_ref", function() {{
return bufferMod.Buffer === Buffer;
}});
check("module_constants", function() {{
return typeof bufferMod.constants === "object"
&& typeof bufferMod.constants.MAX_LENGTH === "number";
}});
check("module_kMaxLength", function() {{
return typeof bufferMod.kMaxLength === "number";
}});
check("module_SlowBuffer_callable", function() {{
return typeof bufferMod.SlowBuffer === "function";
}});
results.join("|")
"##,
scaffold = CHECK_SCAFFOLD
);
run_checks(&mut ctx, &mod_src);
bun_runtime::shutdown_thread_sm();
}
#[test]
fn test_buffer_conformance_pool_size() {
let mut ctx = make_ctx();
let r = eval_string(
&mut ctx,
r#"require('buffer').poolSize === 8192 ? "PASS" : "FAIL""#,
);
assert_eq!(r, "PASS");
bun_runtime::shutdown_thread_sm();
}
#[test]
fn test_buffer_conformance_base64url() {
let mut ctx = make_ctx();
let r = eval_string(
&mut ctx,
r#"Buffer.from("aGVsbG8", "base64url").toString() === "hello" ? "PASS" : "FAIL""#,
);
assert_eq!(r, "PASS");
bun_runtime::shutdown_thread_sm();
}
#[test]
fn test_buffer_conformance_concat_total_length() {
let mut ctx = make_ctx();
let r = eval_string(
&mut ctx,
r##"(function(){
var c = Buffer.concat([Buffer.from("ab"), Buffer.from("cd")], 3);
return (c.length === 3 && c.toString() === "abc") ? "PASS" : "FAIL";
})()"##,
);
assert_eq!(r, "PASS");
bun_runtime::shutdown_thread_sm();
}
#[test]
fn test_buffer_conformance_includes_buffer_deviation() {
let mut ctx = make_ctx();
let r = eval_string(
&mut ctx,
r#"Buffer.from("hello world").includes(Buffer.from("world")) ? "PASS" : "FAIL""#,
);
assert_eq!(r, "PASS");
bun_runtime::shutdown_thread_sm();
}
#[test]
fn test_buffer_conformance_bytelength_hex_deviation() {
let mut ctx = make_ctx();
let r = eval_string(
&mut ctx,
r#"Buffer.byteLength("68656c6c6f", "hex") === 5 ? "PASS" : "FAIL""#,
);
assert_eq!(r, "PASS");
bun_runtime::shutdown_thread_sm();
}