bit-string 0.3.0

A compact owned bit string type with editing, matching, and bitwise operations.
Documentation
use super::Bits;
use crate::WORD_BITS;

#[test]
fn sets_selected_bit_to_true() {
    let cases = [
        0,
        1,
        WORD_BITS - 1,
        WORD_BITS,
        WORD_BITS + 1,
        WORD_BITS * 2 - 1,
    ];

    for index in cases {
        let mut bits = [0u64; 2];

        Bits::set_bit(&mut bits, index, true);

        let word = index / WORD_BITS;
        let offset = index % WORD_BITS;

        assert_eq!(bits[word], 1u64 << offset, "index={index}");
    }
}

#[test]
fn sets_selected_bit_to_false() {
    let cases = [
        0,
        1,
        WORD_BITS - 1,
        WORD_BITS,
        WORD_BITS + 1,
        WORD_BITS * 2 - 1,
    ];

    for index in cases {
        let mut bits = [u64::MAX; 2];

        Bits::set_bit(&mut bits, index, false);

        let word = index / WORD_BITS;
        let offset = index % WORD_BITS;

        assert_eq!(bits[word] & (1u64 << offset), 0, "index={index}");
    }
}

#[test]
fn preserves_unselected_bits_when_setting_true() {
    let mut bits = [0b1010u64, 0b0101u64];

    Bits::set_bit(&mut bits, 0, true);
    Bits::set_bit(&mut bits, WORD_BITS + 1, true);

    assert_eq!(bits[0], 0b1011);
    assert_eq!(bits[1], 0b0111);
}

#[test]
fn preserves_unselected_bits_when_setting_false() {
    let mut bits = [0b1111u64, 0b1111u64];

    Bits::set_bit(&mut bits, 1, false);
    Bits::set_bit(&mut bits, WORD_BITS + 2, false);

    assert_eq!(bits[0], 0b1101);
    assert_eq!(bits[1], 0b1011);
}

#[test]
fn setting_same_value_is_idempotent() {
    let mut bits = [0u64; 2];

    Bits::set_bit(&mut bits, WORD_BITS + 3, true);
    let once = bits;

    Bits::set_bit(&mut bits, WORD_BITS + 3, true);
    assert_eq!(bits, once);

    Bits::set_bit(&mut bits, WORD_BITS + 3, false);
    let cleared = bits;

    Bits::set_bit(&mut bits, WORD_BITS + 3, false);
    assert_eq!(bits, cleared);
}