#![cfg(test)]
#![expect(clippy::unwrap_used)]
#![expect(clippy::float_cmp)]
use atomic_traits as _;
use generic_atomics::{
fetch::Add, Atomic, AtomicNumber, IntoAtomicFloat, IntoAtomicInteger, IntoAtomicNumber,
UseUpdateToAdd, UseUpdateToMax, UseUpdateToMin, UseUpdateToSub,
};
use num_primitive::{PrimitiveFloat, PrimitiveInteger, PrimitiveNumber};
use num_traits as _;
use std::sync::atomic::Ordering;
fn test_primitive_number<T: IntoAtomicNumber + PrimitiveNumber>(t: T) {
let an: AtomicNumber<_> = AtomicNumber::new(t);
assert_eq!(t, an.load(Ordering::Relaxed));
}
fn test_primitive_int<T: IntoAtomicInteger + PrimitiveInteger>(t: T) {
let one: T = T::from_u8(1).unwrap();
let an: AtomicNumber<_> = AtomicNumber::new(t);
let af = an.into_atomic_integer();
af.fetch_add(one, Ordering::Relaxed);
assert_eq!(t + one, af.load(Ordering::Relaxed));
}
fn test_primitive_float<T: IntoAtomicFloat + PrimitiveFloat>(t: T) {
let one: T = T::from_u8(1).unwrap();
let an: AtomicNumber<_> = AtomicNumber::new(t);
let af = an.into_atomic_float();
af.fetch_add_via_update(one, Ordering::Relaxed);
assert_eq!(t + one, af.load(Ordering::Relaxed));
}
#[test]
fn test() {
test_primitive_number(42.0f32);
test_primitive_number(42.0f64);
test_primitive_number(42usize);
test_primitive_number(42u8);
test_primitive_number(42i64);
test_primitive_float(42.0f32);
test_primitive_float(42.0f64);
test_primitive_int(42usize);
test_primitive_int(42u8);
test_primitive_int(42i64);
}
#[test]
fn test2() {
let fourtytwo = 42.0f64;
let one = 1f64;
let af = fourtytwo.into_atomic_float();
af.fetch_add_via_update(one, Ordering::Relaxed);
assert_eq!(fourtytwo + one, af.load(Ordering::Relaxed));
af.fetch_sub_via_update(one, Ordering::Relaxed);
assert_eq!(fourtytwo, af.load(Ordering::Relaxed));
af.fetch_max_via_update(one, Ordering::Relaxed);
assert_eq!(fourtytwo, af.load(Ordering::Relaxed));
af.fetch_min_via_update(one, Ordering::Relaxed);
assert_eq!(one, af.load(Ordering::Relaxed));
}