sciforge 0.0.3

A comprehensive scientific computing library in pure Rust with zero dependencies
Documentation
use sciforge::benchmark::decode::decode;
use sciforge::benchmark::encode::{encode, encoded_size};
use sciforge::benchmark::engine::{BenchmarkEncodeError, bench};

#[test]
fn encode_decode_roundtrip() {
    let m = bench("roundtrip", "f64", 50, || 3 * 7);
    let size = encoded_size(&m).unwrap();
    let mut buf = vec![0u8; size];
    let written = encode(&m, &mut buf).unwrap();
    assert_eq!(written, size);
    let view = decode(&buf).unwrap();
    assert_eq!(view.experiment_name, "roundtrip");
    assert_eq!(view.precision, "f64");
    assert_eq!(view.iterations, 50);
}

#[test]
fn encode_buffer_too_small() {
    let m = bench("small", "f64", 10, || {});
    let mut buf = vec![0u8; 10];
    assert_eq!(
        encode(&m, &mut buf).unwrap_err(),
        BenchmarkEncodeError::BufferTooSmall
    );
}

#[test]
fn decode_empty() {
    assert_eq!(
        decode(&[]).unwrap_err(),
        BenchmarkEncodeError::InvalidFormat
    );
}

#[test]
fn decode_bad_magic() {
    let mut buf = vec![0u8; 200];
    buf[0..4].copy_from_slice(b"XXXX");
    assert_eq!(
        decode(&buf).unwrap_err(),
        BenchmarkEncodeError::InvalidFormat
    );
}

#[test]
fn encoded_size_matches_written() {
    let m = bench("sz", "f32", 20, || 1.0_f32.sqrt());
    let size = encoded_size(&m).unwrap();
    let mut buf = vec![0u8; size + 100];
    assert_eq!(encode(&m, &mut buf).unwrap(), size);
}

#[test]
fn roundtrip_preserves_floats() {
    let m = bench("floats", "f64", 200, || {});
    let size = encoded_size(&m).unwrap();
    let mut buf = vec![0u8; size];
    encode(&m, &mut buf).unwrap();
    let view = decode(&buf).unwrap();
    assert!((view.avg_time_ns - m.avg_time_ns).abs() < 1.0);
    assert!((view.min_time_ns - m.min_time_ns).abs() < 1.0);
    assert!((view.max_time_ns - m.max_time_ns).abs() < 1.0);
}