//! Controller acceptance: one indentation gesture is one draft transaction. use super::*; fn fixture(source: &str) -> App { let mut app = App::with_project(Project::empty()); app.page = Page::Text; app.source_workspace = Workspace::new( oa_core::source_project::SourceBundle { entry: "project.arcadia".into(), files: std::collections::BTreeMap::from([("project.arcadia".into(), source.into())]), }, true, ); app.show_source_file(false); app } fn indent(app: &mut App, outdent: bool) { let message = Message::SourceIndent(app.source_symbol_context(), outdent); let _ = app.update(message); } #[test] fn indentation_updates_draft_snapshot_version_and_single_undo_redo_without_model_change() { let source = "雨\r\nšŸš€\r\n"; let mut app = fixture(source); app.source_editor.perform(text_editor::Action::SelectAll); let version = app.source_version; let revision = app.source_workspace.revision(); let model = app.document.revision(); indent(&mut app, false); let after = " 雨\r\n šŸš€\r\n"; assert_eq!(app.source_editor.text(), after); assert_eq!(app.source_snapshot.as_ref(), after); assert_eq!(app.source_workspace.files["project.arcadia"].text, after); assert!(app.source_workspace.has_edits()); assert_eq!(app.source_version, version + 1); assert_eq!(app.source_workspace.revision(), revision + 1); assert_eq!(app.document.revision(), model); let _ = app.update(Message::SourceUndo); assert_eq!(app.source_editor.text(), source); assert!(!app.source_workspace.has_edits()); let _ = app.update(Message::SourceRedo); assert_eq!(app.source_editor.text(), after); assert_eq!(app.document.revision(), model); } #[test] fn stale_hidden_and_modal_indentation_is_rejected_before_navigation_invalidation() { for rejected in 0..7 { let mut app = fixture("alpha"); let mut context = app.source_symbol_context(); match rejected { 0 => context.path = "elsewhere.arcadia".into(), 1 => context.session = Id::new_v4(), 2 => app.page = Page::Home, 3 => app.busy = true, 4 => app.delete_pending = true, 5 => app.hosted.visible = true, _ => app.pending = Some(Pending::New), } let interaction = app.source_symbols.interaction; let version = app.source_version; let _ = app.update(Message::SourceIndent(context, false)); assert_eq!(app.source_editor.text(), "alpha"); assert_eq!(app.source_version, version); assert_eq!(app.source_symbols.interaction, interaction); } } #[test] fn no_op_outdent_does_not_add_history_or_increment_source_version() { let mut app = fixture("alpha"); let version = app.source_version; indent(&mut app, true); assert_eq!(app.source_version, version); assert!(!app.source_workspace.undo(false)); }