use test_case::test_case;
use crate::common::CommandOutput;
use crate::common::TestEnvironment;
use crate::common::TestWorkDir;
#[must_use]
fn get_log_output_with_bookmarks(work_dir: &TestWorkDir) -> CommandOutput {
let template = r#""bookmarks{" ++ local_bookmarks ++ "} desc: " ++ description"#;
work_dir.run_jj(["log", "-T", template])
}
fn set_advance_bookmarks(test_env: &TestEnvironment, enabled: bool) {
if enabled {
test_env.add_config(
r#"[experimental-advance-branches]
enabled-branches = ["glob:*"]
"#,
);
} else {
test_env.add_config(
r#"[experimental-advance-branches]
enabled-branches = []
"#,
);
}
}
type CommitFn = fn(work_dir: &TestWorkDir, commit_message: &str);
fn commit_cmd(work_dir: &TestWorkDir, commit_message: &str) {
work_dir.run_jj(["commit", "-m", commit_message]).success();
}
fn describe_new_cmd(work_dir: &TestWorkDir, commit_message: &str) {
work_dir
.run_jj(["describe", "-m", commit_message])
.success();
work_dir.run_jj(["new"]).success();
}
#[test_case(commit_cmd ; "commit")]
#[test_case(describe_new_cmd; "new")]
fn test_advance_bookmarks_enabled(make_commit: CommitFn) {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
set_advance_bookmarks(&test_env, true);
work_dir
.run_jj(["bookmark", "create", "-r", "@-", "test_bookmark"])
.success();
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
◆ bookmarks{test_bookmark} desc:
[EOF]
");
}
make_commit(&work_dir, "first");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
set_advance_bookmarks(&test_env, false);
make_commit(&work_dir, "second");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: second
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
}
#[test_case(commit_cmd ; "commit")]
#[test_case(describe_new_cmd; "new")]
fn test_advance_bookmarks_at_minus(make_commit: CommitFn) {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
set_advance_bookmarks(&test_env, true);
work_dir
.run_jj(["bookmark", "create", "test_bookmark", "-r", "@"])
.success();
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{test_bookmark} desc:
◆ bookmarks{} desc:
[EOF]
");
}
make_commit(&work_dir, "first");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
work_dir
.run_jj(["bookmark", "create", "test_bookmark2", "-r", "@"])
.success();
make_commit(&work_dir, "second");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{test_bookmark test_bookmark2} desc: second
○ bookmarks{} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
}
#[test_case(commit_cmd ; "commit")]
#[test_case(describe_new_cmd; "new")]
fn test_advance_bookmarks_overrides(make_commit: CommitFn) {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
work_dir
.run_jj(["bookmark", "create", "-r", "@-", "test_bookmark"])
.success();
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
◆ bookmarks{test_bookmark} desc:
[EOF]
");
}
make_commit(&work_dir, "first");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: first
◆ bookmarks{test_bookmark} desc:
[EOF]
");
}
test_env.add_config(
r#"[experimental-advance-bookmarks]
enabled-bookmarks = ["test_bookmark"]
"#,
);
work_dir
.run_jj(["bookmark", "set", "test_bookmark", "-r", "@-"])
.success();
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
make_commit(&work_dir, "second");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: second
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
test_env.add_config(
r#"[experimental-advance-bookmarks]
enabled-bookmarks = ["test_bookmark", "second_bookmark"]
disabled-bookmarks = ["test_bookmark"]
"#,
);
make_commit(&work_dir, "third");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: third
○ bookmarks{} desc: second
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
work_dir
.run_jj(["bookmark", "create", "second_bookmark", "-r", "@-"])
.success();
work_dir
.run_jj(["bookmark", "set", "test_bookmark", "-r", "@-"])
.success();
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{second_bookmark test_bookmark} desc: third
○ bookmarks{} desc: second
○ bookmarks{} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
make_commit(&work_dir, "fourth");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: fourth
○ bookmarks{second_bookmark test_bookmark} desc: third
○ bookmarks{} desc: second
○ bookmarks{} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
}
#[test_case(commit_cmd ; "commit")]
#[test_case(describe_new_cmd; "new")]
fn test_advance_bookmarks_multiple_bookmarks(make_commit: CommitFn) {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
set_advance_bookmarks(&test_env, true);
work_dir
.run_jj(["bookmark", "create", "-r", "@-", "first_bookmark"])
.success();
work_dir
.run_jj(["bookmark", "create", "-r", "@-", "second_bookmark"])
.success();
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
◆ bookmarks{first_bookmark second_bookmark} desc:
[EOF]
");
}
make_commit(&work_dir, "first");
insta::allow_duplicates! {
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{first_bookmark second_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
}
#[test]
fn test_new_advance_bookmarks_interior() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
set_advance_bookmarks(&test_env, true);
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
◆ bookmarks{} desc:
[EOF]
");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir
.run_jj(["bookmark", "create", "-r", "@---", "test_bookmark"])
.success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: third
○ bookmarks{} desc: second
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
work_dir.run_jj(["new", "-r", "@--"]).success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
│ ○ bookmarks{} desc: third
├─╯
○ bookmarks{test_bookmark} desc: second
○ bookmarks{} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
#[test]
fn test_new_advance_bookmarks_before() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
set_advance_bookmarks(&test_env, true);
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
◆ bookmarks{} desc:
[EOF]
");
work_dir.run_jj(["commit", "-m", "first"]).success();
work_dir.run_jj(["commit", "-m", "second"]).success();
work_dir.run_jj(["commit", "-m", "third"]).success();
work_dir
.run_jj(["bookmark", "create", "-r", "@---", "test_bookmark"])
.success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: third
○ bookmarks{} desc: second
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
work_dir.run_jj(["new", "--before", "@-"]).success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
○ bookmarks{} desc: third
@ bookmarks{} desc:
○ bookmarks{} desc: second
○ bookmarks{test_bookmark} desc: first
◆ bookmarks{} desc:
[EOF]
");
}
#[test]
fn test_new_advance_bookmarks_after() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
set_advance_bookmarks(&test_env, true);
work_dir
.run_jj(["bookmark", "create", "-r", "@-", "test_bookmark"])
.success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
◆ bookmarks{test_bookmark} desc:
[EOF]
");
work_dir.run_jj(["describe", "-m", "first"]).success();
work_dir.run_jj(["new", "--after", "@"]).success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
○ bookmarks{} desc: first
◆ bookmarks{test_bookmark} desc:
[EOF]
");
}
#[test]
fn test_new_advance_bookmarks_merge_children() {
let test_env = TestEnvironment::default();
test_env.run_jj_in(".", ["git", "init", "repo"]).success();
let work_dir = test_env.work_dir("repo");
set_advance_bookmarks(&test_env, true);
work_dir.run_jj(["desc", "-m", "0"]).success();
work_dir.run_jj(["new", "-m", "1"]).success();
work_dir
.run_jj(["new", "description(0)", "-m", "2"])
.success();
work_dir
.run_jj([
"bookmark",
"create",
"test_bookmark",
"-r",
"description(0)",
])
.success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc: 2
│ ○ bookmarks{} desc: 1
├─╯
○ bookmarks{test_bookmark} desc: 0
◆ bookmarks{} desc:
[EOF]
");
work_dir
.run_jj(["new", "description(1)", "description(2)"])
.success();
insta::assert_snapshot!(get_log_output_with_bookmarks(&work_dir), @r"
@ bookmarks{} desc:
├─╮
│ ○ bookmarks{} desc: 2
○ │ bookmarks{} desc: 1
├─╯
○ bookmarks{test_bookmark} desc: 0
◆ bookmarks{} desc:
[EOF]
");
}