use std::io::{BufRead, BufReader}; use std::process::{Command, Stdio}; fn do_select_lines(seq: &str) -> Vec { let seq = seq.replace(' ', ""); let script_path = "tests/test_selector.rb"; let mut cmd = Command::new("ruby"); let mut child = cmd .args(vec![script_path, &seq]) .stdout(Stdio::piped()) .stderr(Stdio::inherit()) .spawn() .unwrap(); let stdout = child.stdout.as_mut().unwrap(); let mut out_str = Vec::::new(); let reader = BufReader::new(stdout); reader .lines() .filter_map(|line| line.ok()) .for_each(|line| { println!("{}", line); out_str.push(line); }); let status = child.wait().unwrap(); if !status.success() { panic!("執行選擇器失敗:{}", status); }; out_str } fn do_select(seq: &str) -> String { let res = do_select_lines(seq); res.join("\n") } #[test] fn test_nevigation() { assert_eq!("12-g", do_select("k\r")); assert_eq!("2-b", do_select("j\r")); assert_eq!("4-c", do_select("jkkkjjjkkkkjjjjj\r")); assert_eq!( vec!["d", "10-f"], do_select_lines("5\r p jkkkjjjkkkkjjjjj\r") ); assert_eq!("12-g", do_select("99\r\r")); assert_eq!( vec!["e", "e", "10-f", "8-e"], do_select_lines("/8-\r p np jjkA n\r") ); assert_eq!( vec!["c", "12-g", "b", "12-g"], do_select_lines("4\rp /2-\rA np n\r") ); } #[test] fn test_range() { assert_eq!( vec![ "4-c", "range print b", "range print c", "====", "range print c", "range print d", "range print e", "range print f", "====", "b", "c", "d", ], do_select_lines("jjA v 3\rp \rA\rAA l \rA\r kkkp \rA\r l vkkv /2\rnP") ); } #[test] fn test_deletion() { assert_eq!( vec![ "delete b", "delete e", "range delete c", "range delete d", "range delete f", "a", "g" ], do_select_lines("jd jjd v /4\rd P") ); }