diff options
Diffstat (limited to 'zellij-utils/src/input/unit/layout_test.rs')
-rw-r--r-- | zellij-utils/src/input/unit/layout_test.rs | 1738 |
1 files changed, 946 insertions, 792 deletions
diff --git a/zellij-utils/src/input/unit/layout_test.rs b/zellij-utils/src/input/unit/layout_test.rs index 22a10c6fb..b4b309ba8 100644 --- a/zellij-utils/src/input/unit/layout_test.rs +++ b/zellij-utils/src/input/unit/layout_test.rs @@ -1,859 +1,1013 @@ use super::super::layout::*; -use std::convert::TryInto; +use insta::assert_snapshot; -fn layout_test_dir(layout: String) -> PathBuf { - let root = Path::new(env!("CARGO_MANIFEST_DIR")); - let layout_dir = root.join("src/input/unit/fixtures/layouts"); - layout_dir.join(layout) +#[test] +fn empty_layout() { + let kdl_layout = "layout"; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout::default()), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } -fn default_layout_dir(layout: String) -> PathBuf { - let root = Path::new(env!("CARGO_MANIFEST_DIR")); - let layout_dir = root.join("assets/layouts"); - layout_dir.join(layout) +#[test] +fn layout_with_one_pane() { + let kdl_layout = r#" + layout { + pane + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![PaneLayout::default()], + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn default_layout_is_ok() { - let path = default_layout_dir("default.yaml".into()); - let layout = LayoutFromYaml::new(&path); - assert!(layout.is_ok()); +fn layout_with_multiple_panes() { + let kdl_layout = r#" + layout { + pane + pane + pane + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![ + PaneLayout::default(), + PaneLayout::default(), + PaneLayout::default(), + ], + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn default_layout_has_one_tab() { - let path = default_layout_dir("default.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.as_ref().unwrap(); - assert_eq!(layout_template.tabs.len(), 1); +fn layout_with_nested_panes() { + let kdl_layout = r#" + layout { + pane split_direction="Vertical" { + pane + pane + } + pane { + pane + pane + } + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![ + PaneLayout { + children_split_direction: SplitDirection::Vertical, + children: vec![PaneLayout::default(), PaneLayout::default()], + ..Default::default() + }, + PaneLayout { + children: vec![PaneLayout::default(), PaneLayout::default()], + ..Default::default() + }, + ], + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn default_layout_merged_correctly() { - let path = default_layout_dir("default.yaml".into()); - let layout_from_yaml = LayoutFromYaml::new(&path); - let layout_template = layout_from_yaml.as_ref().unwrap(); - let tab_layout = layout_template - .template - .clone() - .insert_tab_layout(Some(layout_template.tabs[0].clone())); - let merged_layout = Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Vertical, - borderless: true, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(1)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), - _allow_exec_host_cmd: false, - })), - }, - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: None, - run: None, - }, - Layout { - direction: Direction::Vertical, - borderless: true, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(2)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), - _allow_exec_host_cmd: false, - })), - }, - ], - split_size: None, - run: None, - }; - assert_eq!(merged_layout, tab_layout.try_into().unwrap()); -} - -#[test] -fn default_layout_new_tab_correct() { - let path = default_layout_dir("default.yaml".into()); - let layout_from_yaml = LayoutFromYaml::new(&path); - let layout_template = layout_from_yaml.as_ref().unwrap(); - let tab_layout = layout_template.template.clone().insert_tab_layout(None); - let merged_layout = Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Vertical, - borderless: true, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(1)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), - _allow_exec_host_cmd: false, - })), - }, - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: None, - run: None, - }, - Layout { - direction: Direction::Vertical, - borderless: true, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(2)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), - _allow_exec_host_cmd: false, - })), - }, - ], - split_size: None, - run: None, +fn layout_with_tabs() { + let kdl_layout = r#" + layout { + tab + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + tabs: vec![(None, PaneLayout::default())], + template: Some(PaneLayout::default()), + ..Default::default() }; - assert_eq!(merged_layout, tab_layout.try_into().unwrap()); + assert_eq!(layout, expected_layout); } #[test] -fn default_strider_layout_is_ok() { - let path = default_layout_dir("strider.yaml".into()); - let layout_from_yaml = LayoutFromYaml::new(&path); - assert!(layout_from_yaml.is_ok()); +fn layout_with_nested_differing_tabs() { + let kdl_layout = r#" + layout { + tab split_direction="Vertical" { + pane + pane + pane + } + tab { + pane + pane + } + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + tabs: vec![ + ( + None, + PaneLayout { + children_split_direction: SplitDirection::Vertical, + children: vec![ + PaneLayout::default(), + PaneLayout::default(), + PaneLayout::default(), + ], + ..Default::default() + }, + ), + ( + None, + PaneLayout { + children_split_direction: SplitDirection::Horizontal, + children: vec![PaneLayout::default(), PaneLayout::default()], + ..Default::default() + }, + ), + ], + template: Some(PaneLayout::default()), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn default_disable_status_layout_is_ok() { - let path = default_layout_dir("disable-status-bar.yaml".into()); - let layout_from_yaml = LayoutFromYaml::new(&path); - assert!(layout_from_yaml.is_ok()); +fn layout_with_panes_in_different_mixed_split_sizes() { + let kdl_layout = r#" + layout { + pane size=1; + pane size="10%"; + pane; + pane size=2; + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![ + PaneLayout { + split_size: Some(SplitSize::Fixed(1)), + ..Default::default() + }, + PaneLayout { + split_size: Some(SplitSize::Percent(10)), + ..Default::default() + }, + PaneLayout { + split_size: None, + ..Default::default() + }, + PaneLayout { + split_size: Some(SplitSize::Fixed(2)), + ..Default::default() + }, + ], + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn default_disable_status_layout_has_no_tab() { - let path = default_layout_dir("disable-status-bar.yaml".into()); - let layout_from_yaml = LayoutFromYaml::new(&path); - let layout_template = layout_from_yaml.as_ref().unwrap(); - assert_eq!(layout_template.tabs.len(), 0); +fn layout_with_command_panes() { + let kdl_layout = r#" + layout { + pane command="htop" + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![PaneLayout { + run: Some(Run::Command(RunCommand { + command: PathBuf::from("htop"), + ..Default::default() + })), + ..Default::default() + }], + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn three_panes_with_tab_is_ok() { - let path = layout_test_dir("three-panes-with-tab.yaml".into()); - let layout = LayoutFromYaml::new(&path); - assert!(layout.is_ok()); +fn layout_with_command_panes_and_cwd() { + let kdl_layout = r#" + layout { + pane command="htop" cwd="/path/to/my/cwd" + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![PaneLayout { + run: Some(Run::Command(RunCommand { + command: PathBuf::from("htop"), + cwd: Some(PathBuf::from("/path/to/my/cwd")), + ..Default::default() + })), + ..Default::default() + }], + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn three_panes_with_tab_has_one_tab() { - let path = layout_test_dir("three-panes-with-tab.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.unwrap(); - assert_eq!(layout_template.tabs.len(), 1); +fn layout_with_command_panes_and_cwd_and_args() { + let kdl_layout = r#" + layout { + pane command="htop" cwd="/path/to/my/cwd" { + args "-h" "-v" + } + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![PaneLayout { + run: Some(Run::Command(RunCommand { + command: PathBuf::from("htop"), + cwd: Some(PathBuf::from("/path/to/my/cwd")), + args: vec![String::from("-h"), String::from("-v")], + ..Default::default() + })), + ..Default::default() + }], + ..Default::default() + }), + ..Default::default() + }; + assert_eq!(layout, expected_layout); } #[test] -fn three_panes_with_tab_merged_correctly() { - let path = layout_test_dir("three-panes-with-tab.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.as_ref().unwrap(); - let tab_layout = layout_template - .template - .clone() - .insert_tab_layout(Some(layout_template.tabs[0].clone())); - let merged_layout = Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(50)), - run: None, +fn layout_with_plugin_panes() { + let kdl_layout = r#" + layout { + pane { + plugin location="zellij:tab-bar" + } + pane { + plugin location="file:/path/to/my/plugin.wasm" + } + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![ + PaneLayout { + run: Some(Run::Plugin(RunPlugin { + location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), + _allow_exec_host_cmd: false, + })), + ..Default::default() }, - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(50)), - run: None, - }, - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(50)), - run: None, - }, - ], - split_size: None, - run: None, + PaneLayout { + run: Some(Run::Plugin(RunPlugin { + location: RunPluginLocation::File(PathBuf::from("/path/to/my/plugin.wasm")), + _allow_exec_host_cmd: false, + })), + ..Default::default() }, ], - split_size: None, - run: None, - }], - split_size: None, - run: None, + ..Default::default() + }), + ..Default::default() }; - assert_eq!(merged_layout, tab_layout.try_into().unwrap()); -} - -#[test] -fn three_panes_with_tab_new_tab_is_correct() { - let path = layout_test_dir("three-panes-with-tab.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.as_ref().unwrap(); - let tab_layout = layout_template.template.clone().insert_tab_layout(None); - let merged_layout = Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: None, - run: None, - }], - split_size: None, - run: None, - }; - assert_eq!(merged_layout, tab_layout.try_into().unwrap()); -} - -#[test] -fn three_panes_with_tab_and_default_plugins_is_ok() { - let path = layout_test_dir("three-panes-with-tab-and-default-plugins.yaml".into()); - let layout = LayoutFromYaml::new(&path); - assert!(layout.is_ok()); -} - -#[test] -fn three_panes_with_tab_and_default_plugins_has_one_tab() { - let path = layout_test_dir("three-panes-with-tab-and-default-plugins.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.unwrap(); - assert_eq!(layout_template.tabs.len(), 1); -} - -#[test] -fn three_panes_with_tab_and_default_plugins_merged_correctly() { - let path = layout_test_dir("three-panes-with-tab-and-default-plugins.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.as_ref().unwrap(); - let tab_layout = layout_template - .template - .clone() - .insert_tab_layout(Some(layout_template.tabs[0].clone())); - let merged_layout = Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(1)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), - _allow_exec_host_cmd: false, - })), - }, - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(50)), - run: None, - }, - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(50)), - run: None, - }, - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(50)), - run: None, - }, - ], - split_size: None, - run: None, - }, - ], - split_size: None, - run: None, - }, - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(2)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), - _allow_exec_host_cmd: false, - })), - }, - ], - split_size: None, - run: None, + assert_eq!(layout, expected_layout); +} + +#[test] +fn layout_with_borderless_panes() { + let kdl_layout = r#" + layout { + pane borderless=true + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![PaneLayout { + borderless: true, + ..Default::default() + }], + ..Default::default() + }), + ..Default::default() }; - assert_eq!(merged_layout, tab_layout.try_into().unwrap()); -} - -#[test] -fn three_panes_with_tab_and_default_plugins_new_tab_is_correct() { - let path = layout_test_dir("three-panes-with-tab-and-default-plugins.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.as_ref().unwrap(); - let tab_layout = layout_template.template.clone().insert_tab_layout(None); - let merged_layout = Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(1)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("tab-bar")), - _allow_exec_host_cmd: false, - })), - }, - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: None, - run: None, - }, - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Fixed(2)), - run: Some(Run::Plugin(RunPlugin { - location: RunPluginLocation::Zellij(PluginTag::new("status-bar")), - _allow_exec_host_cmd: false, - })), - }, - ], - split_size: None, - run: None, + assert_eq!(layout, expected_layout); +} + +#[test] +fn layout_with_focused_panes() { + let kdl_layout = r#" + layout { + pane focus=true + } + "#; + let layout = Layout::from_kdl(kdl_layout, "layout_file_name".into()).unwrap(); + let expected_layout = Layout { + template: Some(PaneLayout { + children: vec![PaneLayout { + focus: Some(true), + ..Default::default() + }], + ..Default::default() + }), + ..Default::default() }; - assert_eq!(merged_layout, tab_layout.try_into().unwrap()); -} - -#[test] -fn deeply_nested_tab_is_ok() { - let path = layout_test_dir("deeply-nested-tab-layout.yaml".into()); - let layout = LayoutFromYaml::new(&path); - assert!(layout.is_ok()); -} - -#[test] -fn deeply_nested_tab_has_one_tab() { - let path = layout_test_dir("deeply-nested-tab-layout.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.unwrap(); - assert_eq!(layout_template.tabs.len(), 1); -} - -#[test] -fn deeply_nested_tab_merged_correctly() { - let path = layout_test_dir("deeply-nested-tab-layout.yaml".into()); - let layout = LayoutFromYaml::new(&path); - let layout_template = layout.as_ref().unwrap(); - let tab_layout = layout_template - .template - .clone() - .insert_tab_layout(Some(layout_template.tabs[0].clone())); - let merged_layout = Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(21)), - run: None, - }, - Layout { - direction: Direction::Vertical, - borderless: false, - pane_name: None, - focus: None, - parts: vec![ - Layout { - direction: Direction::Horizontal, - borderless: false, - pane_name: None, - focus: None, - parts: vec![], - split_size: Some(SplitSize::Percent(22)), - |