mod common;
use common::{OutputAssertions, TestRepo};
#[test]
fn test_split_help() {
let repo = TestRepo::new();
let output = repo.run_stax(&["split", "--help"]);
output.assert_success();
let stdout = TestRepo::stdout(&output);
assert!(stdout.contains("split") || stdout.contains("Split"));
assert!(stdout.contains("branch"));
}
#[test]
fn test_split_on_trunk_fails() {
let repo = TestRepo::new();
let output = repo.run_stax(&["split"]);
output.assert_failure();
let stderr = TestRepo::stderr(&output);
assert!(
stderr.contains("trunk") || stderr.contains("Cannot split"),
"Expected message about trunk branch, got: {}",
stderr
);
}
#[test]
fn test_split_untracked_branch_fails() {
let repo = TestRepo::new();
repo.git(&["checkout", "-b", "untracked-branch"]);
repo.create_file("file1.txt", "content 1");
repo.commit("commit 1");
repo.create_file("file2.txt", "content 2");
repo.commit("commit 2");
let output = repo.run_stax(&["split"]);
output.assert_failure();
let stderr = TestRepo::stderr(&output);
assert!(
stderr.contains("not tracked") || stderr.contains("track"),
"Expected message about untracked branch, got: {}",
stderr
);
}
#[test]
fn test_split_no_commits_fails() {
let repo = TestRepo::new();
repo.create_stack(&["feature-a"]);
assert!(repo.current_branch_contains("feature-a"));
let output = repo.run_stax(&["split"]);
output.assert_failure();
let stderr = TestRepo::stderr(&output);
assert!(
stderr.contains("Only 1 commit")
|| stderr.contains("at least 2")
|| stderr.contains("No commits"),
"Expected message about insufficient commits, got: {}",
stderr
);
}
#[test]
fn test_split_single_commit_fails() {
let repo = TestRepo::new();
repo.create_stack(&["feature-a"]);
let output = repo.run_stax(&["split"]);
output.assert_failure();
let stderr = TestRepo::stderr(&output);
assert!(
stderr.contains("Only 1 commit")
|| stderr.contains("at least 2")
|| stderr.contains("commits"),
"Expected message about needing 2+ commits, got: {}",
stderr
);
}
#[test]
fn test_split_with_two_commits_passes_validation() {
let repo = TestRepo::new();
repo.create_stack(&["feature-a"]);
repo.create_file("extra.txt", "extra content");
repo.commit("second commit");
let output = repo.run_stax(&["split"]);
output.assert_failure();
let stderr = TestRepo::stderr(&output);
assert!(
stderr.contains("interactive terminal"),
"Should have passed validation and failed on terminal check, got: {}",
stderr
);
}
#[test]
fn test_split_with_many_commits_passes_validation() {
let repo = TestRepo::new();
repo.create_stack(&["feature-a"]);
for i in 2..=5 {
repo.create_file(&format!("file{}.txt", i), &format!("content {}", i));
repo.commit(&format!("commit {}", i));
}
let output = repo.run_stax(&["split"]);
output.assert_failure();
let stderr = TestRepo::stderr(&output);
assert!(
stderr.contains("interactive terminal"),
"Should have passed validation and failed on terminal check, got: {}",
stderr
);
}
#[test]
fn test_split_from_middle_of_stack_passes_validation() {
let repo = TestRepo::new();
let branches = repo.create_stack(&["feature-a", "feature-b"]);
repo.run_stax(&["checkout", &branches[0]]);
repo.create_file("extra1.txt", "content");
repo.commit("extra commit 1");
repo.create_file("extra2.txt", "content");
repo.commit("extra commit 2");
let output = repo.run_stax(&["split"]);
output.assert_failure();
let stderr = TestRepo::stderr(&output);
assert!(
stderr.contains("interactive terminal"),
"Should have passed validation and failed on terminal check, got: {}",
stderr
);
}