key_set 0.1.0

KeySet representing concepts of All, None, Some(list), and AllExceptSome(list), with basic set calculations (intersection, difference, inverse).
Documentation
use key_set::KeySet;

#[test]
fn test_all() {
    let ks = KeySet::All as KeySet<i32>;

    assert_eq!(ks.intersect(&KeySet::All), KeySet::All);
    assert_eq!(ks.intersect(&KeySet::None), KeySet::None);
    assert_eq!(
        ks.intersect(&KeySet::Some(vec![1, 2, 3])),
        KeySet::Some(vec![1, 2, 3])
    );
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 2, 3])),
        KeySet::AllExceptSome(vec![1, 2, 3])
    );
}

#[test]
fn test_none() {
    let ks = KeySet::None as KeySet<i32>;

    assert_eq!(ks.intersect(&KeySet::All), KeySet::None);
    assert_eq!(ks.intersect(&KeySet::None), KeySet::None);
    assert_eq!(ks.intersect(&KeySet::Some(vec![1, 2, 3])), KeySet::None);
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 2, 3])),
        KeySet::None
    );
}

#[test]
fn test_some() {
    let ks = KeySet::Some(vec![1, 2, 3]);

    assert_eq!(ks.intersect(&KeySet::All), KeySet::Some(vec![1, 2, 3]));
    assert_eq!(ks.intersect(&KeySet::None), KeySet::None);

    assert_eq!(
        ks.intersect(&KeySet::Some(vec![1, 2])),
        KeySet::Some(vec![1, 2])
    );
    assert_eq!(
        ks.intersect(&KeySet::Some(vec![1, 2, 3])),
        KeySet::Some(vec![1, 2, 3])
    );
    assert_eq!(
        ks.intersect(&KeySet::Some(vec![1, 3, 4, 5])),
        KeySet::Some(vec![1, 3])
    );
    assert_eq!(ks.intersect(&KeySet::Some(vec![4, 5])), KeySet::None);

    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 2])),
        KeySet::Some(vec![3])
    );
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 2, 3])),
        KeySet::None
    );
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 3, 4, 5])),
        KeySet::Some(vec![2])
    );
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![4, 5])),
        KeySet::Some(vec![1, 2, 3])
    );
}

#[test]
fn test_all_except_some() {
    let ks = KeySet::AllExceptSome(vec![1, 2, 3]);

    assert_eq!(
        ks.intersect(&KeySet::All),
        KeySet::AllExceptSome(vec![1, 2, 3])
    );
    assert_eq!(ks.intersect(&KeySet::None), KeySet::None);

    assert_eq!(ks.intersect(&KeySet::Some(vec![1, 2])), KeySet::None);
    assert_eq!(ks.intersect(&KeySet::Some(vec![1, 2, 3])), KeySet::None);
    assert_eq!(
        ks.intersect(&KeySet::Some(vec![1, 3, 4, 5])),
        KeySet::Some(vec![4, 5])
    );
    assert_eq!(
        ks.intersect(&KeySet::Some(vec![4, 5])),
        KeySet::Some(vec![4, 5])
    );

    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 2])),
        KeySet::AllExceptSome(vec![1, 2, 3])
    );
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 2, 3])),
        KeySet::AllExceptSome(vec![1, 2, 3])
    );
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![1, 3, 4, 5])),
        KeySet::AllExceptSome(vec![1, 2, 3, 4, 5])
    );
    assert_eq!(
        ks.intersect(&KeySet::AllExceptSome(vec![4, 5])),
        KeySet::AllExceptSome(vec![1, 2, 3, 4, 5])
    );
}