diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/common.rs | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/tests/common.rs b/tests/common.rs index acf562e..ba4b292 100644 --- a/tests/common.rs +++ b/tests/common.rs @@ -2,7 +2,7 @@ use pish::parse::{ Parse, - regex::{CompiledPattern, Pattern}, + regex::{CompiledPattern, Pattern, bc::BytecodeCompiledRegex}, }; pub fn test_case(_name: &str, script: &[u8], expected_output: &[u8]) { @@ -30,9 +30,28 @@ pub fn test_case(_name: &str, script: &[u8], expected_output: &[u8]) { ); } -pub fn regex(pat: &str) -> CompiledPattern { - Pattern::parse_from_bytes(pat.as_bytes()) - .expect(&format!("pattern {pat} does not parse")) +pub struct MultiTestCompiledPattern { + dfa: CompiledPattern, + vm: BytecodeCompiledRegex, +} + +impl MultiTestCompiledPattern { + pub fn matches(&self, string: impl Clone + AsRef<[u8]>) -> bool { + let dfa_result = self.dfa.matches(string.clone()); + let vm_result = self.vm.matches(string.as_ref()); + assert_eq!(dfa_result, vm_result); + dfa_result + } +} + +pub fn regex(pat: &str) -> MultiTestCompiledPattern { + let parsed = + Pattern::parse_from_bytes(pat.as_bytes()).expect(&format!("pattern {pat} does not parse")); + let dfa = parsed + .clone() .try_compile() - .expect(&format!("pattern {pat} does not compile")) + .expect(&format!("pattern {pat} does not compile to DFA")); + let vm = BytecodeCompiledRegex::try_from(parsed.clone()) + .expect(&format!("pattern {pat} does not compile to VM")); + MultiTestCompiledPattern { dfa, vm } } |
