xref: /third_party/rust/crates/regex/tests/replace.rs (revision c67d6573)
1macro_rules! replace(
2    ($name:ident, $which:ident, $re:expr,
3     $search:expr, $replace:expr, $result:expr) => (
4        #[test]
5        fn $name() {
6            let re = regex!($re);
7            assert_eq!(re.$which(text!($search), $replace), text!($result));
8        }
9    );
10);
11
12replace!(first, replace, r"[0-9]", "age: 26", t!("Z"), "age: Z6");
13replace!(plus, replace, r"[0-9]+", "age: 26", t!("Z"), "age: Z");
14replace!(all, replace_all, r"[0-9]", "age: 26", t!("Z"), "age: ZZ");
15replace!(
16    groups,
17    replace,
18    r"(?-u)(\S+)\s+(\S+)",
19    "w1 w2",
20    t!("$2 $1"),
21    "w2 w1"
22);
23replace!(
24    double_dollar,
25    replace,
26    r"(?-u)(\S+)\s+(\S+)",
27    "w1 w2",
28    t!("$2 $$1"),
29    "w2 $1"
30);
31// replace!(adjacent_index, replace,
32// r"([^aeiouy])ies$", "skies", t!("$1y"), "sky");
33replace!(
34    named,
35    replace_all,
36    r"(?-u)(?P<first>\S+)\s+(?P<last>\S+)(?P<space>\s*)",
37    "w1 w2 w3 w4",
38    t!("$last $first$space"),
39    "w2 w1 w4 w3"
40);
41replace!(
42    trim,
43    replace_all,
44    "^[ \t]+|[ \t]+$",
45    " \t  trim me\t   \t",
46    t!(""),
47    "trim me"
48);
49replace!(number_hypen, replace, r"(.)(.)", "ab", t!("$1-$2"), "a-b");
50// replace!(number_underscore, replace, r"(.)(.)", "ab", t!("$1_$2"), "a_b");
51replace!(
52    simple_expand,
53    replace_all,
54    r"(?-u)(\w) (\w)",
55    "a b",
56    t!("$2 $1"),
57    "b a"
58);
59replace!(
60    literal_dollar1,
61    replace_all,
62    r"(?-u)(\w+) (\w+)",
63    "a b",
64    t!("$$1"),
65    "$1"
66);
67replace!(
68    literal_dollar2,
69    replace_all,
70    r"(?-u)(\w+) (\w+)",
71    "a b",
72    t!("$2 $$c $1"),
73    "b $c a"
74);
75replace!(
76    no_expand1,
77    replace,
78    r"(?-u)(\S+)\s+(\S+)",
79    "w1 w2",
80    no_expand!("$2 $1"),
81    "$2 $1"
82);
83replace!(
84    no_expand2,
85    replace,
86    r"(?-u)(\S+)\s+(\S+)",
87    "w1 w2",
88    no_expand!("$$1"),
89    "$$1"
90);
91use_!(Captures);
92replace!(
93    closure_returning_reference,
94    replace,
95    r"([0-9]+)",
96    "age: 26",
97    |captures: &Captures<'_>| {
98        match_text!(captures.get(1).unwrap())[0..1].to_owned()
99    },
100    "age: 2"
101);
102replace!(
103    closure_returning_value,
104    replace,
105    r"[0-9]+",
106    "age: 26",
107    |_captures: &Captures<'_>| t!("Z").to_owned(),
108    "age: Z"
109);
110
111// See https://github.com/rust-lang/regex/issues/314
112replace!(
113    match_at_start_replace_with_empty,
114    replace_all,
115    r"foo",
116    "foobar",
117    t!(""),
118    "bar"
119);
120
121// See https://github.com/rust-lang/regex/issues/393
122replace!(single_empty_match, replace, r"^", "bar", t!("foo"), "foobar");
123
124// See https://github.com/rust-lang/regex/issues/399
125replace!(
126    capture_longest_possible_name,
127    replace_all,
128    r"(.)",
129    "b",
130    t!("${1}a $1a"),
131    "ba "
132);
133
134replace!(
135    impl_string,
136    replace,
137    r"[0-9]",
138    "age: 26",
139    t!("Z".to_string()),
140    "age: Z6"
141);
142replace!(
143    impl_string_ref,
144    replace,
145    r"[0-9]",
146    "age: 26",
147    t!(&"Z".to_string()),
148    "age: Z6"
149);
150replace!(
151    impl_cow_str_borrowed,
152    replace,
153    r"[0-9]",
154    "age: 26",
155    t!(std::borrow::Cow::<'_, str>::Borrowed("Z")),
156    "age: Z6"
157);
158replace!(
159    impl_cow_str_borrowed_ref,
160    replace,
161    r"[0-9]",
162    "age: 26",
163    t!(&std::borrow::Cow::<'_, str>::Borrowed("Z")),
164    "age: Z6"
165);
166replace!(
167    impl_cow_str_owned,
168    replace,
169    r"[0-9]",
170    "age: 26",
171    t!(std::borrow::Cow::<'_, str>::Owned("Z".to_string())),
172    "age: Z6"
173);
174replace!(
175    impl_cow_str_owned_ref,
176    replace,
177    r"[0-9]",
178    "age: 26",
179    t!(&std::borrow::Cow::<'_, str>::Owned("Z".to_string())),
180    "age: Z6"
181);
182
183replace!(
184    impl_vec_u8,
185    replace,
186    r"[0-9]",
187    "age: 26",
188    bytes!(vec![b'Z']),
189    "age: Z6"
190);
191replace!(
192    impl_vec_u8_ref,
193    replace,
194    r"[0-9]",
195    "age: 26",
196    bytes!(&vec![b'Z']),
197    "age: Z6"
198);
199replace!(
200    impl_cow_slice_borrowed,
201    replace,
202    r"[0-9]",
203    "age: 26",
204    bytes!(std::borrow::Cow::<'_, [u8]>::Borrowed(&[b'Z'])),
205    "age: Z6"
206);
207replace!(
208    impl_cow_slice_borrowed_ref,
209    replace,
210    r"[0-9]",
211    "age: 26",
212    bytes!(&std::borrow::Cow::<'_, [u8]>::Borrowed(&[b'Z'])),
213    "age: Z6"
214);
215replace!(
216    impl_cow_slice_owned,
217    replace,
218    r"[0-9]",
219    "age: 26",
220    bytes!(std::borrow::Cow::<'_, [u8]>::Owned(vec![b'Z'])),
221    "age: Z6"
222);
223replace!(
224    impl_cow_slice_owned_ref,
225    replace,
226    r"[0-9]",
227    "age: 26",
228    bytes!(&std::borrow::Cow::<'_, [u8]>::Owned(vec![b'Z'])),
229    "age: Z6"
230);
231
232#[test]
233fn replacen_no_captures() {
234    let re = regex!(r"[0-9]");
235    assert_eq!(
236        re.replacen(text!("age: 1234"), 2, t!("Z")),
237        text!("age: ZZ34")
238    );
239}
240
241#[test]
242fn replacen_with_captures() {
243    let re = regex!(r"([0-9])");
244    assert_eq!(
245        re.replacen(text!("age: 1234"), 2, t!("${1}Z")),
246        text!("age: 1Z2Z34")
247    );
248}
249