merge_join.rs 3.2 KB

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