|
#[cfg(test)]
|
|
mod test {
|
|
use std::fs;
|
|
|
|
use crate::rewriter::NativeRewriter;
|
|
use boa_engine::{
|
|
Context, NativeFunction, Source, js_str, js_string,
|
|
object::ObjectInitializer,
|
|
property::{Attribute, PropertyDescriptorBuilder},
|
|
};
|
|
|
|
fn create_context() -> Context {
|
|
let mut context = Context::default();
|
|
|
|
let window = ObjectInitializer::new(&mut context).build();
|
|
context
|
|
.register_global_property(js_str!("window"), window, Attribute::READONLY)
|
|
.unwrap();
|
|
context
|
|
.global_object()
|
|
.define_property_or_throw(
|
|
js_str!("location"),
|
|
PropertyDescriptorBuilder::new()
|
|
.get(
|
|
NativeFunction::from_copy_closure(|_, _, _| Ok(js_str!("location").into()))
|
|
.to_js_function(context.realm()),
|
|
)
|
|
.set(
|
|
NativeFunction::from_copy_closure(|_, _, _| {
|
|
panic!("fail: window.location got set")
|
|
})
|
|
.to_js_function(context.realm()),
|
|
)
|
|
.build(),
|
|
&mut context,
|
|
)
|
|
.unwrap();
|
|
|
|
context
|
|
.register_global_callable(
|
|
js_string!("fail"),
|
|
0,
|
|
NativeFunction::from_copy_closure(|_, _, _| {
|
|
panic!("fail");
|
|
}),
|
|
)
|
|
.unwrap();
|
|
|
|
context
|
|
.eval(Source::from_bytes(
|
|
br#"
|
|
function $wrap(val) {
|
|
if (val === window || val === "location" || val === globalThis) return "";
|
|
|
|
return val;
|
|
}
|
|
|
|
const $gwrap = $wrap;
|
|
|
|
function $scramitize(val) { return val }
|
|
|
|
function assert(val) {
|
|
if (!val) fail();
|
|
}
|
|
|
|
function check(val) {
|
|
if (val === window || val === "location") fail();
|
|
}
|
|
"#,
|
|
))
|
|
.unwrap();
|
|
|
|
context
|
|
}
|
|
|
|
#[test]
|
|
fn google() {
|
|
let source_text = include_str!("../sample/google.js");
|
|
|
|
let rewriter = NativeRewriter::default();
|
|
rewriter.rewrite_default(source_text).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn rewrite_tests() {
|
|
let files = fs::read_dir("./tests").unwrap();
|
|
|
|
let mut rewriter = NativeRewriter::default();
|
|
|
|
for file in files.map(|x| x.unwrap()) {
|
|
if !file.path().extension().unwrap().eq_ignore_ascii_case("js") {
|
|
continue;
|
|
}
|
|
|
|
let content = fs::read_to_string(file.path()).unwrap();
|
|
|
|
let rewritten = rewriter.rewrite_default(&content).unwrap();
|
|
println!("{}", std::str::from_utf8(&rewritten.js).unwrap());
|
|
|
|
let mut ctx = create_context();
|
|
|
|
ctx.eval(Source::from_bytes(rewritten.js.as_slice()))
|
|
.unwrap();
|
|
|
|
println!("PASS");
|
|
|
|
rewriter.reset();
|
|
}
|
|
}
|
|
}
|
|
|