refactor: colocate cmd tests with their modules
Move tests from the monolithic tests.rs into #[cfg(test)] mod tests blocks in each command module. Shared test helpers live in mod.rs::test_helpers. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Executed-By: fido
This commit is contained in:
@ -2,6 +2,117 @@ use crate::ui::effect::{self, Effect};
|
||||
|
||||
use super::core::{Cmd, CmdContext};
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::command::cmd::test_helpers::*;
|
||||
use crate::model::cell::{CellKey, CellValue};
|
||||
|
||||
#[test]
|
||||
fn clear_selected_cell_produces_clear_and_dirty() {
|
||||
let mut m = two_cat_model();
|
||||
let key = CellKey::new(vec![
|
||||
("Type".to_string(), "Food".to_string()),
|
||||
("Month".to_string(), "Jan".to_string()),
|
||||
]);
|
||||
m.set_cell(key, CellValue::Number(42.0));
|
||||
let layout = make_layout(&m);
|
||||
let reg = make_registry();
|
||||
let ctx = make_ctx(&m, &layout, ®);
|
||||
let cmd = ClearCellCommand {
|
||||
key: ctx.cell_key().clone().unwrap(),
|
||||
};
|
||||
let effects = cmd.execute(&ctx);
|
||||
assert_eq!(effects.len(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn yank_cell_produces_set_yanked() {
|
||||
let mut m = two_cat_model();
|
||||
let key = CellKey::new(vec![
|
||||
("Type".to_string(), "Food".to_string()),
|
||||
("Month".to_string(), "Jan".to_string()),
|
||||
]);
|
||||
m.set_cell(key, CellValue::Number(99.0));
|
||||
let layout = make_layout(&m);
|
||||
let reg = make_registry();
|
||||
let ctx = make_ctx(&m, &layout, ®);
|
||||
let cmd = YankCell {
|
||||
key: ctx.cell_key().clone().unwrap(),
|
||||
};
|
||||
let effects = cmd.execute(&ctx);
|
||||
assert_eq!(effects.len(), 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn paste_with_yanked_value_produces_set_cell() {
|
||||
let mut m = two_cat_model();
|
||||
m.set_cell(
|
||||
CellKey::new(vec![
|
||||
("Type".into(), "Food".into()),
|
||||
("Month".into(), "Jan".into()),
|
||||
]),
|
||||
CellValue::Number(42.0),
|
||||
);
|
||||
let layout = make_layout(&m);
|
||||
let reg = make_registry();
|
||||
let yanked = Some(CellValue::Number(99.0));
|
||||
let mut ctx = make_ctx(&m, &layout, ®);
|
||||
ctx.yanked = &yanked;
|
||||
let key = CellKey::new(vec![
|
||||
("Type".into(), "Clothing".into()),
|
||||
("Month".into(), "Feb".into()),
|
||||
]);
|
||||
let cmd = PasteCell { key };
|
||||
let effects = cmd.execute(&ctx);
|
||||
assert_eq!(effects.len(), 2);
|
||||
let dbg = effects_debug(&effects);
|
||||
assert!(dbg.contains("SetCell"), "Expected SetCell, got: {dbg}");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn paste_without_yanked_value_produces_nothing() {
|
||||
let m = two_cat_model();
|
||||
let layout = make_layout(&m);
|
||||
let reg = make_registry();
|
||||
let ctx = make_ctx(&m, &layout, ®);
|
||||
let key = CellKey::new(vec![
|
||||
("Type".into(), "Food".into()),
|
||||
("Month".into(), "Jan".into()),
|
||||
]);
|
||||
let cmd = PasteCell { key };
|
||||
let effects = cmd.execute(&ctx);
|
||||
assert!(effects.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn transpose_produces_transpose_and_dirty() {
|
||||
let m = two_cat_model();
|
||||
let layout = make_layout(&m);
|
||||
let reg = make_registry();
|
||||
let ctx = make_ctx(&m, &layout, ®);
|
||||
let effects = TransposeAxes.execute(&ctx);
|
||||
assert_eq!(effects.len(), 2);
|
||||
let dbg = effects_debug(&effects);
|
||||
assert!(
|
||||
dbg.contains("TransposeAxes"),
|
||||
"Expected TransposeAxes, got: {dbg}"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn save_produces_save_effect() {
|
||||
let m = two_cat_model();
|
||||
let layout = make_layout(&m);
|
||||
let reg = make_registry();
|
||||
let ctx = make_ctx(&m, &layout, ®);
|
||||
let effects = SaveCmd.execute(&ctx);
|
||||
assert_eq!(effects.len(), 1);
|
||||
let dbg = effects_debug(&effects);
|
||||
assert!(dbg.contains("Save"), "Expected Save, got: {dbg}");
|
||||
}
|
||||
}
|
||||
|
||||
// ── Cell operations ──────────────────────────────────────────────────────────
|
||||
// All cell commands take an explicit CellKey. The interactive spec fills it
|
||||
// from ctx.cell_key(); the parser fills it from Cat/Item coordinate args.
|
||||
|
||||
Reference in New Issue
Block a user