aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJonas Maier <jonas@x77.dev>2026-06-05 21:22:44 +0200
committerJonas Maier <jonas@x77.dev>2026-06-05 21:22:44 +0200
commit05f3f381d0066b2e6116470f4e6251ae191aaefe (patch)
tree063d31bdc10e25a9e97d15cdaddb625a9fcd199f /tests
parent65013cb7441dcd56d362613e1ebc469756613b24 (diff)
downloadpish-05f3f381d0066b2e6116470f4e6251ae191aaefe.tar.gz
regex compiler compiles
Diffstat (limited to 'tests')
-rw-r--r--tests/common.rs29
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 }
}