mirror of https://github.com/boa-dev/boa.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.6 KiB
49 lines
1.6 KiB
#![allow(unused_crate_dependencies)] |
|
//! A test that mimics the `boa_engine`'s GCD test with a typed callback. |
|
|
|
use boa_engine::object::builtins::JsFunction; |
|
use boa_engine::{js_str, Context, Module, Source}; |
|
use boa_gc::Gc; |
|
use boa_interop::{ContextData, IntoJsFunctionCopied}; |
|
use std::path::PathBuf; |
|
use std::sync::atomic::{AtomicUsize, Ordering}; |
|
|
|
fn callback_from_js(ContextData(r): ContextData<Gc<AtomicUsize>>, result: usize) { |
|
r.store(result, Ordering::Relaxed); |
|
} |
|
|
|
#[test] |
|
fn gcd_callback() { |
|
let assets_dir = |
|
PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()).join("tests/assets"); |
|
|
|
// Create the engine. |
|
let context = &mut Context::default(); |
|
let result = Gc::new(AtomicUsize::new(0)); |
|
context.insert_data(result.clone()); |
|
|
|
// Load the JavaScript code. |
|
let gcd_path = assets_dir.join("gcd_callback.js"); |
|
let source = Source::from_filepath(&gcd_path).unwrap(); |
|
let module = Module::parse(source, None, context).unwrap(); |
|
module |
|
.load_link_evaluate(context) |
|
.await_blocking(context) |
|
.unwrap(); |
|
|
|
let js_gcd = module |
|
.get_typed_fn::<(i32, i32, JsFunction), ()>(js_str!("gcd_callback"), context) |
|
.unwrap(); |
|
|
|
let function = callback_from_js |
|
.into_js_function_copied(context) |
|
.to_js_function(context.realm()); |
|
|
|
result.store(0, Ordering::Relaxed); |
|
assert_eq!(js_gcd.call(context, (6, 9, function.clone())), Ok(())); |
|
assert_eq!(result.load(Ordering::Relaxed), 3); |
|
|
|
result.store(0, Ordering::Relaxed); |
|
assert_eq!(js_gcd.call(context, (9, 6, function)), Ok(())); |
|
assert_eq!(result.load(Ordering::Relaxed), 3); |
|
}
|
|
|