tests: add helper for matching regex and capturing groups

This commit is contained in:
Martin von Zweigbergk 2022-03-02 16:23:30 -08:00 committed by Martin von Zweigbergk
parent 711f65303c
commit 834349a971
3 changed files with 28 additions and 24 deletions

View file

@ -40,7 +40,9 @@ jujutsu-lib = { version = "=0.2.0", path = "lib"}
maplit = "1.0.2" maplit = "1.0.2"
pest = "2.1.3" pest = "2.1.3"
pest_derive = "2.1.0" pest_derive = "2.1.0"
predicates = "2.1.1"
rand = "0.8.4" rand = "0.8.4"
regex = "1.5.4"
tempfile = "3.3.0" tempfile = "3.3.0"
textwrap = "0.14.2" textwrap = "0.14.2"
thiserror = "1.0.30" thiserror = "1.0.30"

View file

@ -14,6 +14,8 @@
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use itertools::Itertools;
use regex::Regex;
use tempfile::TempDir; use tempfile::TempDir;
pub struct TestEnvironment { pub struct TestEnvironment {
@ -52,3 +54,19 @@ impl TestEnvironment {
&self.home_dir &self.home_dir
} }
} }
pub fn capture_matches(
assert: assert_cmd::assert::Assert,
pattern: &str,
) -> (assert_cmd::assert::Assert, Vec<String>) {
let stdout_string = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let assert = assert.stdout(predicates::str::is_match(pattern).unwrap());
let matches = Regex::new(pattern)
.unwrap()
.captures(&stdout_string)
.unwrap()
.iter()
.map(|m| m.unwrap().as_str().to_owned())
.collect_vec();
(assert, matches)
}

View file

@ -12,8 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use jujutsu::testutils::TestEnvironment; use jujutsu::testutils::{capture_matches, TestEnvironment};
use regex::Regex;
#[test] #[test]
fn smoke_test() { fn smoke_test() {
@ -26,20 +25,12 @@ fn smoke_test() {
let repo_path = test_env.env_root().join("repo"); let repo_path = test_env.env_root().join("repo");
// Check the output of `jj status` right after initializing repo // Check the output of `jj status` right after initializing repo
let assert = test_env.jj_cmd(&repo_path, &["status"]).assert().success(); let assert = test_env.jj_cmd(&repo_path, &["status"]).assert().success();
let stdout_string_empty = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let output_regex = "^Parent commit: 000000000000[ ] let output_regex = "^Parent commit: 000000000000[ ]
Working copy : ([[:xdigit:]]+)[ ] Working copy : ([[:xdigit:]]+)[ ]
The working copy is clean The working copy is clean
$"; $";
assert.stdout(predicates::str::is_match(output_regex).unwrap()); let (_, matches) = capture_matches(assert, output_regex);
let wc_hex_id_empty = Regex::new(output_regex) let wc_hex_id_empty = matches[0].clone();
.unwrap()
.captures(&stdout_string_empty)
.unwrap()
.get(1)
.unwrap()
.as_str()
.to_owned();
// Write some files and check the output of `jj status` // Write some files and check the output of `jj status`
std::fs::write(repo_path.join("file1"), "file1").unwrap(); std::fs::write(repo_path.join("file1"), "file1").unwrap();
@ -47,7 +38,6 @@ $";
std::fs::write(repo_path.join("file3"), "file3").unwrap(); std::fs::write(repo_path.join("file3"), "file3").unwrap();
let assert = test_env.jj_cmd(&repo_path, &["status"]).assert().success(); let assert = test_env.jj_cmd(&repo_path, &["status"]).assert().success();
let stdout_string_non_empty = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let output_regex = "^Parent commit: 000000000000[ ] let output_regex = "^Parent commit: 000000000000[ ]
Working copy : ([[:xdigit:]]+)[ ] Working copy : ([[:xdigit:]]+)[ ]
Working copy changes: Working copy changes:
@ -55,23 +45,17 @@ A file1
A file2 A file2
A file3 A file3
$"; $";
assert.stdout(predicates::str::is_match(output_regex).unwrap()); let (_, matches) = capture_matches(assert, output_regex);
let wc_hex_id_non_empty = Regex::new(output_regex) let wc_hex_id_non_empty = matches[0].clone();
.unwrap()
.captures(&stdout_string_non_empty)
.unwrap()
.get(1)
.unwrap()
.as_str()
.to_owned();
// The working copy's id should have changed // The working copy's id should have changed
assert_ne!(wc_hex_id_non_empty, wc_hex_id_empty); assert_ne!(wc_hex_id_non_empty, wc_hex_id_empty);
// Running `jj status` again gives the same output // Running `jj status` again gives the same output
let assert = test_env.jj_cmd(&repo_path, &["status"]).assert().success(); let assert = test_env.jj_cmd(&repo_path, &["status"]).assert().success();
let stdout_string_again = String::from_utf8(assert.get_output().stdout.clone()).unwrap(); let (_, matches) = capture_matches(assert, output_regex);
assert_eq!(stdout_string_again, stdout_string_non_empty); let wc_hex_id_again = matches[0].clone();
assert_eq!(wc_hex_id_again, wc_hex_id_non_empty);
// Add a commit description // Add a commit description
let assert = test_env let assert = test_env