@@ -115,3 +115,130 @@ fn get_meta_var_replacement<D: Doc>(
115
115
} ;
116
116
Some ( replaced)
117
117
}
118
+
119
+ #[ cfg( test) ]
120
+ mod test {
121
+ use super :: * ;
122
+ use crate :: language:: { Language , Tsx } ;
123
+ use crate :: meta_var:: MetaVarEnv ;
124
+ use crate :: { replacer:: Replacer , Root } ;
125
+ use std:: collections:: HashMap ;
126
+
127
+ fn test_pattern_replace ( replacer : & str , vars : & [ ( & str , & str ) ] , expected : & str ) {
128
+ let mut env = MetaVarEnv :: new ( ) ;
129
+ let roots: Vec < _ > = vars
130
+ . iter ( )
131
+ . map ( |( v, p) | ( v, Tsx . ast_grep ( p) . inner ) )
132
+ . collect ( ) ;
133
+ for ( var, root) in & roots {
134
+ env. insert ( var. to_string ( ) , root. root ( ) ) ;
135
+ }
136
+ let dummy = Tsx . ast_grep ( "dummy" ) ;
137
+ let node_match = NodeMatch :: new ( dummy. root ( ) , env. clone ( ) ) ;
138
+ let replacer = Root :: new ( replacer, Tsx ) ;
139
+ let replaced = replacer. generate_replacement ( & node_match) ;
140
+ let replaced = String :: from_utf8_lossy ( & replaced) ;
141
+ assert_eq ! (
142
+ replaced,
143
+ expected,
144
+ "wrong replacement {replaced} {expected} {:?}" ,
145
+ HashMap :: from( env)
146
+ ) ;
147
+ }
148
+
149
+ #[ test]
150
+ fn test_no_env ( ) {
151
+ test_pattern_replace ( "let a = 123" , & [ ] , "let a = 123" ) ;
152
+ test_pattern_replace (
153
+ "console.log('hello world'); let b = 123;" ,
154
+ & [ ] ,
155
+ "console.log('hello world'); let b = 123;" ,
156
+ ) ;
157
+ }
158
+
159
+ #[ test]
160
+ fn test_single_env ( ) {
161
+ test_pattern_replace ( "let a = $A" , & [ ( "A" , "123" ) ] , "let a = 123" ) ;
162
+ test_pattern_replace (
163
+ "console.log($HW); let b = 123;" ,
164
+ & [ ( "HW" , "'hello world'" ) ] ,
165
+ "console.log('hello world'); let b = 123;" ,
166
+ ) ;
167
+ }
168
+
169
+ #[ test]
170
+ fn test_multiple_env ( ) {
171
+ test_pattern_replace ( "let $V = $A" , & [ ( "A" , "123" ) , ( "V" , "a" ) ] , "let a = 123" ) ;
172
+ test_pattern_replace (
173
+ "console.log($HW); let $B = 123;" ,
174
+ & [ ( "HW" , "'hello world'" ) , ( "B" , "b" ) ] ,
175
+ "console.log('hello world'); let b = 123;" ,
176
+ ) ;
177
+ }
178
+
179
+ #[ test]
180
+ fn test_multiple_occurrences ( ) {
181
+ test_pattern_replace ( "let $A = $A" , & [ ( "A" , "a" ) ] , "let a = a" ) ;
182
+ test_pattern_replace ( "var $A = () => $A" , & [ ( "A" , "a" ) ] , "var a = () => a" ) ;
183
+ test_pattern_replace (
184
+ "const $A = () => { console.log($B); $A(); };" ,
185
+ & [ ( "B" , "'hello world'" ) , ( "A" , "a" ) ] ,
186
+ "const a = () => { console.log('hello world'); a(); };" ,
187
+ ) ;
188
+ }
189
+
190
+ fn test_ellipsis_replace ( replacer : & str , vars : & [ ( & str , & str ) ] , expected : & str ) {
191
+ let mut env = MetaVarEnv :: new ( ) ;
192
+ let roots: Vec < _ > = vars
193
+ . iter ( )
194
+ . map ( |( v, p) | ( v, Tsx . ast_grep ( p) . inner ) )
195
+ . collect ( ) ;
196
+ for ( var, root) in & roots {
197
+ env. insert_multi ( var. to_string ( ) , root. root ( ) . children ( ) . collect ( ) ) ;
198
+ }
199
+ let dummy = Tsx . ast_grep ( "dummy" ) ;
200
+ let node_match = NodeMatch :: new ( dummy. root ( ) , env. clone ( ) ) ;
201
+ let replacer = Root :: new ( replacer, Tsx ) ;
202
+ let replaced = replacer. generate_replacement ( & node_match) ;
203
+ let replaced = String :: from_utf8_lossy ( & replaced) ;
204
+ assert_eq ! (
205
+ replaced,
206
+ expected,
207
+ "wrong replacement {replaced} {expected} {:?}" ,
208
+ HashMap :: from( env)
209
+ ) ;
210
+ }
211
+
212
+ #[ test]
213
+ fn test_ellipsis_meta_var ( ) {
214
+ test_ellipsis_replace (
215
+ "let a = () => { $$$B }" ,
216
+ & [ ( "B" , "alert('works!')" ) ] ,
217
+ "let a = () => { alert('works!') }" ,
218
+ ) ;
219
+ test_ellipsis_replace (
220
+ "let a = () => { $$$B }" ,
221
+ & [ ( "B" , "alert('works!');console.log(123)" ) ] ,
222
+ "let a = () => { alert('works!');console.log(123) }" ,
223
+ ) ;
224
+ }
225
+
226
+ #[ test]
227
+ fn test_multi_ellipsis ( ) {
228
+ test_ellipsis_replace (
229
+ "import {$$$A, B, $$$C} from 'a'" ,
230
+ & [ ( "A" , "A" ) , ( "C" , "C" ) ] ,
231
+ "import {A, B, C} from 'a'" ,
232
+ ) ;
233
+ }
234
+
235
+ #[ test]
236
+ fn test_replace_in_string ( ) {
237
+ test_pattern_replace ( "'$A'" , & [ ( "A" , "123" ) ] , "'123'" ) ;
238
+ }
239
+
240
+ #[ test]
241
+ fn test_nested_matching_replace ( ) {
242
+ // TODO
243
+ }
244
+ }
0 commit comments