vietc/engine/tests/snapshot_tests.rs

83 lines
2.3 KiB
Rust

use serde::Serialize;
use vietc_engine::{Engine, EngineEvent, InputMethod};
#[derive(Serialize)]
struct SnapshotTestCase {
input: String,
display: String,
events: Vec<EngineEvent>,
}
fn get_display(events: &[EngineEvent]) -> String {
let mut display = String::new();
for ev in events {
match ev {
EngineEvent::Flush(text) => {
if !display.ends_with(text) {
display.push_str(text);
}
}
EngineEvent::Insert(text) => display.push_str(text),
EngineEvent::Paste(text) => display.push_str(text),
EngineEvent::Replace { backspaces, insert } => {
for _ in 0..*backspaces {
display.pop();
}
display.push_str(insert);
}
EngineEvent::AutoRestore(word) => {
for _ in 0..word.len() {
display.pop();
}
display.push_str(word);
}
EngineEvent::UndoTones {
backspaces,
restored,
} => {
for _ in 0..*backspaces {
display.pop();
}
display.push_str(restored);
}
}
}
display
}
fn run_snapshot_test(inputs_json: &str, method: InputMethod) -> Vec<SnapshotTestCase> {
let inputs: Vec<String> = serde_json::from_str(inputs_json).unwrap();
let mut cases = Vec::new();
for input in inputs {
let mut engine = Engine::new(method);
let mut events = Vec::new();
for ch in input.chars() {
if let Some(event) = engine.process_key(ch) {
events.push(event);
}
}
let display = get_display(&events);
cases.push(SnapshotTestCase {
input,
display,
events,
});
}
cases
}
#[test]
fn test_telex_snapshots() {
let inputs_json = include_str!("testdata/telex_inputs.json");
let cases = run_snapshot_test(inputs_json, InputMethod::Telex);
insta::assert_yaml_snapshot!(cases);
}
#[test]
fn test_vni_snapshots() {
let inputs_json = include_str!("testdata/vni_inputs.json");
let cases = run_snapshot_test(inputs_json, InputMethod::Vni);
insta::assert_yaml_snapshot!(cases);
}