satint 0.2.2

Saturating integer scalar wrappers for no_std Rust
Documentation
#![cfg(feature = "serde")]

use satint::{Si, Si8, Si16, Si32, Si64, Si128, Su, Su8, Su16, Su32, Su64, Su128};

fn assert_serialize<T: serde::Serialize>() {}

fn assert_deserialize<T>()
where
    T: for<'de> serde::Deserialize<'de>,
{
}

#[test]
fn concrete_aliases_implement_serde_traits() {
    assert_serialize::<Si8>();
    assert_serialize::<Si16>();
    assert_serialize::<Si32>();
    assert_serialize::<Si64>();
    assert_serialize::<Si128>();
    assert_serialize::<Su8>();
    assert_serialize::<Su16>();
    assert_serialize::<Su32>();
    assert_serialize::<Su64>();
    assert_serialize::<Su128>();

    assert_deserialize::<Si8>();
    assert_deserialize::<Si16>();
    assert_deserialize::<Si32>();
    assert_deserialize::<Si64>();
    assert_deserialize::<Si128>();
    assert_deserialize::<Su8>();
    assert_deserialize::<Su16>();
    assert_deserialize::<Su32>();
    assert_deserialize::<Su64>();
    assert_deserialize::<Su128>();
}

#[test]
fn generic_wrappers_implement_serde_traits() {
    assert_serialize::<Si<i32>>();
    assert_serialize::<Su<u32>>();
    assert_deserialize::<Si<i32>>();
    assert_deserialize::<Su<u32>>();
}

#[test]
fn round_trips_as_inner_primitive() {
    use serde_test::{Token, assert_tokens};

    assert_tokens(&Si8::new(-12), &[Token::I8(-12)]);
    assert_tokens(&Si16::new(-1234), &[Token::I16(-1234)]);
    assert_tokens(&Si32::new(-123_456), &[Token::I32(-123_456)]);
    assert_tokens(&Si64::new(-123_456_789), &[Token::I64(-123_456_789)]);

    assert_tokens(&Su8::new(200), &[Token::U8(200)]);
    assert_tokens(&Su16::new(60_000), &[Token::U16(60_000)]);
    assert_tokens(&Su32::new(3_000_000_000), &[Token::U32(3_000_000_000)]);
    assert_tokens(&Su64::new(u64::MAX), &[Token::U64(u64::MAX)]);

    assert_tokens(&Si::<i32>::new(42), &[Token::I32(42)]);
    assert_tokens(&Su::<u32>::new(42), &[Token::U32(42)]);
}