futuresdr 0.0.39

An Experimental Async SDR Runtime for Heterogeneous Architectures.
Documentation
use anyhow::Result;
use futuresdr::blocks::Apply;
use futuresdr::blocks::MessageCopy;
use futuresdr::prelude::*;
use futuresdr::runtime::mocker::Mocker;
use futuresdr::runtime::mocker::Reader;
use futuresdr::runtime::mocker::Writer;
use rand::Rng;
use rand::distr::Uniform;

#[test]
fn multi_input_mock() {
    let input: Vec<u32> = rand::rng()
        .sample_iter(Uniform::<u32>::new(0, 1024).unwrap())
        .take(128)
        .collect();

    let block: Apply<_, _, _, Reader<_>, Writer<_>> = Apply::new(|x: &u32| x + 1);

    let mut mocker = Mocker::new(block);
    mocker.input().set(input[..64].to_vec());
    mocker.output().reserve(128);
    mocker.run();
    mocker.input().set(input[64..].to_vec());
    mocker.run();
    let (output, _) = mocker.output().get();

    assert_eq!(input.len(), output.len());
    for (a, b) in input.iter().zip(output.iter()) {
        assert_eq!(a + 1, *b);
    }
}

#[test]
fn tags_through_mock() -> Result<()> {
    let noop: Apply<_, _, _, Reader<_>, Writer<_>> = Apply::new(|x: &f32| *x);

    let mut mock = Mocker::new(noop);
    let input = vec![0.0_f32; 1024];
    let tags = vec![
        ItemTag {
            index: 0,
            tag: Tag::Id(0),
        },
        ItemTag {
            index: 256,
            tag: Tag::Id(256),
        },
        ItemTag {
            index: 555,
            tag: Tag::Id(555),
        },
    ];
    mock.init();
    mock.output().reserve(input.len() * 2);
    mock.input().set(input.clone());
    mock.run();

    let (out_buffer, out_tags) = mock.output().get();
    assert_eq!(out_buffer.len(), 1024);
    assert_eq!(out_tags.len(), 0);

    mock.input().set_with_tags(input, tags.clone());
    mock.run();
    mock.deinit();

    let (out_buffer, out_tags) = mock.output().get();
    assert_eq!(out_buffer.len(), 2048);
    assert_eq!(out_tags.len(), 3);

    for (i, tag) in tags.iter().enumerate() {
        assert_eq!(out_tags[i].index, tag.index + 1024);
        let Tag::Id(tag_id) = tag.tag else {
            unreachable!()
        };
        assert!(matches!(out_tags[i].tag, Tag::Id(t) if t == tag_id));
    }

    let (out_buffer, out_tags) = mock.output().take();
    assert_eq!(out_buffer.len(), 2048);
    assert_eq!(out_tags.len(), 3);

    let (out_buffer, out_tags) = mock.output().get();
    assert_eq!(out_buffer.len(), 0);
    assert_eq!(out_tags.len(), 0);

    Ok(())
}

#[test]
fn mock_pmts() -> Result<()> {
    let copy = MessageCopy;

    let mut mock = Mocker::new(copy);
    mock.init();

    let ret = mock.post("in", Pmt::Usize(123));
    assert_eq!(ret, Ok(Pmt::Ok));
    mock.run();

    let pmts = mock.take_messages();
    assert_eq!(pmts, vec![vec![Pmt::Usize(123)]]);

    Ok(())
}