| 1 | use regex::Regex; |
| 2 | |
| 3 | macro_rules! regex { |
| 4 | ($pattern:expr) => { |
| 5 | regex::Regex::new($pattern).unwrap() |
| 6 | }; |
| 7 | } |
| 8 | |
| 9 | // See: https://github.com/rust-lang/regex/issues/48 |
| 10 | #[test] |
| 11 | fn invalid_regexes_no_crash() { |
| 12 | assert!(Regex::new("(*)" ).is_err()); |
| 13 | assert!(Regex::new("(?:?)" ).is_err()); |
| 14 | assert!(Regex::new("(?)" ).is_err()); |
| 15 | assert!(Regex::new("*" ).is_err()); |
| 16 | } |
| 17 | |
| 18 | // See: https://github.com/rust-lang/regex/issues/98 |
| 19 | #[test] |
| 20 | fn regression_many_repeat_stack_overflow() { |
| 21 | let re = regex!("^.{1,2500}" ); |
| 22 | assert_eq!( |
| 23 | vec![0..1], |
| 24 | re.find_iter("a" ).map(|m| m.range()).collect::<Vec<_>>() |
| 25 | ); |
| 26 | } |
| 27 | |
| 28 | // See: https://github.com/rust-lang/regex/issues/555 |
| 29 | #[test] |
| 30 | fn regression_invalid_repetition_expr() { |
| 31 | assert!(Regex::new("(?m){1,1}" ).is_err()); |
| 32 | } |
| 33 | |
| 34 | // See: https://github.com/rust-lang/regex/issues/527 |
| 35 | #[test] |
| 36 | fn regression_invalid_flags_expression() { |
| 37 | assert!(Regex::new("(((?x)))" ).is_ok()); |
| 38 | } |
| 39 | |
| 40 | // See: https://github.com/rust-lang/regex/issues/129 |
| 41 | #[test] |
| 42 | fn regression_captures_rep() { |
| 43 | let re = regex!(r"([a-f]){2}(?P<foo>[x-z])" ); |
| 44 | let caps = re.captures("abx" ).unwrap(); |
| 45 | assert_eq!(&caps["foo" ], "x" ); |
| 46 | } |
| 47 | |
| 48 | // See: https://github.com/BurntSushi/ripgrep/issues/1247 |
| 49 | #[cfg (feature = "unicode-perl" )] |
| 50 | #[test] |
| 51 | fn regression_nfa_stops1() { |
| 52 | let re = regex::bytes::Regex::new(r"\bs(?:[ab])" ).unwrap(); |
| 53 | assert_eq!(0, re.find_iter(b"s \xE4" ).count()); |
| 54 | } |
| 55 | |
| 56 | // See: https://github.com/rust-lang/regex/issues/981 |
| 57 | #[cfg (feature = "unicode" )] |
| 58 | #[test] |
| 59 | fn regression_bad_word_boundary() { |
| 60 | let re = regex!(r#"(?i:(?:\b|_)win(?:32|64|dows)?(?:\b|_))"# ); |
| 61 | let hay = "ubi-Darwin-x86_64.tar.gz" ; |
| 62 | assert!(!re.is_match(hay)); |
| 63 | let hay = "ubi-Windows-x86_64.zip" ; |
| 64 | assert!(re.is_match(hay)); |
| 65 | } |
| 66 | |
| 67 | // See: https://github.com/rust-lang/regex/issues/982 |
| 68 | #[cfg (feature = "unicode-perl" )] |
| 69 | #[test] |
| 70 | fn regression_unicode_perl_not_enabled() { |
| 71 | let pat = r"(\d+\s?(years|year|y))?\s?(\d+\s?(months|month|m))?\s?(\d+\s?(weeks|week|w))?\s?(\d+\s?(days|day|d))?\s?(\d+\s?(hours|hour|h))?" ; |
| 72 | assert!(Regex::new(pat).is_ok()); |
| 73 | } |
| 74 | |
| 75 | // See: https://github.com/rust-lang/regex/issues/995 |
| 76 | #[test] |
| 77 | fn regression_big_regex_overflow() { |
| 78 | let pat = r" {2147483516}{2147483416}{5}" ; |
| 79 | assert!(Regex::new(pat).is_err()); |
| 80 | } |
| 81 | |
| 82 | // See: https://github.com/rust-lang/regex/issues/999 |
| 83 | #[test] |
| 84 | fn regression_complete_literals_suffix_incorrect() { |
| 85 | let needles = vec![ |
| 86 | "aA" , "bA" , "cA" , "dA" , "eA" , "fA" , "gA" , "hA" , "iA" , "jA" , "kA" , |
| 87 | "lA" , "mA" , "nA" , "oA" , "pA" , "qA" , "rA" , "sA" , "tA" , "uA" , "vA" , |
| 88 | "wA" , "xA" , "yA" , "zA" , |
| 89 | ]; |
| 90 | let pattern = needles.join("|" ); |
| 91 | let re = regex!(&pattern); |
| 92 | let hay = "FUBAR" ; |
| 93 | assert_eq!(0, re.find_iter(hay).count()); |
| 94 | } |
| 95 | |