Skip to content

Commit 99aa031

Browse files
test: add root replacer test back
1 parent 74a0c68 commit 99aa031

File tree

3 files changed

+135
-1
lines changed

3 files changed

+135
-1
lines changed

crates/core/src/replacer.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::matcher::NodeMatch;
22
use crate::source::{Content, Edit as E};
33
use crate::Pattern;
4-
use crate::{Doc, Node};
4+
use crate::{Doc, Node, Root};
55

66
type Edit<D> = E<<D as Doc>::Source>;
77
type Underlying<S> = Vec<<S as Content>::Underlying>;
@@ -26,6 +26,12 @@ where
2626
}
2727
}
2828

29+
impl<D: Doc> Replacer<D> for Root<D> {
30+
fn generate_replacement(&self, nm: &NodeMatch<D>) -> Underlying<D::Source> {
31+
structural::gen_replacement(self, nm)
32+
}
33+
}
34+
2935
impl<D: Doc> Replacer<D> for Pattern<D> {
3036
fn generate_replacement(&self, nm: &NodeMatch<D>) -> Underlying<D::Source> {
3137
structural::gen_replacement(&self.root, nm)

crates/core/src/replacer/structural.rs

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,130 @@ fn get_meta_var_replacement<D: Doc>(
115115
};
116116
Some(replaced)
117117
}
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+
}

crates/core/src/replacer/template.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::meta_var::{split_first_meta_var, MetaVarEnv};
66
use crate::source::{Content, Doc};
77
use std::borrow::Cow;
88

9+
// TODO: this should be public
910
enum Fixer<'a, C: IndentSensitive> {
1011
// no meta_var, pure text
1112
Textual(Cow<'a, [C::Underlying]>),

0 commit comments

Comments
 (0)