use super::*;
fn split_call(backend: &TernBackend, script: &Arc<Script>, spec: &SpawnSpec) -> String {
let placement = PanePlacement::from_pane_count(0);
let pane = backend
.split_and_start("2147483650", spec, placement, "2147483648", "2147483649")
.unwrap();
let calls = script.calls();
assert_eq!(calls.len(), 1, "{calls:?}");
assert_eq!(pane, "2147483660", "split returned the block it made");
calls.into_iter().next().unwrap()
}
#[test]
fn spawn_creates_the_cluster_session_the_role_tab_and_the_block() {
let script = Script::default()
.reply("ls --json", listing(vec![]))
.reply("new session", created(2147483648, 2147483649, 2147483650))
.reply("ls --json", listing(vec![]))
.reply("new tab", created(2147483648, 2147483651, 2147483652))
.reply("rename 2147483652 planner", "{}")
.reply("split", created(2147483648, 2147483651, 2147483660));
let (backend, script) = backend(script);
let session = backend.spawn(spec()).unwrap();
let tern = &session.backend_ref["tern"];
assert_eq!(tern["session_id"], "2147483648");
assert_eq!(tern["tab_id"], "2147483651");
assert_eq!(tern["pane_id"], "2147483660");
assert_eq!(tern["session_label"], "onlyne:lab");
assert_eq!(tern["base_pane"], "2147483652");
assert_eq!(tern["split_direction"], "right");
let calls = script.calls();
assert!(calls[0].ends_with("ls --json"), "{calls:?}");
assert!(
calls[1].contains("new session onlyne:lab --cwd /w --keep-open --json"),
"{:?}",
calls[1]
);
assert!(calls[2].ends_with("ls --json"), "{calls:?}");
assert!(
calls[3].contains("new tab 2147483648 --cwd /w --keep-open --json"),
"{:?}",
calls[3]
);
assert!(
calls[5].contains("split 2147483652 right --cwd /w --keep-open --json"),
"{:?}",
calls[5]
);
}
#[test]
fn spawn_reuses_the_session_and_the_role_tab_when_they_exist() {
let existing = listing(vec![session(
2147483648,
Some("onlyne:lab"),
vec![tab(2147483649, Some("planner"), &[700, 701], Some(1))],
)]);
let script = Script::default()
.reply("ls --json", existing.clone())
.reply("ls --json", existing)
.reply("split", created(2147483648, 2147483649, 2147483660));
let (backend, script) = backend(script);
let session = backend.spawn(spec()).unwrap();
let tern = &session.backend_ref["tern"];
assert_eq!(tern["session_id"], "2147483648");
assert_eq!(tern["tab_id"], "2147483649");
assert_eq!(tern["base_pane"], "701");
let calls = script.calls();
assert_eq!(calls.len(), 3, "{calls:?}");
assert!(
!calls.iter().any(|call| call.contains("new ")),
"a found session and tab must not be re-created: {calls:?}"
);
assert!(calls[2].contains("split 701 down"), "{:?}", calls[2]);
}
#[test]
fn spawn_creates_the_tab_inside_a_session_it_found() {
let existing = listing(vec![session(
2147483648,
Some("onlyne:lab"),
vec![tab(2147483649, Some("other"), &[700], None)],
)]);
let script = Script::default()
.reply("ls --json", existing.clone())
.reply("ls --json", existing)
.reply("new tab", created(2147483648, 2147483651, 2147483652))
.reply("rename 2147483652 planner", "{}")
.reply("split", created(2147483648, 2147483651, 2147483660));
let (backend, script) = backend(script);
backend.spawn(spec()).unwrap();
let calls = script.calls();
assert!(
calls.iter().all(|call| !call.contains("new session")),
"{calls:?}"
);
assert!(calls[2].contains("new tab 2147483648"), "{:?}", calls[2]);
}
#[test]
fn split_sends_the_command_as_argv_inside_the_pane_shell() {
let script = Script::default().reply("split", created(2147483648, 2147483649, 2147483660));
let (backend, script) = backend(script);
let call = split_call(&backend, &script, &spec());
let tail = call.split(" -- ").nth(1).expect("a -- separator");
assert_eq!(
tail, "env ONLYNE_CLUSTER=lab ONLYNE_ROLE=planner pi --session-id a b",
"{call}"
);
}
#[test]
fn split_sends_no_ratio_because_tern_takes_none() {
let script = Script::default().reply("split", created(2147483648, 2147483649, 2147483660));
let (backend, script) = backend(script);
let call = split_call(&backend, &script, &spec());
assert!(
!call.contains("--ratio"),
"tern split takes no ratio: {call}"
);
}
#[test]
fn split_refuses_a_block_in_another_session() {
let script = Script::default().reply("split", created(99999, 2147483649, 2147483660));
let (backend, _) = backend(script);
let error = backend
.split_and_start(
"2147483650",
&spec(),
PanePlacement::from_pane_count(0),
"2147483648",
"2147483649",
)
.unwrap_err();
assert!(
error.to_string().contains("session 99999, not 2147483648"),
"{error}"
);
}
#[test]
fn spawn_refuses_an_empty_command() {
let (backend, _) = backend(Script::default());
let mut spec = spec();
spec.command.clear();
let error = backend.spawn(spec).unwrap_err();
assert!(error.to_string().contains("requires a command"), "{error}");
}