78 lines
2.9 KiB
Rust
78 lines
2.9 KiB
Rust
//! 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));
|
|
}
|