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