1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
use std::fs::File; use std::io::{ BufReader, BufWriter, Stdout, StdoutLock, self }; use std::io::prelude::*; use anyhow::Result; use assert_cmd::prelude::*; use predicates::prelude::*; use std::process::Command; use tempfile::NamedTempFile; pub fn find_matches(reader: BufReader<File>, pattern: &str) -> Result<()> { reader.lines() .map(|l| { l.unwrap() }) .filter(|line| { line.contains(pattern) }).for_each(|line| { let stdout: Stdout = io::stdout(); let handle: StdoutLock = stdout.lock(); let mut writer: BufWriter<StdoutLock> = BufWriter::new(handle); writeln!(writer, "{}", line).unwrap(); }); Ok(()) } #[test] fn find_a_match() -> Result<()>{ let mut file = NamedTempFile::new()?; writeln!(file, "A test\nActual content\nMore content\nAnother test\n")?; let mut cmd = Command::cargo_bin("grrs")?; cmd.arg("test").arg(file.path()); cmd.assert() .success() .stdout(predicate::str::contains("test\nAnother test")); Ok(()) }