snowflake-gen 0.1.0

A configurable Snowflake ID generator with custom bit layouts, thread-local global generation, and ID decomposition
Documentation
use super::*;
use crate::error::SnowflakeError;
use crate::layout::BitLayout;

#[test]
fn machine_id_out_of_range() {
    let err = SnowflakeIdGenerator::new(32, 0).unwrap_err();
    assert!(matches!(err, SnowflakeError::MachineIdOutOfRange { .. }));
}

#[test]
fn monotonicity() {
    let mut idgen = SnowflakeIdGenerator::new(1, 1).unwrap();
    let mut prev = idgen.generate().unwrap();
    for _ in 0..10_000 {
        let next = idgen.generate().unwrap();
        assert!(next > prev);
        prev = next;
    }
}

#[test]
fn round_trip() {
    let mut idgen = SnowflakeIdGenerator::new(5, 11).unwrap();
    let id = idgen.generate().unwrap();
    let parts = idgen.decompose(id);
    assert_eq!(parts.machine_id, 5);
    assert_eq!(parts.node_id, 11);
}

#[test]
fn decompose_custom_layout() {
    let layout = BitLayout::new(38, 8, 7, 10).unwrap();
    let mut idgen = SnowflakeIdGenerator::with_layout(100, 60, layout).unwrap();
    let id = idgen.generate().unwrap();
    let parts = idgen.decompose(id);

    assert_eq!(parts.machine_id, 100);
    assert_eq!(parts.node_id, 60);
}