use super::*; #[test] fn popup_partial_options_keep_command_and_search_independent() { let popup: PopupConfig = serde_json::from_value(serde_json::json!({ "command": {"anchor": "top_right"} })) .unwrap(); assert_eq!(popup.command.anchor, PopupAnchor::TopRight); assert_eq!(popup.search.anchor, PopupAnchor::BottomLeft); let popup: PopupConfig = serde_json::from_value(serde_json::json!({ "command": {}, "search": {"anchor": "center_left"} })) .unwrap(); assert_eq!(popup.command.anchor, PopupAnchor::BottomLeft); assert_eq!(popup.search.anchor, PopupAnchor::CenterLeft); } #[test] fn malformed_popup_options_are_rejected_at_the_boundary() { for value in [ serde_json::json!(null), serde_json::json!([]), serde_json::json!(7), serde_json::json!({"selector": {}}), ] { assert!( serde_json::from_value::(value.clone()).is_err(), "{value}" ); } for options in [ serde_json::json!(null), serde_json::json!([]), serde_json::json!("center"), serde_json::json!({"anchor": null}), serde_json::json!({"anchor": 7}), serde_json::json!({"anchor": true}), serde_json::json!({"anchor": []}), serde_json::json!({"anchor": {}}), serde_json::json!({"anchor": "middle"}), serde_json::json!({"anchor": "TopLeft"}), serde_json::json!({"width": 72}), serde_json::json!({"anchor": "center", "callback": "run"}), ] { for mode in ["command", "search"] { let mut popup = serde_json::json!({}); popup[mode] = options.clone(); assert!( serde_json::from_value::(popup).is_err(), "{mode}: {options}" ); } } } #[derive(Deserialize)] struct Lines { #[serde(deserialize_with = "top")] top: ChromeLine, #[serde(deserialize_with = "bottom")] bottom: ChromeLine, } #[test] fn omitted_options_inherit_and_explicit_groups_replace_defaults() { let lines: Lines = serde_json::from_value(serde_json::json!({ "top": {"right": ["battery"], "tabs": {"title": "T{index}:{path}{modified}"}, "battery": {"padding": 0}}, "bottom": {"left": [], "center": ["workspace"]} })).unwrap(); assert_eq!(lines.top.left, ["tabs"]); assert_eq!(lines.top.segment("battery").padding, 0); assert!(lines.bottom.left.is_empty()); assert_eq!(lines.bottom.right, ["language", "lsp", "position"]); assert_eq!(lines.bottom.segment("workspace"), &SegmentConfig::default()); } #[test] fn both_positions_accept_all_builtins_and_custom_styles() { let defaults = ChromeLine::top(); assert_eq!(defaults.right, ["diff", "shell", "battery"]); let names = [ "tabs", "mode", "pending", "buffer", "diagnostics", "path", "selections", "count", "language", "lsp", "position", "battery", "diff", "workspace", ]; let options = serde_json::json!({ "left": names, "center": ["language"], "right": ["tabs"], "tabs": {"title": "{index}:{name}:{path}{modified}", "padding": 0}, "mode": {"leading_edge": "<", "trailing_edge": ">"}, "workspace": {"first_leading_edge": ""} }); let lines: Lines = serde_json::from_value(serde_json::json!({ "top": options, "bottom": options, })) .unwrap(); for line in [&lines.top, &lines.bottom] { assert_eq!(line.left, names); assert_eq!(line.center, ["language"]); assert_eq!(line.right, ["tabs"]); assert_eq!(line.segment("tabs").padding, 0); assert_eq!(line.segment("mode").leading_edge, "<"); assert_eq!( line.segment("workspace").first_leading_edge.as_deref(), Some("") ); } } #[test] fn comparison_placeholders_are_valid_in_every_segment_and_bar() { for name in [ "tabs", "mode", "pending", "buffer", "diagnostics", "path", "selections", "count", "language", "lsp", "position", "battery", "diff", "workspace", ] { let options = serde_json::json!({ "left": [name], (name): {"title": "{index}:{view}{name}{changes}:{path}{modified}"} }); let lines: Lines = serde_json::from_value(serde_json::json!({ "top": options, "bottom": options, })) .unwrap(); for line in [&lines.top, &lines.bottom] { assert_eq!( line.segment(name).title, "{index}:{view}{name}{changes}:{path}{modified}" ); } } } #[test] fn malformed_chrome_is_rejected_at_the_boundary() { for options in [ serde_json::json!({"left": ["bad-name"]}), serde_json::json!({"left": null}), serde_json::json!({"tabs": {"padding": 65}}), serde_json::json!({"tabs": {"padding": null}}), serde_json::json!({"tabs": {"margin": 65}}), serde_json::json!({"tabs": {"margin": -1}}), serde_json::json!({"tabs": {"margin": null}}), serde_json::json!({"tabs": {"margin": "1"}}), serde_json::json!({"tabs": {"margin": 1.5}}), serde_json::json!({"tabs": {"leading_edge": "\n"}}), serde_json::json!({"tabs": {"title": "{unknown}"}}), serde_json::json!({"tabs": {"title": "{name"}}), serde_json::json!({"tabs": {"title": "name}"}}), serde_json::json!({"tabs": {"colour": "red"}}), ] { for position in ["top", "bottom"] { let mut frame = serde_json::json!({"top": {}, "bottom": {}}); frame[position] = options.clone(); assert!(serde_json::from_value::(frame).is_err()); } } }