Skip to content

Commit 6fd00e8

Browse files
完善在main.rs中的测试
1 parent 71287f0 commit 6fd00e8

File tree

1 file changed

+238
-43
lines changed

1 file changed

+238
-43
lines changed

src/main.rs

Lines changed: 238 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,3 @@
1-
#![allow(
2-
unused,
3-
clippy::filter_map_bool_then,
4-
clippy::nonminimal_bool,
5-
clippy::unnecessary_lazy_evaluations,
6-
clippy::if_same_then_else,
7-
clippy::useless_conversion
8-
)]
91
use better_comprehension::{
102
b_tree_map, b_tree_set, binary_heap, hash_map, hash_set, iterator_ref, linked_list, vec_deque,
113
vector,
@@ -21,11 +13,22 @@ fn main() {
2113
test_vec_deque();
2214
test_hash_set();
2315
test_hash_map();
24-
test_自建类型();
16+
test_custom_type();
2517
test_ref_iterator();
18+
test_pattern_matching();
19+
test_nested_comprehension();
20+
test_ownership_handling();
2621
}
2722

2823
fn test_vec() {
24+
// 简单示例
25+
{
26+
let vec_1 = vec!["AB".to_string(), "CD".to_string()];
27+
let vec: Vec<String> = vector![x.clone() for x in vec_1];
28+
assert_eq!(vec, vec!["AB".to_string(), "CD".to_string()]);
29+
}
30+
31+
// 条件返回不同值
2932
{
3033
let result = vector![
3134
[x, y] if x > y else [y, x]
@@ -45,79 +48,198 @@ fn test_vec() {
4548
[6, 6]
4649
]
4750
);
48-
println!("测试返回元组_2迭代器_有条件");
4951
}
52+
53+
// 多层循环和引用
5054
{
5155
let vec_comprehension1 = vec![("a", 1), ("b", 2), ("c", 3)];
5256
let vec_comprehension2 = vec![("a", 1), ("b", 2), ("c", 3)];
5357
let vec_comprehension3 = vec![("a", 1), ("b", 2), ("c", 3)];
5458
let _result = vector![
55-
y if x > *z else y
59+
y if x > z else y
5660
for z in &vec_comprehension3
57-
for x in vec_comprehension1.clone()
58-
for y in vec_comprehension2
61+
for x in vec_comprehension1
62+
for y in &vec_comprehension2
5963
];
60-
61-
println!("{:#?}", vec_comprehension1);
62-
// println!("{:#?}", vec_comprehension2);
63-
println!("{:#?}", vec_comprehension3);
64-
println!("{:#?}", _result);
6564
}
6665
}
6766

6867
fn test_binary_heap() {
68+
// 简单示例
6969
let vec = vec![1, 2, 3];
70-
let result = binary_heap![x for x in vec];
70+
let result = binary_heap![*x for x in vec];
7171
assert_eq!(result.into_sorted_vec(), vec![1, 2, 3]);
72+
73+
// 条件返回不同值
74+
let binary_heap = binary_heap![
75+
i if i-1 == 0 || j-2 == 0 else i+10
76+
for i in 1..=3 if i != 2
77+
for j in 1..=3 if j+i != 4];
78+
assert_eq!(binary_heap.into_sorted_vec(), vec![1, 1, 3, 13]);
7279
}
7380

7481
fn test_linked_list() {
82+
// 简单示例
7583
let vec = vec![1, 2, 3];
76-
let result = linked_list![x for x in vec];
84+
let result = linked_list![*x for x in vec];
7785
assert_eq!(result, LinkedList::from([1, 2, 3]));
86+
87+
// 过滤值
88+
let linked_list = linked_list![i*2 for i in 1..=3 if i != 2];
89+
assert_eq!(linked_list, LinkedList::from([2, 6]));
7890
}
7991

8092
fn test_b_tree_set() {
93+
// 简单示例
8194
let vec = vec![1, 2, 3];
82-
let result = b_tree_set![x for x in vec];
95+
let result = b_tree_set![*x for x in vec];
8396
assert_eq!(result, BTreeSet::from([1, 2, 3]));
97+
98+
// 条件返回不同值
99+
let b_tree_set = b_tree_set! {
100+
i if i-1 == 0 else i+10
101+
for i in 1..=3 if i != 2
102+
};
103+
assert_eq!(b_tree_set, BTreeSet::from([1, 13]));
84104
}
85105

86106
fn test_b_tree_map() {
107+
// 简单示例
87108
let vec_key = vec!["key_1", "key_2", "key_3"];
88109
let vec_value = [1, 2, 3];
89110

90-
let result = b_tree_map![x , y for y in vec_value for x in vec_key];
111+
let result = b_tree_map![*x , *y for y in vec_value for x in vec_key];
91112
assert_eq!(
92113
result,
93114
BTreeMap::from([("key_1", 3), ("key_2", 3), ("key_3", 3)])
94115
);
116+
117+
// 键值对分隔符测试
118+
let vec_key = [
119+
"key_1".to_string(),
120+
"key_2".to_string(),
121+
"key_3".to_string(),
122+
];
123+
let vec_value = [1, 2, 3];
124+
125+
// 使用冒号分隔
126+
let b_tree_map1 = b_tree_map! {
127+
key.clone() : *value
128+
for key in vec_key.iter()
129+
for value in vec_value
130+
};
131+
132+
// 使用箭头分隔
133+
let vec_key = [
134+
"key_1".to_string(),
135+
"key_2".to_string(),
136+
"key_3".to_string(),
137+
];
138+
let b_tree_map2 = b_tree_map! {
139+
key.clone() => *value
140+
for key in vec_key.iter()
141+
for value in vec_value
142+
};
143+
144+
// 使用逗号分隔
145+
let vec_key = [
146+
"key_1".to_string(),
147+
"key_2".to_string(),
148+
"key_3".to_string(),
149+
];
150+
let b_tree_map3 = b_tree_map! {
151+
key.clone() , *value
152+
for key in vec_key.iter()
153+
for value in vec_value
154+
};
155+
156+
let expected = BTreeMap::from([
157+
("key_1".to_string(), 3),
158+
("key_2".to_string(), 3),
159+
("key_3".to_string(), 3),
160+
]);
161+
162+
assert_eq!(b_tree_map1, expected);
163+
assert_eq!(b_tree_map2, expected);
164+
assert_eq!(b_tree_map3, expected);
95165
}
96166

97167
fn test_vec_deque() {
168+
// 简单示例
98169
let vec = vec![1, 2, 3];
99-
let result = vec_deque![x for x in vec];
170+
let result = vec_deque![*x for x in vec];
100171
assert_eq!(result, VecDeque::from([1, 2, 3]));
172+
173+
// 模式匹配示例
174+
#[derive(Debug, PartialEq, Eq)]
175+
struct Person {
176+
name: String,
177+
age: i32,
178+
}
179+
let people = [
180+
Person {
181+
name: "Joe".to_string(),
182+
age: 20,
183+
},
184+
Person {
185+
name: "Bob".to_string(),
186+
age: 25,
187+
},
188+
];
189+
let vec_deque = vec_deque![name.clone() for Person { name, .. } in people];
190+
assert_eq!(
191+
vec_deque,
192+
VecDeque::from(["Joe".to_string(), "Bob".to_string()])
193+
);
101194
}
102195

103196
fn test_hash_set() {
197+
// 简单示例
104198
let vec = vec![1, 2, 3];
105-
let result = hash_set![x for x in vec];
199+
let result = hash_set![*x for x in vec];
106200
assert_eq!(result, HashSet::from([1, 2, 3]));
201+
202+
// 过滤值
203+
let hash_set = hash_set![i*2 for i in 1..=3 if i != 2];
204+
assert_eq!(hash_set, HashSet::from([2, 6]));
107205
}
108206

109207
fn test_hash_map() {
208+
// 简单示例
110209
let vec_key = vec!["key_1", "key_2", "key_3"];
111210
let vec_value = [1, 2, 3];
112211

113-
let result = hash_map![x , y for y in vec_value for x in vec_key];
212+
let result = hash_map![*x , *y for y in vec_value for x in vec_key];
114213
assert_eq!(
115214
result,
116215
HashMap::from([("key_1", 3), ("key_2", 3), ("key_3", 3)])
117216
);
217+
218+
// 键值对分隔符测试
219+
let vec_key = vec![
220+
"key_1".to_string(),
221+
"key_2".to_string(),
222+
"key_3".to_string(),
223+
];
224+
let vec_value = [1, 2, 3];
225+
226+
let hash_map = hash_map! {
227+
key.clone() : *value
228+
for key in vec_key
229+
for value in vec_value
230+
};
231+
232+
assert_eq!(
233+
hash_map,
234+
HashMap::from([
235+
("key_1".to_string(), 3),
236+
("key_2".to_string(), 3),
237+
("key_3".to_string(), 3)
238+
])
239+
);
118240
}
119241

120-
fn test_自建类型() {
242+
fn test_custom_type() {
121243
#[derive(Debug, PartialEq, Eq)]
122244
struct MyType {
123245
x: i32,
@@ -127,31 +249,104 @@ fn test_自建类型() {
127249
let vec_y = vec![2, 4, 6];
128250
let vec_x = vec![1, 3, 5];
129251
let _result = vector![
130-
MyType { x, y }
252+
MyType { x: *x, y: *y }
131253
for y in vec_y
132-
for x in vec_x if y == x + 1
254+
for x in vec_x if *y == *x + 1
255+
];
256+
}
257+
258+
fn test_pattern_matching() {
259+
#[derive(Debug, PartialEq, Eq)]
260+
struct Person {
261+
name: String,
262+
age: i32,
263+
}
264+
265+
let people = [
266+
Person {
267+
name: "Joe".to_string(),
268+
age: 20,
269+
},
270+
Person {
271+
name: "Bob".to_string(),
272+
age: 25,
273+
},
274+
Person {
275+
name: "Alice".to_string(),
276+
age: 30,
277+
},
278+
];
279+
280+
// 使用模式匹配提取字段
281+
let names = vector![name.clone() for Person { name, .. } in &people];
282+
assert_eq!(
283+
names,
284+
vec!["Joe".to_string(), "Bob".to_string(), "Alice".to_string()]
285+
);
286+
287+
// 使用模式匹配和条件过滤
288+
let adult_names = vector![
289+
name.clone()
290+
for Person { name, age } in people
291+
if *age >= 25
292+
];
293+
assert_eq!(adult_names, vec!["Bob".to_string(), "Alice".to_string()]);
294+
}
295+
296+
fn test_nested_comprehension() {
297+
// 嵌套推导式示例
298+
let vec = vector![
299+
(top, bottom)
300+
for top in 1..=3 if top != 2
301+
for bottom in 4..=6 if bottom+top != 4
302+
];
303+
assert_eq!(vec, vec![(1, 4), (1, 5), (1, 6), (3, 4), (3, 5), (3, 6)]);
304+
305+
// 多层条件嵌套
306+
let vec = vector![
307+
(i, j, k)
308+
for i in 1..=2
309+
for j in 3..=4 if i+j > 4
310+
for k in 5..=6 if i+j+k > 10
311+
];
312+
assert_eq!(vec, vec![(1, 4, 6), (2, 3, 6), (2, 4, 5), (2, 4, 6)]);
313+
}
314+
315+
fn test_ownership_handling() {
316+
// 测试所有权处理
317+
let vec_1 = vec!["ABC".to_string(), "DEF".to_string()];
318+
let vec_2 = ["abc".to_string(), "def".to_string()];
319+
let vec_3 = vec![123, 456];
320+
321+
let vec = vector![
322+
(i.clone(), j.clone(), *k)
323+
for i in vec_1 if i == "ABC"
324+
for j in vec_2.iter() if j == "abc"
325+
for k in vec_3 if k == &123
133326
];
134-
println!("{:#?}", _result);
327+
328+
assert_eq!(vec, vec![("ABC".to_string(), "abc".to_string(), 123)]);
135329
}
136330

137331
fn test_ref_iterator() {
138332
let vec_1 = ["123".to_string(), "456".to_string(), "789".to_string()];
139333
let vec_2 = ["ABC".to_string(), "DEF".to_string(), "GHI".to_string()];
140334

141-
// let result = iterator_ref![x for x in vec_1 if x.contains("1") for i in 1..=9]; // 范围最外层
142-
143-
// let result2 = iterator_ref![x for i in 1..=9 for x in vec_1 if x.contains("123")]; // 范围最内层
335+
// 基于引用的迭代器推导式
336+
let mut result3 = iterator_ref![
337+
(x.clone(), y.clone()) if x.contains("1") else (y.clone(), x.clone())
338+
for x in vec_1 if x.contains("1") || x.contains("7")
339+
for _ in 1..=2
340+
for y in vec_2 if y.contains("D") || x.contains("3")
341+
];
144342

145-
let result3 = iterator_ref![
146-
(x, y)
147-
for x in vec_1 if x.contains("1") || x.contains("7")
148-
for i in 1..=9
149-
for y in vec_2 if y.contains("A") || y.contains("D") || x.contains("3")];
343+
// 验证迭代器已耗尽
344+
for _ in 0..=9 {
345+
result3.next();
346+
}
347+
assert_eq!(result3.next(), None);
150348

151-
// println!("{:#?}", result2);
152-
// for (x, y) in result3 {
153-
// println!("{:#?}", x);
154-
// println!("{:#?}", y);
155-
// println!("--------------------------------");
156-
// }
349+
// 验证原始集合未被消耗
350+
assert_eq!(vec_1.len(), 3);
351+
assert_eq!(vec_2.len(), 3);
157352
}

0 commit comments

Comments
 (0)