Skip to content
This repository was archived by the owner on Mar 22, 2024. It is now read-only.

Commit 11532c5

Browse files
authored
Merge pull request #2 from RustPython/gen-tests
Compile regex patterns for tests with a script
2 parents 174c932 + cc4441b commit 11532c5

File tree

7 files changed

+78
-21
lines changed

7 files changed

+78
-21
lines changed

generate_tests.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import os
2+
from pathlib import Path
3+
import re
4+
import sre_constants
5+
import sre_compile
6+
import sre_parse
7+
import json
8+
9+
m = re.search(r"const SRE_MAGIC: usize = (\d+);", open("src/constants.rs").read())
10+
sre_engine_magic = int(m.group(1))
11+
del m
12+
13+
assert sre_constants.MAGIC == sre_engine_magic
14+
15+
class CompiledPattern:
16+
@classmethod
17+
def compile(cls, pattern, flags=0):
18+
p = sre_parse.parse(pattern)
19+
code = sre_compile._code(p, flags)
20+
self = cls()
21+
self.pattern = pattern
22+
self.code = code
23+
self.flags = re.RegexFlag(flags | p.state.flags)
24+
return self
25+
26+
for k, v in re.RegexFlag.__members__.items():
27+
setattr(CompiledPattern, k, v)
28+
29+
with os.scandir("tests") as d:
30+
for f in d:
31+
path = Path(f.path)
32+
if path.suffix == ".py":
33+
pattern = eval(path.read_text(), {"re": CompiledPattern})
34+
path.with_suffix(".re").write_text(
35+
f"// {pattern.pattern!r}, flags={pattern.flags!r}\n"
36+
f"Pattern {{ code: &{json.dumps(pattern.code)}, flags: SreFlag::from_bits_truncate({int(pattern.flags)}) }}"
37+
)

src/engine.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,18 @@ pub enum StrDrive<'a> {
153153
Str(&'a str),
154154
Bytes(&'a [u8]),
155155
}
156+
157+
impl<'a> From<&'a str> for StrDrive<'a> {
158+
fn from(s: &'a str) -> Self {
159+
Self::Str(s)
160+
}
161+
}
162+
impl<'a> From<&'a [u8]> for StrDrive<'a> {
163+
fn from(b: &'a [u8]) -> Self {
164+
Self::Bytes(b)
165+
}
166+
}
167+
156168
impl<'a> StrDrive<'a> {
157169
fn offset(&self, offset: usize, skip: usize) -> usize {
158170
match *self {

src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
pub mod constants;
22
pub mod engine;
3-
#[cfg(test)]
4-
mod tests;
53

64
pub const CODESIZE: usize = 4;
75

src/tests.rs

Lines changed: 0 additions & 19 deletions
This file was deleted.

tests/lookbehind.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
re.compile(r'(?<!\.)x\b')

tests/lookbehind.re

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// '(?<!\\.)x\\b', flags=re.UNICODE
2+
Pattern { code: &[15, 4, 0, 1, 1, 5, 5, 1, 17, 46, 1, 17, 120, 6, 10, 1], flags: SreFlag::from_bits_truncate(32) }

tests/tests.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use sre_engine::constants::SreFlag;
2+
use sre_engine::engine;
3+
4+
struct Pattern {
5+
code: &'static [u32],
6+
flags: SreFlag,
7+
}
8+
9+
impl Pattern {
10+
fn state<'a>(
11+
&self,
12+
string: impl Into<engine::StrDrive<'a>>,
13+
range: std::ops::Range<usize>,
14+
) -> engine::State<'a> {
15+
engine::State::new(string.into(), range.start, range.end, self.flags, self.code)
16+
}
17+
}
18+
19+
#[test]
20+
fn test_2427() {
21+
// r'(?<!\.)x\b'
22+
let pattern = include!("lookbehind.re");
23+
let mut state = pattern.state("x", 0..usize::MAX);
24+
state = state.pymatch();
25+
assert!(state.has_matched == Some(true));
26+
}

0 commit comments

Comments
 (0)