@@ -130,6 +130,145 @@ mod tests {
130
130
assert_eq ! ( replaced, & * b( "bc" ) ) ;
131
131
}
132
132
133
+ #[ test]
134
+ fn replace_no_match ( ) {
135
+ let re = RegexBuilder :: new ( ) . build ( b ( "d" ) ) . unwrap ( ) ;
136
+ let s = b ( "abc" ) ;
137
+ let r = b ( "" ) ;
138
+ let replaced = re. replace ( & s, & r, true ) . unwrap ( ) ;
139
+ assert ! (
140
+ matches!( replaced, Cow :: Borrowed ( _) ) ,
141
+ "when there is no match, the original string should be returned"
142
+ ) ;
143
+ let replaced = replaced. into_owned ( ) ;
144
+ assert_eq ! ( replaced, & * b( "abc" ) ) ;
145
+ }
146
+
147
+ #[ test]
148
+ fn replace_with_replacement ( ) {
149
+ let re = RegexBuilder :: new ( ) . build ( b ( "b" ) ) . unwrap ( ) ;
150
+ let s = b ( "abc" ) ;
151
+ let r = b ( "d" ) ;
152
+ let replaced = re. replace ( & s, & r, true ) . unwrap ( ) ;
153
+ assert ! (
154
+ matches!( replaced, Cow :: Owned ( _) ) ,
155
+ "a replacement should give a new string"
156
+ ) ;
157
+ let replaced = replaced. into_owned ( ) ;
158
+ assert_eq ! ( replaced, & * b( "adc" ) ) ;
159
+ }
160
+
161
+ #[ test]
162
+ fn replace_first_occurrence ( ) {
163
+ let re = RegexBuilder :: new ( ) . build ( b ( "a" ) ) . unwrap ( ) ;
164
+ let s = b ( "aaa" ) ;
165
+ let r = b ( "b" ) ;
166
+ let replaced = re. replace ( & s, & r, false ) . unwrap ( ) ;
167
+ assert ! (
168
+ matches!( replaced, Cow :: Owned ( _) ) ,
169
+ "a replacement should give a new string"
170
+ ) ;
171
+ let replaced = replaced. into_owned ( ) ;
172
+ assert_eq ! ( replaced, & * b( "baa" ) ) ;
173
+ }
174
+
175
+ #[ test]
176
+ fn replace_multiple_occurrences ( ) {
177
+ let re = RegexBuilder :: new ( ) . build ( b ( "a" ) ) . unwrap ( ) ;
178
+ let s = b ( "aaa" ) ;
179
+ let r = b ( "b" ) ;
180
+ let replaced = re. replace_all ( & s, & r, false ) . unwrap ( ) ;
181
+ assert ! (
182
+ matches!( replaced, Cow :: Owned ( _) ) ,
183
+ "a replacement should give a new string"
184
+ ) ;
185
+ let replaced = replaced. into_owned ( ) ;
186
+ assert_eq ! ( replaced, & * b( "bbb" ) ) ;
187
+ }
188
+
189
+ #[ test]
190
+ fn replace_empty_string ( ) {
191
+ let re = RegexBuilder :: new ( ) . build ( b ( "" ) ) . unwrap ( ) ;
192
+ let s = b ( "abc" ) ;
193
+ let r = b ( "d" ) ;
194
+ let replaced = re. replace ( & s, & r, true ) . unwrap ( ) ;
195
+ assert ! (
196
+ matches!( replaced, Cow :: Owned ( _) ) ,
197
+ "a replacement should give a new string"
198
+ ) ;
199
+ let replaced = replaced. into_owned ( ) ;
200
+ assert_eq ! ( replaced, & * b( "dabc" ) ) ;
201
+ }
202
+
203
+ #[ test]
204
+ fn replace_empty_with_empty ( ) {
205
+ let re = RegexBuilder :: new ( ) . build ( b ( "" ) ) . unwrap ( ) ;
206
+ let s = b ( "" ) ;
207
+ let r = b ( "" ) ;
208
+ let replaced = re. replace ( & s, & r, true ) . unwrap ( ) . into_owned ( ) ;
209
+ assert_eq ! ( replaced, & * b( "" ) ) ;
210
+ }
211
+
212
+ #[ test]
213
+ fn replace_long_string ( ) {
214
+ let long_string = vec ! [ 'a' ; 1024 ] ; // Create a 1MB string filled with 'a'
215
+ let re = RegexBuilder :: new ( ) . build ( b ( "a" ) ) . unwrap ( ) ;
216
+ let r = b ( "b" ) ;
217
+ let replaced = re. replace ( & long_string, & r, false ) . unwrap ( ) ;
218
+ assert ! (
219
+ matches!( replaced, Cow :: Owned ( _) ) ,
220
+ "a replacement should give a new string"
221
+ ) ;
222
+ let replaced = replaced. into_owned ( ) ;
223
+ let mut expected = long_string. clone ( ) ;
224
+ expected[ 0 ] = 'b' ;
225
+ assert_eq ! ( replaced, expected) ;
226
+ }
227
+
228
+ #[ test]
229
+ fn replace_long_string_all ( ) {
230
+ let long_string = vec ! [ 'a' ; 1024 ] ;
231
+ let re = RegexBuilder :: new ( ) . build ( b ( "a" ) ) . unwrap ( ) ;
232
+ let r = b ( "b" ) ;
233
+ let replaced = re. replace_all ( & long_string, & r, false ) . unwrap ( ) ;
234
+ assert ! (
235
+ matches!( replaced, Cow :: Owned ( _) ) ,
236
+ "a replacement should give a new string"
237
+ ) ;
238
+ let replaced = replaced. into_owned ( ) ;
239
+ let all_b = vec ! [ 'b' ; 1024 ] ;
240
+ assert_eq ! ( replaced, all_b) ;
241
+ }
242
+
243
+ #[ test]
244
+ fn replace_long_string_all_elongating ( ) {
245
+ let long_string = vec ! [ 'a' ; 1024 ] ;
246
+ let re = RegexBuilder :: new ( ) . build ( b ( "a" ) ) . unwrap ( ) ;
247
+ let r = b ( "bx" ) ;
248
+ let replaced = re. replace_all ( & long_string, & r, false ) . unwrap ( ) ;
249
+ assert ! (
250
+ matches!( replaced, Cow :: Owned ( _) ) ,
251
+ "a replacement should give a new string"
252
+ ) ;
253
+ let replaced = replaced. into_owned ( ) ;
254
+ let mut all_bx = Vec :: new ( ) ;
255
+ for _ in long_string {
256
+ all_bx. push ( 'b' ) ;
257
+ all_bx. push ( 'x' ) ;
258
+ }
259
+ assert_eq ! ( replaced, all_bx) ;
260
+ }
261
+
262
+ #[ test]
263
+ fn replace_long_string_all_disappearing ( ) {
264
+ let long_string = vec ! [ 'a' ; 1024 ] ;
265
+ let re = RegexBuilder :: new ( ) . build ( b ( "a" ) ) . unwrap ( ) ;
266
+ let r = b ( "" ) ;
267
+ let replaced = re. replace_all ( & long_string, & r, false ) . unwrap ( ) ;
268
+ let replaced = replaced. into_owned ( ) ;
269
+ assert_eq ! ( replaced, & [ ] ) ;
270
+ }
271
+
133
272
#[ test]
134
273
fn ucp ( ) {
135
274
let re = RegexBuilder :: new ( ) . ucp ( false ) . build ( b ( r"\w" ) ) . unwrap ( ) ;
0 commit comments