blob: af634a0c579d5cc20e76a8aca1a43bb4251f97a8 [file] [log] [blame]
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -07001#![cfg_attr(feature = "pattern", feature(pattern))]
2
3extern crate rand;
4extern crate regex;
5
6// Due to macro scoping rules, this definition only applies for the modules
7// defined below. Effectively, it allows us to use the same tests for both
8// native and dynamic regexes.
9//
10// This is also used to test the various matching engines. This one exercises
11// the normal code path which automatically chooses the engine based on the
12// regex and the input. Other dynamic tests explicitly set the engine to use.
13macro_rules! regex_new {
14 ($re:expr) => {{
15 use regex::Regex;
16 Regex::new($re)
17 }};
18}
19
20macro_rules! regex {
21 ($re:expr) => {
22 regex_new!($re).unwrap()
23 };
24}
25
26macro_rules! regex_set_new {
27 ($re:expr) => {{
28 use regex::RegexSet;
29 RegexSet::new($re)
30 }};
31}
32
33macro_rules! regex_set {
34 ($res:expr) => {
35 regex_set_new!($res).unwrap()
36 };
37}
38
39// Must come before other module definitions.
40include!("macros_str.rs");
41include!("macros.rs");
42
43mod api;
44mod api_str;
45mod crazy;
46mod flags;
47mod fowler;
48mod misc;
49mod multiline;
50mod noparse;
51mod regression;
Haibo Huang1d704cd2020-11-02 18:46:32 -080052mod regression_fuzz;
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -070053mod replace;
54mod searcher;
55mod set;
56mod shortest_match;
57mod suffix_reverse;
58#[cfg(feature = "unicode")]
59mod unicode;
60#[cfg(feature = "unicode-perl")]
61mod word_boundary;
62#[cfg(feature = "unicode-perl")]
63mod word_boundary_unicode;
64
65#[test]
66fn disallow_non_utf8() {
67 assert!(regex::Regex::new(r"(?-u)\xFF").is_err());
68 assert!(regex::Regex::new(r"(?-u).").is_err());
69 assert!(regex::Regex::new(r"(?-u)[\xFF]").is_err());
70 assert!(regex::Regex::new(r"(?-u)☃").is_err());
71}
72
73#[test]
74fn disallow_octal() {
75 assert!(regex::Regex::new(r"\0").is_err());
76}
77
78#[test]
79fn allow_octal() {
80 assert!(regex::RegexBuilder::new(r"\0").octal(true).build().is_ok());
81}
82
83#[test]
84fn oibits() {
85 use regex::bytes;
Elliott Hughesffb60302021-04-01 17:11:40 -070086 use regex::{Regex, RegexBuilder, RegexSet, RegexSetBuilder};
87 use std::panic::{RefUnwindSafe, UnwindSafe};
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -070088
89 fn assert_send<T: Send>() {}
90 fn assert_sync<T: Sync>() {}
91 fn assert_unwind_safe<T: UnwindSafe>() {}
Elliott Hughesffb60302021-04-01 17:11:40 -070092 fn assert_ref_unwind_safe<T: RefUnwindSafe>() {}
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -070093
94 assert_send::<Regex>();
95 assert_sync::<Regex>();
96 assert_unwind_safe::<Regex>();
Elliott Hughesffb60302021-04-01 17:11:40 -070097 assert_ref_unwind_safe::<Regex>();
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -070098 assert_send::<RegexBuilder>();
99 assert_sync::<RegexBuilder>();
100 assert_unwind_safe::<RegexBuilder>();
Elliott Hughesffb60302021-04-01 17:11:40 -0700101 assert_ref_unwind_safe::<RegexBuilder>();
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -0700102
103 assert_send::<bytes::Regex>();
104 assert_sync::<bytes::Regex>();
105 assert_unwind_safe::<bytes::Regex>();
Elliott Hughesffb60302021-04-01 17:11:40 -0700106 assert_ref_unwind_safe::<bytes::Regex>();
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -0700107 assert_send::<bytes::RegexBuilder>();
108 assert_sync::<bytes::RegexBuilder>();
109 assert_unwind_safe::<bytes::RegexBuilder>();
Elliott Hughesffb60302021-04-01 17:11:40 -0700110 assert_ref_unwind_safe::<bytes::RegexBuilder>();
111
112 assert_send::<RegexSet>();
113 assert_sync::<RegexSet>();
114 assert_unwind_safe::<RegexSet>();
115 assert_ref_unwind_safe::<RegexSet>();
116 assert_send::<RegexSetBuilder>();
117 assert_sync::<RegexSetBuilder>();
118 assert_unwind_safe::<RegexSetBuilder>();
119 assert_ref_unwind_safe::<RegexSetBuilder>();
120
121 assert_send::<bytes::RegexSet>();
122 assert_sync::<bytes::RegexSet>();
123 assert_unwind_safe::<bytes::RegexSet>();
124 assert_ref_unwind_safe::<bytes::RegexSet>();
125 assert_send::<bytes::RegexSetBuilder>();
126 assert_sync::<bytes::RegexSetBuilder>();
127 assert_unwind_safe::<bytes::RegexSetBuilder>();
128 assert_ref_unwind_safe::<bytes::RegexSetBuilder>();
Chih-Hung Hsiehe42c5052020-04-16 10:44:21 -0700129}
130
131// See: https://github.com/rust-lang/regex/issues/568
132#[test]
133fn oibits_regression() {
134 use regex::Regex;
135 use std::panic;
136
137 let _ = panic::catch_unwind(|| Regex::new("a").unwrap());
138}
Elliott Hughesffb60302021-04-01 17:11:40 -0700139
140// See: https://github.com/rust-lang/regex/issues/750
141#[test]
142#[cfg(target_pointer_width = "64")]
143fn regex_is_reasonably_small() {
144 use std::mem::size_of;
145
146 use regex::bytes;
147 use regex::{Regex, RegexSet};
148
149 assert_eq!(16, size_of::<Regex>());
150 assert_eq!(16, size_of::<RegexSet>());
151 assert_eq!(16, size_of::<bytes::Regex>());
152 assert_eq!(16, size_of::<bytes::RegexSet>());
153}