boa_engine 0.22.0

Boa is a Javascript lexer, parser and compiler written in Rust. Currently, it has support for some of the language.
Documentation
use crate::{JsNativeErrorKind, TestAction, run_test_actions};
use indoc::indoc;

#[test]
fn proxy_cannot_report_non_configurable_as_configurable() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = {};
            Object.defineProperty(target, 'foo', { value: 1, configurable: false });

            const proxy = new Proxy(target, {
              getOwnPropertyDescriptor() {
                return { value: 1, configurable: true };
              }
            });

            Object.getOwnPropertyDescriptor(proxy, 'foo');
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap returned unexpected property",
    )]);
}

#[test]
fn proxy_cannot_hide_non_configurable_property() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = {};
            Object.defineProperty(target, 'foo', { value: 1, configurable: false });

            const proxy = new Proxy(target, {
              has() { return false; }
            });

            'foo' in proxy;
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap returned unexpected property",
    )]);
}

#[test]
fn proxy_cannot_report_extensible_as_non_extensible() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const proxy = new Proxy({}, {
              isExtensible() { return false; }
            });

            Object.isExtensible(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap returned unexpected extensible value",
    )]);
}

#[test]
fn proxy_cannot_report_non_extensible_as_extensible() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = Object.preventExtensions({});

            const proxy = new Proxy(target, {
              isExtensible() { return true; }
            });

            Object.isExtensible(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap returned unexpected extensible value",
    )]);
}

#[test]
fn proxy_ownkeys_must_include_non_configurable_keys() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = {};
            Object.defineProperty(target, 'foo', { value: 1, configurable: false });

            const proxy = new Proxy(target, {
              ownKeys() { return []; }
            });

            Object.keys(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap failed to return all non-configurable property keys",
    )]);
}

#[test]
fn proxy_ownkeys_cannot_report_duplicate_keys() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const proxy = new Proxy({}, {
              ownKeys() { return ['a','a']; }
            });

            Object.keys(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap result contains duplicate string property keys",
    )]);
}

#[test]
fn proxy_defineproperty_respects_target_invariants() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = Object.preventExtensions({});

            const proxy = new Proxy(target, {
              defineProperty() { return true; }
            });

            Object.defineProperty(proxy, 'foo', { value: 1 });
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap failed to set property",
    )]);
}

#[test]
fn proxy_getprototypeof_invariant() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = Object.preventExtensions({});

            const proxy = new Proxy(target, {
              getPrototypeOf() { return Array.prototype; }
            });

            Object.getPrototypeOf(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap returned unexpected prototype",
    )]);
}

#[test]
fn proxy_setprototypeof_invariant() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = Object.preventExtensions({});

            const proxy = new Proxy(target, {
              setPrototypeOf() { return true; }
            });

            Object.setPrototypeOf(proxy, Array.prototype);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap failed to set prototype",
    )]);
}

#[test]
fn proxy_preventextensions_invariant() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const proxy = new Proxy({}, {
              preventExtensions() { return true; }
            });

            Object.preventExtensions(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap failed to set extensible",
    )]);
}

#[test]
fn proxy_ownkeys_symbol_invariant() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const sym = Symbol("a");

            const target = {};
            Object.defineProperty(target, sym, {
              value: 1,
              configurable: false
            });

            const proxy = new Proxy(target, {
              ownKeys() { return []; }
            });

            Reflect.ownKeys(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap failed to return all non-configurable property keys",
    )]);
}

#[test]
fn proxy_ownkeys_non_extensible_invariant() {
    run_test_actions([TestAction::assert_native_error(
        indoc! {r#"
            const target = Object.preventExtensions({ a: 1 });

            const proxy = new Proxy(target, {
              ownKeys() { return []; }
            });

            Object.keys(proxy);
        "#},
        JsNativeErrorKind::Type,
        "Proxy trap failed to return all configurable property keys",
    )]);
}