181 lines
5.7 KiB
Rust
181 lines
5.7 KiB
Rust
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::<PopupConfig>(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::<PopupConfig>(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 names = [
|
|
"tabs",
|
|
"mode",
|
|
"pending",
|
|
"buffer",
|
|
"diagnostics",
|
|
"path",
|
|
"selections",
|
|
"count",
|
|
"language",
|
|
"lsp",
|
|
"position",
|
|
"battery",
|
|
"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 view_placeholder_is_valid_in_every_segment_and_bar() {
|
|
for name in [
|
|
"tabs",
|
|
"mode",
|
|
"pending",
|
|
"buffer",
|
|
"diagnostics",
|
|
"path",
|
|
"selections",
|
|
"count",
|
|
"language",
|
|
"lsp",
|
|
"position",
|
|
"battery",
|
|
"workspace",
|
|
] {
|
|
let options = serde_json::json!({
|
|
"left": [name],
|
|
(name): {"title": "{index}:{view}{name}:{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}:{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::<Lines>(frame).is_err());
|
|
}
|
|
}
|
|
}
|