neovm-core 0.0.2

Core runtime structures for NeoVM
use super::*;
#[test]
fn register_bootstrap_vars_matches_gnu_defaults() {
    crate::test_utils::init_test_tracing();
    let mut obarray = Obarray::new();
    register_bootstrap_vars(&mut obarray);

    assert_eq!(
        obarray.symbol_value("face-default-stipple").copied(),
        Some(Value::string("gray3"))
    );
    assert_eq!(
        obarray
            .symbol_value("face-near-same-color-threshold")
            .copied(),
        Some(Value::fixnum(30_000))
    );
    assert_eq!(
        obarray
            .symbol_value("face-font-lax-matched-attributes")
            .copied(),
        Some(Value::T)
    );

    let table = obarray
        .symbol_value("face--new-frame-defaults")
        .copied()
        .expect("face--new-frame-defaults");
    if !table.is_hash_table() {
        panic!("face--new-frame-defaults must be a hash table");
    };
    let test = table.as_hash_table().unwrap().test.clone();
    assert_eq!(test, HashTableTest::Eq);
}

#[test]
fn frame_face_hash_table_eval_is_empty_before_any_face_realization() {
    crate::test_utils::init_test_tracing();
    let mut eval = crate::emacs_core::eval::Context::new();
    let out = builtin_frame_face_hash_table(&mut eval, vec![Value::NIL])
        .expect("live frame face hash table");
    if !out.is_hash_table() {
        panic!("expected hash table");
    };
    let len = out.as_hash_table().unwrap().data.len();
    assert_eq!(len, 0);
}

#[test]
fn frame_face_hash_table_eval_returns_stable_frame_owned_table() {
    crate::test_utils::init_test_tracing();
    let mut eval = crate::emacs_core::eval::Context::new();
    let first =
        builtin_frame_face_hash_table(&mut eval, vec![Value::NIL]).expect("first face hash table");
    let second =
        builtin_frame_face_hash_table(&mut eval, vec![Value::NIL]).expect("second face hash table");
    assert_eq!(first, second);
}

#[test]
fn mirror_runtime_face_into_frame_uses_symbol_keys() {
    crate::test_utils::init_test_tracing();
    let mut eval = crate::emacs_core::eval::Context::new();
    let frame_id = crate::emacs_core::window_cmds::ensure_selected_frame_id(&mut eval);
    let face = eval.face_table().resolve("default");

    let frame = eval.frames.get_mut(frame_id).expect("selected frame");
    mirror_runtime_face_into_frame(frame, "default", &face);

    assert!(frame.realized_faces.contains_key(&Value::symbol("default")));
    assert!(frame.realized_face("default").is_some());
}

#[test]
fn ensure_startup_compat_variables_backfills_missing_xfaces_state() {
    crate::test_utils::init_test_tracing();
    let mut eval = crate::emacs_core::eval::Context::new();
    for name in [
        "face-filters-always-match",
        "face--new-frame-defaults",
        "face-default-stipple",
        "scalable-fonts-allowed",
        "face-ignored-fonts",
        "face-remapping-alist",
        "face-font-rescale-alist",
        "face-near-same-color-threshold",
        "face-font-lax-matched-attributes",
    ] {
        eval.obarray_mut().makunbound(name);
    }

    ensure_startup_compat_variables(&mut eval);

    assert_eq!(
        eval.obarray().symbol_value("face-default-stipple").copied(),
        Some(Value::string("gray3"))
    );
    let table = eval
        .obarray()
        .symbol_value("face--new-frame-defaults")
        .copied()
        .expect("face hash table backfilled");
    if !table.is_hash_table() {
        panic!("face--new-frame-defaults must be a hash table");
    };
    let has_seeded_faces =
        {
            let hash_table = table.as_hash_table().unwrap();
            hash_table
                .data
                .contains_key(&HashKey::Symbol(crate::emacs_core::intern::intern(
                    "default",
                )))
                && hash_table.data.contains_key(&HashKey::Symbol(
                    crate::emacs_core::intern::intern("mode-line"),
                ))
        };
    assert!(
        has_seeded_faces,
        "face--new-frame-defaults should be preseeded with GNU face entries"
    );
}