Skip to content

Commit 4ea2eb0

Browse files
使用模式匹配缩短测试中的行
1 parent 3340355 commit 4ea2eb0

File tree

1 file changed

+86
-52
lines changed

1 file changed

+86
-52
lines changed

src/eager_evaluation.rs

Lines changed: 86 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -93,46 +93,51 @@ pub(crate) fn handle_nested_loops<'a>(
9393
#[cfg(test)]
9494
mod tests {
9595
use super::*;
96+
use crate::mapping::{Mapping, MappingElse};
9697
use syn::Expr;
9798
use syn::parse_quote;
98-
99+
#[allow(unused_variables)]
99100
#[test]
100101
fn test_comprehension_parse() {
101102
// 测试基本的列表推导式解析
102103
let comprehension: VecComprehension = parse_quote! {
103104
x * 2 for x in vec![1, 2, 3]
104105
};
105-
assert!(matches!(comprehension.mapping.left_key, Expr::Binary(_)));
106-
assert!(comprehension.mapping.right_expr.is_none());
106+
let Mapping {
107+
left_key,
108+
left_value,
109+
right_expr,
110+
} = &comprehension.mapping;
111+
assert!(matches!(left_key, Expr::Binary(_)));
112+
assert!(right_expr.is_none());
107113
assert_eq!(comprehension.iter_clauses.len(), 1);
108-
assert!(matches!(
109-
comprehension.iter_clauses[0].for_in_clause.pat,
110-
syn::Pat::Ident(_)
111-
));
112-
assert!(matches!(
113-
comprehension.iter_clauses[0].for_in_clause.iterable,
114-
Expr::Macro(_)
115-
));
116-
assert!(comprehension.iter_clauses[0].if_clause.is_none());
114+
let iter_clause = &comprehension.iter_clauses[0];
115+
let pat = &iter_clause.for_in_clause.pat;
116+
let iterable = &iter_clause.for_in_clause.iterable;
117+
assert!(matches!(pat, syn::Pat::Ident(_)));
118+
assert!(matches!(iterable, Expr::Macro(_)));
119+
assert!(iter_clause.if_clause.is_none());
117120
eprintln!("Comprehension基本列表推导式测试通过");
118121

119122
// 测试带if条件的列表推导式解析
120123
let comprehension: VecComprehension = parse_quote! {
121124
x * 2 for x in 1..10 if x > 0
122125
};
123-
assert!(matches!(comprehension.mapping.left_key, Expr::Binary(_)));
124-
assert!(comprehension.mapping.right_expr.is_none());
126+
let Mapping {
127+
left_key,
128+
left_value,
129+
right_expr,
130+
} = &comprehension.mapping;
131+
assert!(matches!(left_key, Expr::Binary(_)));
132+
assert!(right_expr.is_none());
125133
assert_eq!(comprehension.iter_clauses.len(), 1);
126-
assert!(matches!(
127-
comprehension.iter_clauses[0].for_in_clause.pat,
128-
syn::Pat::Ident(_)
129-
));
130-
assert!(matches!(
131-
comprehension.iter_clauses[0].for_in_clause.iterable,
132-
Expr::Range(_)
133-
));
134-
assert!(comprehension.iter_clauses[0].if_clause.is_some());
135-
if let Some(if_clause) = &comprehension.iter_clauses[0].if_clause {
134+
let iter_clause = &comprehension.iter_clauses[0];
135+
let pat = &iter_clause.for_in_clause.pat;
136+
let iterable = &iter_clause.for_in_clause.iterable;
137+
assert!(matches!(pat, syn::Pat::Ident(_)));
138+
assert!(matches!(iterable, Expr::Range(_)));
139+
assert!(iter_clause.if_clause.is_some());
140+
if let Some(if_clause) = &iter_clause.if_clause {
136141
assert!(matches!(if_clause.conditions, syn::Expr::Binary(_)));
137142
}
138143
eprintln!("Comprehension带if条件的列表推导式测试通过");
@@ -141,11 +146,21 @@ mod tests {
141146
let comprehension: VecComprehension = parse_quote! {
142147
x * 2 if x > 0 || x < 10 && x % 2 == 0 else 0 for x in items
143148
};
144-
assert!(matches!(comprehension.mapping.left_key, Expr::Binary(_)));
145-
assert!(comprehension.mapping.right_expr.is_some());
146-
if let Some(mapping_else) = &comprehension.mapping.right_expr {
147-
assert!(matches!(mapping_else.conditions, Expr::Binary(_)));
148-
assert!(matches!(mapping_else.else_key, Expr::Lit(_)));
149+
let Mapping {
150+
left_key,
151+
left_value,
152+
right_expr,
153+
} = &comprehension.mapping;
154+
assert!(matches!(left_key, Expr::Binary(_)));
155+
assert!(right_expr.is_some());
156+
if let Some(mapping_else) = right_expr {
157+
let MappingElse {
158+
conditions,
159+
else_key,
160+
else_value,
161+
} = mapping_else;
162+
assert!(matches!(conditions, Expr::Binary(_)));
163+
assert!(matches!(else_key, Expr::Lit(_)));
149164
}
150165
assert_eq!(comprehension.iter_clauses.len(), 1);
151166
eprintln!("Comprehension带条件表达式的列表推导式测试通过");
@@ -154,23 +169,27 @@ mod tests {
154169
let comprehension: VecComprehension = parse_quote! {
155170
x + y for x in outer for y in inner
156171
};
157-
assert!(matches!(comprehension.mapping.left_key, Expr::Binary(_)));
158-
assert!(comprehension.mapping.right_expr.is_none());
172+
let Mapping {
173+
left_key,
174+
left_value,
175+
right_expr,
176+
} = &comprehension.mapping;
177+
assert!(matches!(left_key, Expr::Binary(_)));
178+
assert!(right_expr.is_none());
159179
assert_eq!(comprehension.iter_clauses.len(), 2);
180+
let first_clause = &comprehension.iter_clauses[0];
181+
let second_clause = &comprehension.iter_clauses[1];
182+
assert!(matches!(first_clause.for_in_clause.pat, syn::Pat::Ident(_)));
160183
assert!(matches!(
161-
comprehension.iter_clauses[0].for_in_clause.pat,
162-
syn::Pat::Ident(_)
163-
));
164-
assert!(matches!(
165-
comprehension.iter_clauses[0].for_in_clause.iterable,
184+
first_clause.for_in_clause.iterable,
166185
syn::Expr::Path(_)
167186
));
168187
assert!(matches!(
169-
comprehension.iter_clauses[1].for_in_clause.pat,
188+
second_clause.for_in_clause.pat,
170189
syn::Pat::Ident(_)
171190
));
172191
assert!(matches!(
173-
comprehension.iter_clauses[1].for_in_clause.iterable,
192+
second_clause.for_in_clause.iterable,
174193
syn::Expr::Path(_)
175194
));
176195
eprintln!("Comprehension多层嵌套的列表推导式测试通过");
@@ -181,39 +200,54 @@ mod tests {
181200
for x in (0..10) if x % 2 == 0
182201
for y in (0..x) if y % 3 == 0
183202
};
184-
assert!(matches!(comprehension.mapping.left_key, Expr::Array(_)));
185-
assert!(comprehension.mapping.right_expr.is_some());
186-
if let Some(mapping_else) = &comprehension.mapping.right_expr {
187-
assert!(matches!(mapping_else.conditions, Expr::Binary(_)));
188-
assert!(matches!(mapping_else.else_key, Expr::Tuple(_)));
203+
let Mapping {
204+
left_key,
205+
left_value,
206+
right_expr,
207+
} = &comprehension.mapping;
208+
assert!(matches!(left_key, Expr::Array(_)));
209+
assert!(right_expr.is_some());
210+
if let Some(mapping_else) = right_expr {
211+
let MappingElse {
212+
conditions,
213+
else_key,
214+
else_value,
215+
} = mapping_else;
216+
assert!(matches!(conditions, Expr::Binary(_)));
217+
assert!(matches!(else_key, Expr::Tuple(_)));
189218
}
190219

191220
assert_eq!(comprehension.iter_clauses.len(), 2);
221+
let first_clause = &comprehension.iter_clauses[0];
222+
let second_clause = &comprehension.iter_clauses[1];
192223
assert!(matches!(
193-
comprehension.iter_clauses[1].for_in_clause.iterable,
224+
second_clause.for_in_clause.iterable,
194225
Expr::Paren(_)
195226
));
196227
// eprintln!(
197228
// "{:#?}",
198229
// comprehension.iter_clauses[1].for_in_clause.iterable
199230
// );
200-
assert!(comprehension.iter_clauses[0].if_clause.is_some());
201-
assert!(comprehension.iter_clauses[1].if_clause.is_some());
231+
assert!(first_clause.if_clause.is_some());
232+
assert!(second_clause.if_clause.is_some());
202233

203234
eprintln!("Comprehension复杂的多层嵌套带条件的列表推导式测试通过");
204235

205236
// 测试使用复杂表达式的列表推导式解析
206237
let comprehension: VecComprehension = parse_quote! {
207238
x.method().call() for x in items.iter().filter(|i| i.is_valid())
208239
};
209-
assert!(matches!(
210-
comprehension.mapping.left_key,
211-
Expr::MethodCall(_)
212-
));
213-
assert!(comprehension.mapping.right_expr.is_none());
240+
let Mapping {
241+
left_key,
242+
left_value,
243+
right_expr,
244+
} = &comprehension.mapping;
245+
assert!(matches!(left_key, Expr::MethodCall(_)));
246+
assert!(right_expr.is_none());
214247
assert_eq!(comprehension.iter_clauses.len(), 1);
248+
let iter_clause = &comprehension.iter_clauses[0];
215249
assert!(matches!(
216-
comprehension.iter_clauses[0].for_in_clause.iterable,
250+
iter_clause.for_in_clause.iterable,
217251
Expr::MethodCall(_)
218252
));
219253
eprintln!("Comprehension使用复杂表达式的列表推导式测试通过");

0 commit comments

Comments
 (0)