use super::*;
fn argv(parts: &[&str]) -> Vec<String> {
parts.iter().map(|s| (*s).to_string()).collect()
}
#[test]
fn no_leading_verb_is_not_a_namespace() {
assert_eq!(dispatch(&argv(&["yog"])), None);
assert_eq!(dispatch(&[]), None);
}
#[test]
fn a_non_namespace_verb_falls_through() {
assert_eq!(dispatch(&argv(&["yog", "--editor-apply", "/co"])), None);
assert_eq!(dispatch(&argv(&["yog", "env"])), None);
assert_eq!(dispatch(&argv(&["yog", "exec", "bash"])), None);
assert_eq!(dispatch(&argv(&["yog", "something-else"])), None);
}
#[test]
fn the_litany_arm_runs_the_embedded_litany_crate() {
assert_eq!(dispatch(&argv(&["yog", "litany", "--help"])), Some(0));
assert_eq!(dispatch(&argv(&["yog", "litany", "no-such-verb"])), Some(2));
}
#[test]
fn the_bz_arm_reaches_the_embedded_brazen_crate_and_asks_it_for_a_wall() {
assert_eq!(
dispatch(&argv(&["yog", "bz", "--list-providers"])),
Some(crate::bz_host::NO_WALL_CODE)
);
assert_eq!(dispatch(&argv(&["yog", "bz", "--version"])), Some(0));
}
#[test]
fn a_namespace_with_no_verb_args_dispatches_with_an_empty_slice() {
assert_eq!(dispatch(&argv(&["yog", "litany"])), Some(2));
}
#[test]
fn from_arg_maps_names_and_rejects_the_rest() {
assert_eq!(Namespace::from_arg("litany"), Some(Namespace::Litany));
assert_eq!(Namespace::from_arg("bl"), Some(Namespace::Bl));
assert_eq!(Namespace::from_arg("bz"), Some(Namespace::Bz));
assert_eq!(
Namespace::from_arg("bl-delivery"),
Some(Namespace::BlDelivery)
);
assert_eq!(
Namespace::from_arg("bl-tracker"),
Some(Namespace::BlTracker)
);
assert_eq!(Namespace::from_arg("gui"), None);
assert_eq!(Namespace::from_arg(""), None);
}
#[test]
fn the_plugin_arms_answer_protocol() {
assert_eq!(
dispatch(&argv(&["yog", "bl-delivery", "protocol"])),
Some(0)
);
assert_eq!(dispatch(&argv(&["yog", "bl-tracker", "protocol"])), Some(0));
}
#[test]
fn the_default_actor_prefers_the_harness_stamped_workspace_name() {
let name = |n: Option<&str>, u: Option<&str>| {
bl::default_actor(n.map(str::to_owned), u.map(str::to_owned))
};
assert_eq!(
name(Some("cobalt-gecko"), Some("mark")).as_deref(),
Some("cobalt-gecko")
);
assert_eq!(name(None, Some("mark")).as_deref(), Some("mark"));
assert_eq!(name(Some(""), Some("mark")).as_deref(), Some("mark"));
assert_eq!(name(None, None), None);
assert_eq!(
name(Some("cobalt-gecko"), None).as_deref(),
Some("cobalt-gecko")
);
}
#[test]
fn the_top_level_answers_help_in_every_spelling() {
for spelling in ["--help", "-h", "help"] {
assert_eq!(dispatch(&argv(&["yog", spelling])), Some(0), "{spelling}");
}
}
#[test]
fn the_top_level_page_states_the_whole_surface() {
let page = usage();
for word in [
crate::world::hatch::ENV_SUBCMD,
crate::world::hatch::EXEC_SUBCMD,
"gesture",
"litany",
"bl",
"bz",
] {
assert!(page.contains(&format!("yog {word}")), "{word} is unlisted");
}
assert!(!page.contains("bl-delivery"), "plugin arms are not typed");
assert!(!page.contains("bl-tracker"));
assert!(page.contains("--help"));
assert!(page.contains("--version"), "{page}");
assert!(
page.contains("the server for litany loops"),
"the header is the manifest's: {page}"
);
assert!(!page.contains("--workspace"), "{page}");
}
#[test]
fn every_table_word_routes_to_its_arm() {
for (word, namespace) in namespace::NAMESPACES {
assert_eq!(Namespace::from_arg(word), Some(*namespace), "{word}");
}
assert_eq!(Namespace::from_arg("nope"), None);
}