bit-iter 1.3.1

Iterate forward or backwards over the positions of set bits in a word.
Documentation
use super::*;

#[test]
fn zero_value_handled_correctly() {
    let mut iter = BitIter::from(0u8);
    assert_eq!(iter.next(), None);
}

#[test]
fn non_zero_unsigned_value_handled_correctly() {
    let mut iter = BitIter::from(0x80010011u32);
    assert_eq!(iter.next(), Some(0));
    assert_eq!(iter.next(), Some(4));
    assert_eq!(iter.next(), Some(16));
    assert_eq!(iter.next(), Some(31));
    assert_eq!(iter.next(), None);
}

#[test]
fn non_zero_signed_value_handled_correctly() {
    let mut iter = BitIter::from(0x80010011u32 as i32);
    assert_eq!(iter.next(), Some(0));
    assert_eq!(iter.next(), Some(4));
    assert_eq!(iter.next(), Some(16));
    assert_eq!(iter.next(), Some(31));
    assert_eq!(iter.next(), None);
}

#[test]
fn size_hint_works() {
    let iter = BitIter::from(0x25);
    assert_eq!(iter.size_hint(), (3, Some(3)));

    let iter = BitIter::from(1);
    assert_eq!(iter.size_hint(), (1, Some(1)));

    let iter = BitIter::from(0);
    assert_eq!(iter.size_hint(), (0, Some(0)));
}

#[test]
fn count_works() {
    let iter = BitIter::from(0x25);
    assert_eq!(iter.count(), 3);

    let iter = BitIter::from(1);
    assert_eq!(iter.count(), 1);

    let iter = BitIter::from(0);
    assert_eq!(iter.count(), 0);
}

#[test]
fn last_works() {
    let iter = BitIter::from(0x25);
    assert_eq!(iter.last(), Some(5usize));

    let iter = BitIter::from(1);
    assert_eq!(iter.last(), Some(0usize));

    let iter = BitIter::from(0);
    assert_eq!(iter.last(), None);
}

#[test]
fn nth_works() {
    let mut iter = BitIter::from(0x5f);
    assert_eq!(iter.nth(3), Some(3usize));
    assert_eq!(iter.nth(3), None);
}

#[test]
fn max_works() {
    let iter = BitIter::from(0x25);
    assert_eq!(iter.max(), Some(5usize));

    let iter = BitIter::from(1);
    assert_eq!(iter.max(), Some(0usize));

    let iter = BitIter::from(0);
    assert_eq!(iter.max(), None);
}

#[test]
fn min_works() {
    let iter = BitIter::from(0xa4);
    assert_eq!(iter.min(), Some(2usize));

    let iter = BitIter::from(0x80);
    assert_eq!(iter.min(), Some(7usize));

    let iter = BitIter::from(0);
    assert_eq!(iter.min(), None);
}

#[test]
fn fold_works() {
    fn mul(acc: usize, x: usize) -> usize {
        acc * x
    }

    let iter = BitIter::from(0b00000000);
    let product = iter.fold(1, mul);
    assert_eq!(product, 1);

    let iter = BitIter::from(0b00000001);
    let product = iter.fold(1, mul);
    assert_eq!(product, 0);

    let iter = BitIter::from(0b10101100);
    let product = iter.fold(1, mul);
    assert_eq!(product, 2 * 3 * 5 * 7);

    let iter = BitIter::from(0b10101100);
    let product = iter.fold(0, mul);
    assert_eq!(product, 0);
}

#[test]
fn len_works() {
    let mut iter = BitIter::from(0x25);
    assert_eq!(iter.len(), 3);
    iter.next();
    assert_eq!(iter.len(), 2);
    iter.next();
    assert_eq!(iter.len(), 1);
    iter.next();
    assert_eq!(iter.len(), 0);
    iter.next();
    assert_eq!(iter.len(), 0);
}

#[test]
fn can_iterate_in_reverse_order() {
    let mut iter = BitIter::from(0x80010011u32).rev();
    assert_eq!(iter.next(), Some(31));
    assert_eq!(iter.next(), Some(16));
    assert_eq!(iter.next(), Some(4));
    assert_eq!(iter.next(), Some(0));
    assert_eq!(iter.next(), None);
}

#[test]
fn is_sorted_works() {
    let iter = BitIter::from(0x55_u8);
    assert!(iter.is_sorted());

    let iter = BitIter::from(0x5555_u16);
    assert!(iter.is_sorted());

    let iter = BitIter::from(0x55555555_u32);
    assert!(iter.is_sorted());

    let iter = BitIter::from(0x5555555555555555_u64);
    assert!(iter.is_sorted());

    let iter = BitIter::from(0x55555555555555555555555555555555_u128);
    assert!(iter.is_sorted());
}