feat: Add new system for multi-selections.

This commit is contained in:
2026-03-14 13:55:55 -04:00
parent f6f1efdf8e
commit 2e29dfc103
13 changed files with 930 additions and 63 deletions

View File

@@ -31,6 +31,7 @@ pub struct Fixtures {
pub items: Option<Vec<String>>,
pub label_key: Option<String>,
pub viewport: Option<(usize, usize)>, // (height, count)
pub multi: Option<bool>,
}
pub struct TestCase {
@@ -44,6 +45,7 @@ pub struct TestCase {
pub cursor: Option<usize>,
pub offset: Option<usize>,
pub selected: Option<String>,
pub selected_items: Option<Vec<String>>,
pub cancelled: bool,
}
@@ -89,6 +91,7 @@ impl Parse for TestModule {
items: None,
label_key: None,
viewport: None,
multi: None,
};
let mut tests = Vec::new();
@@ -120,11 +123,18 @@ impl Parse for TestModule {
fixtures.viewport = Some(parse_viewport_def(&content)?);
eat_semi(&content);
}
"multi" => {
consume_ident_or_keyword(&content)?;
content.parse::<Token![:]>()?;
let val: syn::LitBool = content.parse()?;
fixtures.multi = Some(val.value);
eat_semi(&content);
}
_ => {
return Err(syn::Error::new(
content.span(),
format!(
"unexpected field '{ident_str}', expected test, items, label_key, or viewport"
"unexpected field '{ident_str}', expected test, items, label_key, viewport, or multi"
),
));
}
@@ -163,6 +173,7 @@ fn parse_test_case(input: ParseStream) -> syn::Result<TestCase> {
cursor: None,
offset: None,
selected: None,
selected_items: None,
cancelled: false,
};
@@ -224,6 +235,10 @@ fn parse_test_case(input: ParseStream) -> syn::Result<TestCase> {
let val: LitStr = content.parse()?;
case.selected = Some(val.value());
}
"selected_items" => {
content.parse::<Token![:]>()?;
case.selected_items = Some(parse_string_list(&content)?);
}
"cancelled" => {
// Just the keyword presence means true. Optionally parse `: true`.
if content.peek(Token![:]) {