extern crate itertools;

use itertools::EitherOrBoth;
use itertools::free::merge_join_by;

#[test]
fn empty() {
    let left: Vec<u32> = vec![];
    let right: Vec<u32> = vec![];
    let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![];
    let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
        .collect::<Vec<_>>();
    assert_eq!(expected_result, actual_result);
}

#[test]
fn left_only() {
    let left: Vec<u32> = vec![1,2,3];
    let right: Vec<u32> = vec![];
    let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
        EitherOrBoth::Left(1),
        EitherOrBoth::Left(2),
        EitherOrBoth::Left(3)
    ];
    let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
        .collect::<Vec<_>>();
    assert_eq!(expected_result, actual_result);
}

#[test]
fn right_only() {
    let left: Vec<u32> = vec![];
    let right: Vec<u32> = vec![1,2,3];
    let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
        EitherOrBoth::Right(1),
        EitherOrBoth::Right(2),
        EitherOrBoth::Right(3)
    ];
    let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
        .collect::<Vec<_>>();
    assert_eq!(expected_result, actual_result);
}

#[test]
fn first_left_then_right() {
    let left: Vec<u32> = vec![1,2,3];
    let right: Vec<u32> = vec![4,5,6];
    let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
        EitherOrBoth::Left(1),
        EitherOrBoth::Left(2),
        EitherOrBoth::Left(3),
        EitherOrBoth::Right(4),
        EitherOrBoth::Right(5),
        EitherOrBoth::Right(6)
    ];
    let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
        .collect::<Vec<_>>();
    assert_eq!(expected_result, actual_result);
}

#[test]
fn first_right_then_left() {
    let left: Vec<u32> = vec![4,5,6];
    let right: Vec<u32> = vec![1,2,3];
    let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
        EitherOrBoth::Right(1),
        EitherOrBoth::Right(2),
        EitherOrBoth::Right(3),
        EitherOrBoth::Left(4),
        EitherOrBoth::Left(5),
        EitherOrBoth::Left(6)
    ];
    let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
        .collect::<Vec<_>>();
    assert_eq!(expected_result, actual_result);
}

#[test]
fn interspersed_left_and_right() {
    let left: Vec<u32> = vec![1,3,5];
    let right: Vec<u32> = vec![2,4,6];
    let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
        EitherOrBoth::Left(1),
        EitherOrBoth::Right(2),
        EitherOrBoth::Left(3),
        EitherOrBoth::Right(4),
        EitherOrBoth::Left(5),
        EitherOrBoth::Right(6)
    ];
    let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
        .collect::<Vec<_>>();
    assert_eq!(expected_result, actual_result);
}

#[test]
fn overlapping_left_and_right() {
    let left: Vec<u32> = vec![1,3,4,6];
    let right: Vec<u32> = vec![2,3,4,5];
    let expected_result: Vec<EitherOrBoth<u32, u32>> = vec![
        EitherOrBoth::Left(1),
        EitherOrBoth::Right(2),
        EitherOrBoth::Both(3, 3),
        EitherOrBoth::Both(4, 4),
        EitherOrBoth::Right(5),
        EitherOrBoth::Left(6)
    ];
    let actual_result = merge_join_by(left, right, |l, r| l.cmp(r))
        .collect::<Vec<_>>();
    assert_eq!(expected_result, actual_result);
}
