summaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/input/unit/layout_test.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-utils/src/input/unit/layout_test.rs')
-rw-r--r--zellij-utils/src/input/unit/layout_test.rs1738
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)),
-