sim-nest 0.1.5

The SIM constellation umbrella facade: one crate that re-exports the runtime kernel, codecs, number domains, and libraries behind features.
Documentation
use std::sync::Arc;

use sim_kernel::{Args, DefaultFactory, EagerPolicy, Expr, Symbol};

use crate::runtime::install_core_runtime;

use super::support::table_value;

#[test]
fn roadmap11_browse_lists_builtin_plugins_and_help_shows_shape_columns() {
    let mut cx = sim_kernel::Cx::new(Arc::new(EagerPolicy), Arc::new(DefaultFactory));
    install_core_runtime(&mut cx);

    let lib = cx
        .call_function(
            &Symbol::qualified("core", "lib"),
            Args::new(vec![
                cx.factory()
                    .symbol(Symbol::new("pitch-namer"))
                    .expect("symbol"),
            ]),
        )
        .expect("lib browse");
    let lib_expr = lib.object().as_expr(&mut cx).expect("expr");
    let Some(Expr::List(exports)) = table_value(&lib_expr, &Symbol::new("exports")) else {
        panic!("expected export list");
    };
    assert!(exports.iter().any(|entry| {
        table_value(entry, &Symbol::new("symbol"))
            == Some(&Expr::Symbol(Symbol::qualified("pitch", "ForteNamer")))
    }));

    let help = cx
        .call_function(
            &Symbol::qualified("core", "help"),
            Args::new(vec![
                cx.factory()
                    .symbol(Symbol::qualified("pitch", "ForteNamer"))
                    .expect("symbol"),
            ]),
        )
        .expect("help");
    let help_expr = help
        .object()
        .as_table(&mut cx)
        .expect("table")
        .object()
        .as_expr(&mut cx)
        .expect("expr");
    assert_eq!(
        table_value(&help_expr, &Symbol::new("kind")),
        Some(&Expr::Symbol(Symbol::qualified("core", "value")))
    );

    let browse = cx
        .resolve_value(&Symbol::qualified("pitch", "ForteNamer"))
        .expect("browse value");
    let browse_expr = browse.object().as_expr(&mut cx).expect("expr");
    assert_eq!(
        table_value(&browse_expr, &Symbol::new("shape")),
        Some(&Expr::Symbol(Symbol::qualified("pitch", "ClusterNamer")))
    );
    assert_eq!(
        table_value(&browse_expr, &Symbol::new("layer")),
        Some(&Expr::String("pitch".to_owned()))
    );
    assert_eq!(
        table_value(&browse_expr, &Symbol::new("lossless")),
        Some(&Expr::Bool(true))
    );
}