diff --git a/crates/but/src/command/legacy/status/tui/tests/details_tests.rs b/crates/but/src/command/legacy/status/tui/tests/details_tests.rs new file mode 100644 index 00000000000..f1e5f53a9a2 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/details_tests.rs @@ -0,0 +1,188 @@ +use but_testsupport::Sandbox; +use crossterm::event::{KeyCode, KeyModifiers}; +use snapbox::file; +use temp_env::with_var; + +use crate::command::legacy::status::tui::tests::utils::{test_tui, test_tui_with_size}; + +#[test] +fn toggle_details_view_for_commit() { + let env = Sandbox::init_scenario_with_target_and_default_settings("one-stack").unwrap(); + env.setup_metadata(&["A"]).unwrap(); + + let mut tui = test_tui(env); + + tui.input_then_render([KeyCode::Down, KeyCode::Down]) + .assert_rendered_term_svg_eq(file!["snapshots/toggle_details_view_for_commit_001.svg"]); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file!["snapshots/toggle_details_view_for_commit_002.svg"]); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file!["snapshots/toggle_details_view_for_commit_003.svg"]); +} + +#[test] +fn details_view_updates_with_selection_changes() { + let env = Sandbox::init_scenario_with_target_and_default_settings("two-stacks").unwrap(); + env.setup_metadata(&["A", "B"]).unwrap(); + + let mut tui = test_tui(env); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_updates_with_selection_changes_001.svg" + ]); + + tui.input_then_render([KeyCode::Down, KeyCode::Down]) + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_updates_with_selection_changes_002.svg" + ]); + + tui.input_then_render((KeyModifiers::SHIFT, KeyCode::Char('J'))) + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_updates_with_selection_changes_003.svg" + ]); +} + +#[test] +fn details_view_supports_scroll_controls() { + let env = Sandbox::init_scenario_with_target_and_default_settings("one-stack").unwrap(); + env.setup_metadata(&["A"]).unwrap(); + + let file_contents = (1..=120) + .map(|line| format!("line-{line:03}\n")) + .collect::(); + env.file("large.txt", file_contents); + + let mut tui = test_tui_with_size(env, 100, 10); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_supports_scroll_controls_001.svg" + ]); + + tui.render_with_messages((KeyModifiers::CONTROL, KeyCode::Char('n')), Vec::new()) + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_supports_scroll_controls_002.svg" + ]); + + tui.render_with_messages((KeyModifiers::CONTROL, KeyCode::Char('d')), Vec::new()) + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_supports_scroll_controls_003.svg" + ]); + + tui.render_with_messages((KeyModifiers::CONTROL, KeyCode::Char('u')), Vec::new()) + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_supports_scroll_controls_004.svg" + ]); + + tui.render_with_messages((KeyModifiers::CONTROL, KeyCode::Char('p')), Vec::new()) + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_supports_scroll_controls_005.svg" + ]); +} + +#[test] +fn commit_message_wraps_in_details_view() { + let env = Sandbox::init_scenario_with_target_and_default_settings("one-stack").unwrap(); + env.setup_metadata(&["A"]).unwrap(); + + let mut tui = test_tui_with_size(env, 80, 14); + + tui.input_then_render([KeyCode::Down, KeyCode::Down]) + .assert_rendered_term_svg_eq(file![ + "snapshots/commit_message_wraps_in_details_view_001.svg" + ]); + + tui.input_then_render(KeyCode::Enter) + .assert_rendered_term_svg_eq(file![ + "snapshots/commit_message_wraps_in_details_view_002.svg" + ]); + + tui.input_then_render(" this commit message is intentionally long so the details pane has to wrap the text across multiple visual lines") + .assert_rendered_term_svg_eq(file!["snapshots/commit_message_wraps_in_details_view_003.svg"]); + + with_var("GIT_AUTHOR_DATE", Some("2000-01-01T00:00:00Z"), || { + with_var("GIT_COMMITTER_DATE", Some("2000-01-01T00:00:00Z"), || { + tui.input_then_render(KeyCode::Enter); + }); + }); + + tui.input_then_render('d'); + + tui.render_with_messages((KeyModifiers::CONTROL, KeyCode::Char('n')), Vec::new()) + .assert_rendered_term_svg_eq(file![ + "snapshots/commit_message_wraps_in_details_view_005.svg" + ]); +} + +#[test] +fn details_view_renders_multiple_hunks_and_files() { + let env = Sandbox::init_scenario_with_target_and_default_settings("one-stack").unwrap(); + env.setup_metadata(&["A"]).unwrap(); + + let first_file = (1..=8) + .map(|line| format!("alpha-{line}\n")) + .collect::(); + let second_file = (1..=8) + .map(|line| format!("beta-{line}\n")) + .collect::(); + + env.file("alpha.txt", first_file); + env.file("beta.txt", second_file); + + let mut tui = test_tui_with_size(env, 100, 18); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file![ + "snapshots/details_view_renders_multiple_hunks_and_files_001.svg" + ]); +} + +#[test] +fn details_diff_svg_shows_plus_and_minus_backgrounds() { + let env = Sandbox::init_scenario_with_target_and_default_settings("one-stack").unwrap(); + env.setup_metadata(&["A"]).unwrap(); + + env.file("A", "A-changed\n"); + + let mut tui = test_tui_with_size(env, 100, 12); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file![ + "snapshots/details_diff_svg_shows_plus_and_minus_backgrounds_001.svg" + ]); +} + +#[test] +fn toggling_details_off_and_on_resets_scroll_position() { + let env = Sandbox::init_scenario_with_target_and_default_settings("one-stack").unwrap(); + env.setup_metadata(&["A"]).unwrap(); + let file_contents = (1..=80) + .map(|line| format!("line-{line:03}\n")) + .collect::(); + env.file("large.txt", file_contents); + + let mut tui = test_tui_with_size(env, 100, 10); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file![ + "snapshots/toggling_details_off_and_on_resets_scroll_position_001.svg" + ]); + + tui.input_then_render((KeyModifiers::CONTROL, KeyCode::Char('d'))) + .assert_rendered_term_svg_eq(file![ + "snapshots/toggling_details_off_and_on_resets_scroll_position_002.svg" + ]); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file![ + "snapshots/toggling_details_off_and_on_resets_scroll_position_003.svg" + ]); + + tui.input_then_render('d') + .assert_rendered_term_svg_eq(file![ + "snapshots/toggling_details_off_and_on_resets_scroll_position_004.svg" + ]); +} diff --git a/crates/but/src/command/legacy/status/tui/tests/mod.rs b/crates/but/src/command/legacy/status/tui/tests/mod.rs index 493e4868b03..9dc953b9851 100644 --- a/crates/but/src/command/legacy/status/tui/tests/mod.rs +++ b/crates/but/src/command/legacy/status/tui/tests/mod.rs @@ -12,6 +12,7 @@ use crate::command::legacy::status::tui::tests::utils::{test_tui, test_tui_with_ mod branch_tests; mod command_tests; mod commit_tests; +mod details_tests; mod move_tests; mod rub_tests; mod utils; diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_001.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_001.svg new file mode 100644 index 00000000000..857557392ee --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_001.svg @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + n + o + c + h + a + n + g + e + s + + + + + g + 0 + [ + A + ] + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_002.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_002.svg new file mode 100644 index 00000000000..4fbd73eeb00 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_002.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + n + o + c + h + a + n + g + e + s + + + + + g + 0 + [ + A + ] + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + r + e + w + o + r + d + e + n + t + e + r + c + o + n + f + i + r + m + + e + s + c + b + a + c + k + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_003.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_003.svg new file mode 100644 index 00000000000..071091d0e7c --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_003.svg @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + n + o + c + h + a + n + g + e + s + + + + + g + 0 + [ + A + ] + + + 9 + 4 + 7 + 7 + a + e + 7 + t + h + e + d + e + t + a + i + l + s + p + a + n + e + h + a + s + t + o + w + r + a + p + t + h + e + t + e + x + t + a + c + r + o + s + s + m + u + l + t + i + p + l + e + v + i + s + u + a + l + l + i + n + e + s + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + r + e + w + o + r + d + e + n + t + e + r + c + o + n + f + i + r + m + + e + s + c + b + a + c + k + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_005.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_005.svg new file mode 100644 index 00000000000..2b4e2989a19 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/commit_message_wraps_in_details_view_005.svg @@ -0,0 +1,437 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + A + u + t + h + o + r + : + a + u + t + h + o + r + < + a + u + t + h + o + r + @ + e + x + a + m + p + l + e + . + c + o + m + > + + n + o + c + h + a + n + g + e + s + + C + o + m + m + i + t + t + e + r + : + c + o + m + m + i + t + t + e + r + < + c + o + m + m + i + t + t + e + r + @ + e + x + a + m + p + l + e + + + + + + g + 0 + [ + A + ] + + a + d + d + A + t + h + i + s + c + o + m + m + i + t + m + e + s + s + a + g + e + i + s + + + [..] + [..] + [..] + [..] + [..] + [..] + [..] + a + d + d + A + t + h + i + s + c + o + m + m + i + t + m + e + s + s + a + g + e + i + + i + n + t + e + n + t + i + o + n + a + l + l + y + l + o + n + g + s + o + t + h + e + d + e + t + a + i + l + s + p + a + n + e + + + + h + a + s + t + o + w + r + a + p + t + h + e + t + e + x + t + a + c + r + o + s + s + m + u + l + t + i + p + l + e + + + v + i + s + u + a + l + l + i + n + e + s + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + + + + + + + + + + + + + a + d + d + e + d + : + A + + + + + + + + + + + + + + + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + @ + @ + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_diff_svg_shows_plus_and_minus_backgrounds_001.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_diff_svg_shows_plus_and_minus_backgrounds_001.svg new file mode 100644 index 00000000000..e9cb19f7aed --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_diff_svg_shows_plus_and_minus_backgrounds_001.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + t + m + M + A + + A + + + + + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + @ + @ + - + 1 + , + 1 + + + 1 + , + 1 + @ + @ + + + + + + + + + + + + + + + + + + + + + 1 + + + - + A + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 1 + + + + A + - + c + h + a + n + g + e + d + + + + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_renders_multiple_hunks_and_files_001.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_renders_multiple_hunks_and_files_001.svg new file mode 100644 index 00000000000..5201c3e172c --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_renders_multiple_hunks_and_files_001.svg @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + + + + + + + + + x + z + A + a + l + p + h + a + . + t + x + t + + a + l + p + h + a + . + t + x + t + + + v + q + A + b + e + t + a + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + @ + @ + - + 1 + , + 0 + + + 1 + , + 8 + @ + @ + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + + + + + + + + + + + + + + + + + 1 + + + + a + l + p + h + a + - + 1 + + + + 2 + + + + a + l + p + h + a + - + 2 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 3 + + + + a + l + p + h + a + - + 3 + + + 4 + + + + a + l + p + h + a + - + 4 + + + 5 + + + + a + l + p + h + a + - + 5 + + + 6 + + + + a + l + p + h + a + - + 6 + + + 7 + + + + a + l + p + h + a + - + 7 + + + 8 + + + + a + l + p + h + a + - + 8 + + + + + + + + + + + + + + + b + e + t + a + . + t + x + t + + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_001.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_001.svg new file mode 100644 index 00000000000..5e2b8555cc7 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_001.svg @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + + + + + + + + + m + v + A + l + a + r + g + e + . + t + x + t + + l + a + r + g + e + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + 2 + 0 + @ + @ + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + l + i + n + e + - + 0 + 0 + 1 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 2 + + + + l + i + n + e + - + 0 + 0 + 2 + + + 3 + + + + l + i + n + e + - + 0 + 0 + 3 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_002.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_002.svg new file mode 100644 index 00000000000..ae8b80f7b0c --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_002.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + l + a + r + g + e + . + t + x + t + + + m + v + A + l + a + r + g + e + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + 2 + 0 + @ + @ + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + l + i + n + e + - + 0 + 0 + 1 + + + + 2 + + + + l + i + n + e + - + 0 + 0 + 2 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 3 + + + + l + i + n + e + - + 0 + 0 + 3 + + + 4 + + + + l + i + n + e + - + 0 + 0 + 4 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_003.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_003.svg new file mode 100644 index 00000000000..52a02ab7aba --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_003.svg @@ -0,0 +1,434 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + 2 + 6 + + + + l + i + n + e + - + 0 + 2 + 6 + + m + v + A + l + a + r + g + e + . + t + x + t + + + 2 + 7 + + + + l + i + n + e + - + 0 + 2 + 7 + + + + 2 + 8 + + + + l + i + n + e + - + 0 + 2 + 8 + + + + g + 0 + [ + A + ] + + + 2 + 9 + + + + l + i + n + e + - + 0 + 2 + 9 + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + 3 + 0 + + + + l + i + n + e + - + 0 + 3 + 0 + + + + + 3 + 1 + + + + l + i + n + e + - + 0 + 3 + 1 + + + + 3 + 2 + + + + l + i + n + e + - + 0 + 3 + 2 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 3 + 3 + + + + l + i + n + e + - + 0 + 3 + 3 + + + 3 + 4 + + + + l + i + n + e + - + 0 + 3 + 4 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_004.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_004.svg new file mode 100644 index 00000000000..ae8b80f7b0c --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_004.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + l + a + r + g + e + . + t + x + t + + + m + v + A + l + a + r + g + e + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + 2 + 0 + @ + @ + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + l + i + n + e + - + 0 + 0 + 1 + + + + 2 + + + + l + i + n + e + - + 0 + 0 + 2 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 3 + + + + l + i + n + e + - + 0 + 0 + 3 + + + 4 + + + + l + i + n + e + - + 0 + 0 + 4 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_005.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_005.svg new file mode 100644 index 00000000000..5e2b8555cc7 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_supports_scroll_controls_005.svg @@ -0,0 +1,364 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + + + + + + + + + m + v + A + l + a + r + g + e + . + t + x + t + + l + a + r + g + e + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + 2 + 0 + @ + @ + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + l + i + n + e + - + 0 + 0 + 1 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 2 + + + + l + i + n + e + - + 0 + 0 + 2 + + + 3 + + + + l + i + n + e + - + 0 + 0 + 3 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_001.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_001.svg new file mode 100644 index 00000000000..ccf92fa8a81 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_001.svg @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + n + o + c + h + a + n + g + e + s + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + + + + + + h + 0 + [ + B + ] + + + + d + 3 + e + 2 + b + a + 3 + a + d + d + B + + + + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + + + + + + + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_002.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_002.svg new file mode 100644 index 00000000000..d96ad81b92b --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_002.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + C + o + m + m + i + t + I + D + : + 9 + 4 + 7 + 7 + a + e + 7 + 2 + 1 + a + b + 5 + 2 + 1 + d + 9 + d + 0 + 1 + 7 + 4 + f + 7 + 0 + e + 8 + 0 + 4 + c + e + 3 + f + f + 9 + f + 6 + f + b + + n + o + c + h + a + n + g + e + s + + A + u + t + h + o + r + : + a + u + t + h + o + r + < + a + u + t + h + o + r + @ + e + x + a + m + p + l + e + . + c + o + m + > + ( + S + a + t + J + a + n + 1 + + + C + o + m + m + i + t + t + e + r + : + c + o + m + m + i + t + t + e + r + < + c + o + m + m + i + t + t + e + r + @ + e + x + a + m + p + l + e + . + c + o + m + > + ( + S + u + n + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + a + d + d + A + + + + + + + + + h + 0 + [ + B + ] + + + + + + + + + + + + + + + d + 3 + e + 2 + b + a + 3 + a + d + d + B + + a + d + d + e + d + : + A + + + + + + + + + + + + + + + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + @ + @ + + + + + + + + + + + + + + + + + + + 1 + + + + A + + + + + + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_003.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_003.svg new file mode 100644 index 00000000000..ac346c464b5 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/details_view_updates_with_selection_changes_003.svg @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + + + + + + + + n + o + c + h + a + n + g + e + s + + a + d + d + e + d + : + B + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + @ + @ + + + + + + + + + + + + + + + + + + + + + + 1 + + + + B + + + + h + 0 + [ + B + ] + + + + d + 3 + e + 2 + b + a + 3 + a + d + d + B + + + + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + + + + + + + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_001.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_001.svg new file mode 100644 index 00000000000..4791bf53680 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_001.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + n + o + c + h + a + n + g + e + s + + + + + g + 0 + [ + A + ] + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_002.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_002.svg new file mode 100644 index 00000000000..01d87649ca3 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_002.svg @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + C + o + m + m + i + t + I + D + : + 9 + 4 + 7 + 7 + a + e + 7 + 2 + 1 + a + b + 5 + 2 + 1 + d + 9 + d + 0 + 1 + 7 + 4 + f + 7 + 0 + e + 8 + 0 + 4 + c + e + 3 + f + f + 9 + f + 6 + f + b + + n + o + c + h + a + n + g + e + s + + A + u + t + h + o + r + : + a + u + t + h + o + r + < + a + u + t + h + o + r + @ + e + x + a + m + p + l + e + . + c + o + m + > + ( + S + a + t + J + a + n + 1 + + + C + o + m + m + i + t + t + e + r + : + c + o + m + m + i + t + t + e + r + < + c + o + m + m + i + t + t + e + r + @ + e + x + a + m + p + l + e + . + c + o + m + > + ( + S + u + n + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + a + d + d + A + + + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + + + + + + + + + + + + a + d + d + e + d + : + A + + + + + + + + + + + + + + + + @ + @ + - + 1 + , + 0 + + + 1 + , + 1 + @ + @ + + + + + + + + + + + + + + + + + + + 1 + + + + A + + + + + + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_003.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_003.svg new file mode 100644 index 00000000000..4791bf53680 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggle_details_view_for_commit_003.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + n + o + c + h + a + n + g + e + s + + + + + g + 0 + [ + A + ] + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_001.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_001.svg new file mode 100644 index 00000000000..cfad00288ac --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_001.svg @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + + + + + + + + + m + v + A + l + a + r + g + e + . + t + x + t + + l + a + r + g + e + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + @ + @ + - + 1 + , + 0 + + + 1 + , + 8 + 0 + @ + @ + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + l + i + n + e + - + 0 + 0 + 1 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 2 + + + + l + i + n + e + - + 0 + 0 + 2 + + + 3 + + + + l + i + n + e + - + 0 + 0 + 3 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_002.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_002.svg new file mode 100644 index 00000000000..cfad00288ac --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_002.svg @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + + + + + + + + + m + v + A + l + a + r + g + e + . + t + x + t + + l + a + r + g + e + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + @ + @ + - + 1 + , + 0 + + + 1 + , + 8 + 0 + @ + @ + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + l + i + n + e + - + 0 + 0 + 1 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 2 + + + + l + i + n + e + - + 0 + 0 + 2 + + + 3 + + + + l + i + n + e + - + 0 + 0 + 3 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_003.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_003.svg new file mode 100644 index 00000000000..5c82f5703f2 --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_003.svg @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + m + v + A + l + a + r + g + e + . + t + x + t + + + + + g + 0 + [ + A + ] + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + + + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_004.svg b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_004.svg new file mode 100644 index 00000000000..cfad00288ac --- /dev/null +++ b/crates/but/src/command/legacy/status/tui/tests/snapshots/toggling_details_off_and_on_resets_scroll_position_004.svg @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + z + z + [ + u + n + s + t + a + g + e + d + c + h + a + n + g + e + s + ] + + + + + + + + + + + + + + + m + v + A + l + a + r + g + e + . + t + x + t + + l + a + r + g + e + . + t + x + t + + + + + + + + + + + + + + + + + + + g + 0 + [ + A + ] + + + + 9 + 4 + 7 + 7 + a + e + 7 + a + d + d + A + + @ + @ + - + 1 + , + 0 + + + 1 + , + 8 + 0 + @ + @ + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + l + i + n + e + - + 0 + 0 + 1 + + 0 + d + c + 3 + 7 + 3 + 3 + [ + o + r + i + g + i + n + / + m + a + i + n + ] + 2 + 0 + 0 + 0 + - + 0 + 1 + - + 0 + 2 + a + d + d + M + + + 2 + + + + l + i + n + e + - + 0 + 0 + 2 + + + 3 + + + + l + i + n + e + - + 0 + 0 + 3 + n + o + r + m + a + l + + / + j + d + o + w + n + + + / + k + u + p + + q + q + u + i + t + + d + d + i + f + f + + r + r + u + b + + c + c + o + m + m + i + t + + m + m + o + v + e + + b + b + r + a + n + c + h + + e + n + t + e + r + r + e + w + o + r + d + diff --git a/crates/but/src/command/legacy/status/tui/tests/utils.rs b/crates/but/src/command/legacy/status/tui/tests/utils.rs index bb9134ec458..d6a6da4b7ce 100644 --- a/crates/but/src/command/legacy/status/tui/tests/utils.rs +++ b/crates/but/src/command/legacy/status/tui/tests/utils.rs @@ -3,7 +3,11 @@ use std::convert::Infallible; use but_testsupport::Sandbox; use crossterm::event::*; use gitbutler_operating_modes::OperatingMode; -use ratatui::{Terminal, backend::TestBackend}; +use ratatui::{ + Terminal, + backend::TestBackend, + style::{Color, Modifier}, +}; use crate::{ args::OutputFormat, @@ -175,6 +179,167 @@ impl TestTuiInputThenRenderResult<'_> { self } + + #[track_caller] + pub(super) fn assert_rendered_term_svg_eq(self, expected: snapbox::Data) -> Self { + let svg = backend_to_svg(self.0.terminal.backend()); + snapbox::assert_data_eq!(svg, expected); + self + } +} + +fn backend_to_svg(backend: &TestBackend) -> String { + const CELL_WIDTH: u16 = 8; + const CELL_HEIGHT: u16 = 18; + const PADDING: u16 = 10; + const FONT_SIZE: u16 = 14; + + let buffer = backend.buffer(); + let area = *buffer.area(); + + let width = area.width * CELL_WIDTH + PADDING * 2; + let height = area.height * CELL_HEIGHT + PADDING * 2; + + let default_fg = (0xcc, 0xcc, 0xcc); + let default_bg = (0x00, 0x00, 0x00); + + let mut svg = String::new(); + svg.push_str(&format!( + "\n" + )); + svg.push_str(&format!( + " \n" + )); + + for y in area.y..area.y.saturating_add(area.height) { + for x in area.x..area.x.saturating_add(area.width) { + let cell = &buffer[(x, y)]; + let bg = color_to_rgb(cell.bg, default_bg); + if bg != default_bg { + let rect_x = PADDING + (x - area.x) * CELL_WIDTH; + let rect_y = PADDING + (y - area.y) * CELL_HEIGHT; + svg.push_str(&format!( + " \n", + rgb_hex(bg) + )); + } + } + } + + for y in area.y..area.y.saturating_add(area.height) { + let text_y = PADDING + (y - area.y + 1) * CELL_HEIGHT - 4; + for x in area.x..area.x.saturating_add(area.width) { + let cell = &buffer[(x, y)]; + let symbol = cell.symbol(); + if symbol.is_empty() || symbol == " " { + continue; + } + + let mut fg = color_to_rgb(cell.fg, default_fg); + let mut bg = color_to_rgb(cell.bg, default_bg); + if cell.modifier.contains(Modifier::REVERSED) { + std::mem::swap(&mut fg, &mut bg); + } + + let text_x = PADDING + (x - area.x) * CELL_WIDTH; + let mut style = format!("fill:{};", rgb_hex(fg)); + if cell.modifier.contains(Modifier::BOLD) { + style.push_str("font-weight:bold;"); + } + if cell.modifier.contains(Modifier::DIM) { + style.push_str("opacity:0.75;"); + } + if cell.modifier.contains(Modifier::ITALIC) { + style.push_str("font-style:italic;"); + } + if cell.modifier.contains(Modifier::UNDERLINED) { + style.push_str("text-decoration:underline;"); + } + if cell.modifier.contains(Modifier::CROSSED_OUT) { + style.push_str("text-decoration:line-through;"); + } + + svg.push_str(&format!( + " {}\n", + escape_xml(symbol) + )); + } + } + + svg.push_str("\n"); + svg +} + +fn color_to_rgb(color: Color, default: (u8, u8, u8)) -> (u8, u8, u8) { + match color { + Color::Reset => default, + Color::Black => (0x00, 0x00, 0x00), + Color::Red => (0xaa, 0x00, 0x00), + Color::Green => (0x00, 0xaa, 0x00), + Color::Yellow => (0xaa, 0x55, 0x00), + Color::Blue => (0x00, 0x00, 0xaa), + Color::Magenta => (0xaa, 0x00, 0xaa), + Color::Cyan => (0x00, 0xaa, 0xaa), + Color::Gray => (0xaa, 0xaa, 0xaa), + Color::DarkGray => (0x55, 0x55, 0x55), + Color::LightRed => (0xff, 0x55, 0x55), + Color::LightGreen => (0x55, 0xff, 0x55), + Color::LightYellow => (0xff, 0xff, 0x55), + Color::LightBlue => (0x55, 0x55, 0xff), + Color::LightMagenta => (0xff, 0x55, 0xff), + Color::LightCyan => (0x55, 0xff, 0xff), + Color::White => (0xff, 0xff, 0xff), + Color::Rgb(r, g, b) => (r, g, b), + Color::Indexed(idx) => xterm_256_to_rgb(idx), + } +} + +fn xterm_256_to_rgb(idx: u8) -> (u8, u8, u8) { + const BASE: [(u8, u8, u8); 16] = [ + (0, 0, 0), + (128, 0, 0), + (0, 128, 0), + (128, 128, 0), + (0, 0, 128), + (128, 0, 128), + (0, 128, 128), + (192, 192, 192), + (128, 128, 128), + (255, 0, 0), + (0, 255, 0), + (255, 255, 0), + (0, 0, 255), + (255, 0, 255), + (0, 255, 255), + (255, 255, 255), + ]; + + match idx { + 0..=15 => BASE[idx as usize], + 16..=231 => { + let i = idx - 16; + let r = i / 36; + let g = (i % 36) / 6; + let b = i % 6; + let to_channel = |v: u8| if v == 0 { 0 } else { 55 + v * 40 }; + (to_channel(r), to_channel(g), to_channel(b)) + } + 232..=255 => { + let gray = 8 + (idx - 232) * 10; + (gray, gray, gray) + } + } +} + +fn rgb_hex((r, g, b): (u8, u8, u8)) -> String { + format!("#{r:02X}{g:02X}{b:02X}") +} + +fn escape_xml(value: &str) -> String { + value + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") } impl EventPolling for [T; N]