feat(command): update context and tests for registry

Update CmdContext to include registry reference.
Adjust make_ctx function signature to accept registry.
Update all tests to pass the default registry.
Ensure test contexts are constructed with registry.

Co-Authored-By: fiddlerwoaroof/git-smart-commit (bartowski/nvidia_Nemotron-Cascade-2-30B-A3B-GGUF)
This commit is contained in:
Edward Langley
2026-04-07 00:34:38 -07:00
parent 406debbc7c
commit 85ab5a3a54

View File

@ -13,6 +13,7 @@ use crate::view::{Axis, AxisEntry, GridLayout};
pub struct CmdContext<'a> { pub struct CmdContext<'a> {
pub model: &'a Model, pub model: &'a Model,
pub layout: &'a GridLayout, pub layout: &'a GridLayout,
pub registry: &'a CmdRegistry,
pub mode: &'a AppMode, pub mode: &'a AppMode,
pub selected: (usize, usize), pub selected: (usize, usize),
pub row_offset: usize, pub row_offset: usize,
@ -2849,12 +2850,13 @@ mod tests {
GridLayout::new(model, model.active_view()) GridLayout::new(model, model.active_view())
} }
fn make_ctx<'a>(model: &'a Model, layout: &'a GridLayout) -> CmdContext<'a> { fn make_ctx<'a>(model: &'a Model, layout: &'a GridLayout, registry: &'a CmdRegistry) -> CmdContext<'a> {
let view = model.active_view(); let view = model.active_view();
let (sr, sc) = view.selected; let (sr, sc) = view.selected;
CmdContext { CmdContext {
model, model,
layout, layout,
registry,
mode: &AppMode::Normal, mode: &AppMode::Normal,
selected: view.selected, selected: view.selected,
row_offset: view.row_offset, row_offset: view.row_offset,
@ -2902,7 +2904,7 @@ mod tests {
fn move_selection_down_produces_set_selected() { fn move_selection_down_produces_set_selected() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = Move { let cmd = Move {
kind: MoveKind::Relative(1, 0), kind: MoveKind::Relative(1, 0),
cursor: CursorState::from_ctx(&ctx), cursor: CursorState::from_ctx(&ctx),
@ -2917,7 +2919,7 @@ mod tests {
fn move_selection_clamps_to_bounds() { fn move_selection_clamps_to_bounds() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
// Try to move way past the end // Try to move way past the end
let cmd = Move { let cmd = Move {
kind: MoveKind::Relative(100, 100), kind: MoveKind::Relative(100, 100),
@ -2934,7 +2936,7 @@ mod tests {
let mut bufs = HashMap::new(); let mut bufs = HashMap::new();
bufs.insert("command".to_string(), "q".to_string()); bufs.insert("command".to_string(), "q".to_string());
let layout = make_layout(&m); let layout = make_layout(&m);
let mut ctx = make_ctx(&m, &layout); let reg = default_registry(); let mut ctx = make_ctx(&m, &layout, &reg);
ctx.dirty = true; ctx.dirty = true;
ctx.buffers = &bufs; ctx.buffers = &bufs;
let cmd = ExecuteCommand; let cmd = ExecuteCommand;
@ -2949,7 +2951,7 @@ mod tests {
let mut bufs = HashMap::new(); let mut bufs = HashMap::new();
bufs.insert("command".to_string(), "q".to_string()); bufs.insert("command".to_string(), "q".to_string());
let layout = make_layout(&m); let layout = make_layout(&m);
let mut ctx = make_ctx(&m, &layout); let reg = default_registry(); let mut ctx = make_ctx(&m, &layout, &reg);
ctx.buffers = &bufs; ctx.buffers = &bufs;
let cmd = ExecuteCommand; let cmd = ExecuteCommand;
let effects = cmd.execute(&ctx); let effects = cmd.execute(&ctx);
@ -2969,7 +2971,7 @@ mod tests {
]); ]);
m.set_cell(key, CellValue::Number(42.0)); m.set_cell(key, CellValue::Number(42.0));
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = ClearCellCommand { let cmd = ClearCellCommand {
key: ctx.cell_key().clone().unwrap(), key: ctx.cell_key().clone().unwrap(),
}; };
@ -2986,7 +2988,7 @@ mod tests {
]); ]);
m.set_cell(key, CellValue::Number(99.0)); m.set_cell(key, CellValue::Number(99.0));
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = YankCell { let cmd = YankCell {
key: ctx.cell_key().clone().unwrap(), key: ctx.cell_key().clone().unwrap(),
}; };
@ -2998,7 +3000,7 @@ mod tests {
fn toggle_panel_open_and_focus() { fn toggle_panel_open_and_focus() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = TogglePanelAndFocus { let cmd = TogglePanelAndFocus {
panel: effect::Panel::Formula, panel: effect::Panel::Formula,
open: true, open: true,
@ -3017,7 +3019,7 @@ mod tests {
fn toggle_panel_close_and_unfocus() { fn toggle_panel_close_and_unfocus() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = TogglePanelAndFocus { let cmd = TogglePanelAndFocus {
panel: effect::Panel::Formula, panel: effect::Panel::Formula,
open: false, open: false,
@ -3031,7 +3033,7 @@ mod tests {
fn enter_advance_moves_down() { fn enter_advance_moves_down() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = EnterAdvance { let cmd = EnterAdvance {
cursor: CursorState::from_ctx(&ctx), cursor: CursorState::from_ctx(&ctx),
}; };
@ -3048,7 +3050,7 @@ mod tests {
fn search_navigate_with_empty_query_returns_nothing() { fn search_navigate_with_empty_query_returns_nothing() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = SearchNavigate(true); let cmd = SearchNavigate(true);
let effects = cmd.execute(&ctx); let effects = cmd.execute(&ctx);
assert!(effects.is_empty()); assert!(effects.is_empty());
@ -3058,7 +3060,7 @@ mod tests {
fn enter_edit_mode_produces_editing_mode() { fn enter_edit_mode_produces_editing_mode() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = EnterEditMode { let cmd = EnterEditMode {
initial_value: String::new(), initial_value: String::new(),
}; };
@ -3072,7 +3074,7 @@ mod tests {
fn enter_tile_select_with_categories() { fn enter_tile_select_with_categories() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = EnterTileSelect; let cmd = EnterTileSelect;
let effects = cmd.execute(&ctx); let effects = cmd.execute(&ctx);
assert_eq!(effects.len(), 2); // SetTileCatIdx + ChangeMode assert_eq!(effects.len(), 2); // SetTileCatIdx + ChangeMode
@ -3089,7 +3091,7 @@ mod tests {
// select always has something to operate on. // select always has something to operate on.
let m = Model::new("Empty"); let m = Model::new("Empty");
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = EnterTileSelect; let cmd = EnterTileSelect;
let effects = cmd.execute(&ctx); let effects = cmd.execute(&ctx);
assert_eq!(effects.len(), 2); // SetTileCatIdx + ChangeMode assert_eq!(effects.len(), 2); // SetTileCatIdx + ChangeMode
@ -3099,7 +3101,7 @@ mod tests {
fn toggle_group_under_cursor_returns_empty_without_groups() { fn toggle_group_under_cursor_returns_empty_without_groups() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = ToggleGroupAtCursor { is_row: true }; let cmd = ToggleGroupAtCursor { is_row: true };
let effects = cmd.execute(&ctx); let effects = cmd.execute(&ctx);
// No groups defined, so nothing to toggle // No groups defined, so nothing to toggle
@ -3110,7 +3112,7 @@ mod tests {
fn search_or_category_add_without_query_opens_category_add() { fn search_or_category_add_without_query_opens_category_add() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = SearchOrCategoryAdd; let cmd = SearchOrCategoryAdd;
let effects = cmd.execute(&ctx); let effects = cmd.execute(&ctx);
assert_eq!(effects.len(), 2); // SetPanelOpen + ChangeMode assert_eq!(effects.len(), 2); // SetPanelOpen + ChangeMode
@ -3125,7 +3127,7 @@ mod tests {
fn cycle_panel_focus_with_no_panels_open() { fn cycle_panel_focus_with_no_panels_open() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = CyclePanelFocus { let cmd = CyclePanelFocus {
formula_open: false, formula_open: false,
category_open: false, category_open: false,
@ -3139,7 +3141,7 @@ mod tests {
fn cycle_panel_focus_with_formula_panel_open() { fn cycle_panel_focus_with_formula_panel_open() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let mut ctx = make_ctx(&m, &layout); let reg = default_registry(); let mut ctx = make_ctx(&m, &layout, &reg);
ctx.formula_panel_open = true; ctx.formula_panel_open = true;
let cmd = CyclePanelFocus { let cmd = CyclePanelFocus {
formula_open: true, formula_open: true,
@ -3167,7 +3169,7 @@ mod tests {
fn law_move_to_start_idempotent() { fn law_move_to_start_idempotent() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = Move { let cmd = Move {
kind: MoveKind::ToStart(true), kind: MoveKind::ToStart(true),
cursor: CursorState::from_ctx(&ctx), cursor: CursorState::from_ctx(&ctx),
@ -3193,7 +3195,7 @@ mod tests {
fn law_toggle_group_involution() { fn law_toggle_group_involution() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = ToggleGroupAtCursor { is_row: true }; let cmd = ToggleGroupAtCursor { is_row: true };
let first = effects_debug(&cmd.execute(&ctx)); let first = effects_debug(&cmd.execute(&ctx));
let second = effects_debug(&cmd.execute(&ctx)); let second = effects_debug(&cmd.execute(&ctx));
@ -3209,7 +3211,7 @@ mod tests {
fn law_sequence_associativity() { fn law_sequence_associativity() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let mk_a = || { let mk_a = || {
Move { Move {
@ -3259,7 +3261,7 @@ mod tests {
fn law_move_to_end_reaches_last_col() { fn law_move_to_end_reaches_last_col() {
let m = two_cat_model(); let m = two_cat_model();
let layout = make_layout(&m); let layout = make_layout(&m);
let ctx = make_ctx(&m, &layout); let reg = default_registry(); let ctx = make_ctx(&m, &layout, &reg);
let cmd = Move { let cmd = Move {
kind: MoveKind::ToEnd(false), kind: MoveKind::ToEnd(false),
cursor: CursorState::from_ctx(&ctx), cursor: CursorState::from_ctx(&ctx),