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