11#[ cfg( test) ]
22mod example {
3+ use fp_core:: empty:: Empty ;
34 use fp_core:: foldable:: * ;
45
56 /*
@@ -20,8 +21,126 @@ mod example {
2021
2122 #[ test]
2223 fn fold_map_example ( ) {
23- let k = vec ! [ Some ( 1 as i64 ) , Some ( 2 as i64 ) , Some ( 3 as i64 ) , None ] ;
24- let result = fold_map ( k, |& opt| if let Some ( x ) = opt { x } else { 0 } ) ;
24+ let k = vec ! [ Some ( 1_i64 ) , Some ( 2_i64 ) , Some ( 3_i64 ) , None ] ;
25+ let result = fold_map ( k, |& opt| opt . unwrap_or_default ( ) ) ;
2526 assert_eq ! ( result, 6 ) ;
2627 }
28+
29+ // Additional comprehensive foldable tests
30+ #[ test]
31+ fn test_vec_reduce ( ) {
32+ let vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
33+ let result = vec. reduce ( 0 , |acc, x| acc + x) ;
34+ assert_eq ! ( result, 15 ) ;
35+ }
36+
37+ #[ test]
38+ fn test_vec_reduce_empty ( ) {
39+ let vec: Vec < i32 > = vec ! [ ] ;
40+ let result = vec. reduce ( 0 , |acc, x| acc + x) ;
41+ assert_eq ! ( result, 0 ) ;
42+ }
43+
44+ #[ test]
45+ fn test_vec_reduce_multiply ( ) {
46+ let vec = vec ! [ 1 , 2 , 3 , 4 ] ;
47+ let result = vec. reduce ( 1 , |acc, x| acc * x) ;
48+ assert_eq ! ( result, 24 ) ;
49+ }
50+
51+ #[ test]
52+ fn test_vec_reduce_string_concat ( ) {
53+ let vec = vec ! [ "hello" , " " , "world" ] ;
54+ let result = vec. reduce ( String :: new ( ) , |acc, x| acc + x) ;
55+ assert_eq ! ( result, "hello world" ) ;
56+ }
57+
58+ #[ test]
59+ fn test_vec_reduce_max ( ) {
60+ let vec = vec ! [ 5 , 2 , 8 , 1 , 9 , 3 ] ;
61+ let result = vec. reduce ( i32:: MIN , |acc, x| acc. max ( * x) ) ;
62+ assert_eq ! ( result, 9 ) ;
63+ }
64+
65+ #[ test]
66+ fn test_fold_map_sum ( ) {
67+ let vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
68+ let result: i32 = fold_map ( vec, |x| * x) ;
69+ assert_eq ! ( result, 15 ) ;
70+ }
71+
72+ #[ test]
73+ fn test_fold_map_string_concat ( ) {
74+ let vec = vec ! [ 1 , 2 , 3 ] ;
75+ let result: String = fold_map ( vec, |x| x. to_string ( ) ) ;
76+ assert_eq ! ( result, "123" ) ;
77+ }
78+
79+ #[ test]
80+ fn test_fold_map_with_transformation ( ) {
81+ let vec = vec ! [ 1 , 2 , 3 ] ;
82+ let result: i32 = fold_map ( vec, |x| x * 2 ) ;
83+ assert_eq ! ( result, 12 ) ; // 2 + 4 + 6
84+ }
85+
86+ #[ test]
87+ fn test_fold_map_empty_vec ( ) {
88+ let vec: Vec < i32 > = vec ! [ ] ;
89+ let result: i32 = fold_map ( vec, |x| * x) ;
90+ assert_eq ! ( result, i32 :: empty( ) ) ;
91+ }
92+
93+ #[ test]
94+ fn test_reduce_filter_operation ( ) {
95+ let vec = vec ! [ 1 , 2 , 3 , 4 , 5 , 6 ] ;
96+ let evens = vec. reduce ( Vec :: new ( ) , |mut acc, x| {
97+ if x % 2 == 0 {
98+ acc. push ( * x) ;
99+ }
100+ acc
101+ } ) ;
102+ assert_eq ! ( evens, vec![ 2 , 4 , 6 ] ) ;
103+ }
104+
105+ #[ test]
106+ fn test_reduce_partition ( ) {
107+ #[ derive( Debug , PartialEq ) ]
108+ struct Partitioned {
109+ evens : Vec < i32 > ,
110+ odds : Vec < i32 > ,
111+ }
112+
113+ let vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
114+ let result = vec. reduce (
115+ Partitioned {
116+ evens : vec ! [ ] ,
117+ odds : vec ! [ ] ,
118+ } ,
119+ |mut acc, x| {
120+ if x % 2 == 0 {
121+ acc. evens . push ( * x) ;
122+ } else {
123+ acc. odds . push ( * x) ;
124+ }
125+ acc
126+ } ,
127+ ) ;
128+
129+ assert_eq ! ( result. evens, vec![ 2 , 4 ] ) ;
130+ assert_eq ! ( result. odds, vec![ 1 , 3 , 5 ] ) ;
131+ }
132+
133+ #[ test]
134+ fn test_reduce_count ( ) {
135+ let vec = vec ! [ 1 , 2 , 3 , 4 , 5 ] ;
136+ let count = vec. reduce ( 0 , |acc, _| acc + 1 ) ;
137+ assert_eq ! ( count, 5 ) ;
138+ }
139+
140+ #[ test]
141+ fn test_vec_reduce_right ( ) {
142+ let vec = vec ! [ 1 , 2 , 3 , 4 ] ;
143+ let result = vec. reduce_right ( 0 , |x, acc| x + acc) ;
144+ assert_eq ! ( result, 10 ) ;
145+ }
27146}
0 commit comments