sim-run-core 0.3.0

Core command entry API for the SIM bootloader.
Documentation
use std::collections::BTreeSet;

use super::DeviceRouteOptionModel;

#[test]
fn glasses_route_option_model_accepts_every_supported_route() {
    let model = DeviceRouteOptionModel::glasses();
    assert_eq!(
        model.options(),
        [
            "direct-linux",
            "android-usb",
            "neckband-local",
            "neckband-relay",
            "mobile-dock-display",
            "ble-direct",
            "web-bluetooth",
            "phone-relay",
            "controller-hid",
        ]
    );

    let unique = model.options().iter().copied().collect::<BTreeSet<_>>();
    assert_eq!(unique.len(), model.options().len());

    for value in model.options() {
        let route = model.parse(value).expect("supported glasses route");
        assert_eq!(route.symbol().namespace.as_deref(), Some("device/route"));
        assert_eq!(route.symbol().name.as_ref(), *value);
    }
}

#[test]
fn glasses_route_option_model_rejects_unknown_route() {
    let model = DeviceRouteOptionModel::glasses();
    let error = model.parse("vendor-cloud").expect_err("unknown route");

    assert_eq!(error.value(), "vendor-cloud");
    assert_eq!(error.expected(), model.options());
    assert!(error.to_string().contains("direct-linux"));
    assert!(error.to_string().contains("controller-hid"));
}