1 extern crate itertools;
2 
3 use itertools::EitherOrBoth;
4 use itertools::free::merge_join_by;
5 
6 #[test]
empty()7 fn empty() {
8     let left: Vec<u32> = vec![];
9     let right: Vec<u32> = vec![];
10     let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![];
11     let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
12         .collect::<Vec<_>>();
13     assert_eq!(expected_result, actual_result);
14 }
15 
16 #[test]
left_only()17 fn left_only() {
18     let left: Vec<u32> = vec![1,2,3];
19     let right: Vec<u32> = vec![];
20     let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
21         EitherOrBoth::Left(1),
22         EitherOrBoth::Left(2),
23         EitherOrBoth::Left(3)
24     ];
25     let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
26         .collect::<Vec<_>>();
27     assert_eq!(expected_result, actual_result);
28 }
29 
30 #[test]
right_only()31 fn right_only() {
32     let left: Vec<u32> = vec![];
33     let right: Vec<u32> = vec![1,2,3];
34     let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
35         EitherOrBoth::Right(1),
36         EitherOrBoth::Right(2),
37         EitherOrBoth::Right(3)
38     ];
39     let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
40         .collect::<Vec<_>>();
41     assert_eq!(expected_result, actual_result);
42 }
43 
44 #[test]
first_left_then_right()45 fn first_left_then_right() {
46     let left: Vec<u32> = vec![1,2,3];
47     let right: Vec<u32> = vec![4,5,6];
48     let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
49         EitherOrBoth::Left(1),
50         EitherOrBoth::Left(2),
51         EitherOrBoth::Left(3),
52         EitherOrBoth::Right(4),
53         EitherOrBoth::Right(5),
54         EitherOrBoth::Right(6)
55     ];
56     let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
57         .collect::<Vec<_>>();
58     assert_eq!(expected_result, actual_result);
59 }
60 
61 #[test]
first_right_then_left()62 fn first_right_then_left() {
63     let left: Vec<u32> = vec![4,5,6];
64     let right: Vec<u32> = vec![1,2,3];
65     let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
66         EitherOrBoth::Right(1),
67         EitherOrBoth::Right(2),
68         EitherOrBoth::Right(3),
69         EitherOrBoth::Left(4),
70         EitherOrBoth::Left(5),
71         EitherOrBoth::Left(6)
72     ];
73     let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
74         .collect::<Vec<_>>();
75     assert_eq!(expected_result, actual_result);
76 }
77 
78 #[test]
interspersed_left_and_right()79 fn interspersed_left_and_right() {
80     let left: Vec<u32> = vec![1,3,5];
81     let right: Vec<u32> = vec![2,4,6];
82     let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
83         EitherOrBoth::Left(1),
84         EitherOrBoth::Right(2),
85         EitherOrBoth::Left(3),
86         EitherOrBoth::Right(4),
87         EitherOrBoth::Left(5),
88         EitherOrBoth::Right(6)
89     ];
90     let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
91         .collect::<Vec<_>>();
92     assert_eq!(expected_result, actual_result);
93 }
94 
95 #[test]
overlapping_left_and_right()96 fn overlapping_left_and_right() {
97     let left: Vec<u32> = vec![1,3,4,6];
98     let right: Vec<u32> = vec![2,3,4,5];
99     let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
100         EitherOrBoth::Left(1),
101         EitherOrBoth::Right(2),
102         EitherOrBoth::Both(3, 3),
103         EitherOrBoth::Both(4, 4),
104         EitherOrBoth::Right(5),
105         EitherOrBoth::Left(6)
106     ];
107     let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
108         .collect::<Vec<_>>();
109     assert_eq!(expected_result, actual_result);
110 }
111