use javascript::evaluate_script;
#[test]
fn for_of_missing_iterator_throws() {
let res = evaluate_script("for (var x of {}) { }; 1", false, None::<&std::path::Path>);
assert!(res.is_err());
}
#[test]
fn iterator_next_returns_non_object_throws() {
let script = r#"
let s = Symbol.iterator;
let o = {};
o[s] = function() {
return { next: function() { return 42; } };
};
// Attempt to iterate will call next() which returns a non-object -> should error
for (let x of o) { }
1
"#;
let res = evaluate_script(script, false, None::<&std::path::Path>);
assert!(res.is_err());
}
#[test]
fn string_iteration_surrogate_pair_behaviour() {
let script = r#"
let s = "a😀b"; // contains an astral character
let acc = "";
for (let ch of s) { acc = acc + ch; }
acc
"#;
let res = evaluate_script(script, false, None::<&std::path::Path>).unwrap();
let rust_str = res.trim_start_matches('"').trim_end_matches('"');
assert!(rust_str.starts_with("a"));
assert!(rust_str.ends_with("b"));
assert!(rust_str.len() >= 2);
}