#![cfg(all(feature = "node-boxed", feature = "node-sum"))]
use dasp_graph::{node, Buffer, Input, Node, NodeData};
type BoxedNode = dasp_graph::BoxedNode;
fn src_node(_inputs: &[Input], output: &mut [Buffer]) {
for o in output {
o.iter_mut().for_each(|s| *s = 0.1);
}
}
#[test]
fn test_sum() {
type Graph = petgraph::Graph<NodeData<BoxedNode>, (), petgraph::Directed, u32>;
type Processor = dasp_graph::Processor<Graph>;
let max_nodes = 6;
let max_edges = 5;
let mut g = Graph::with_capacity(max_nodes, max_edges);
let mut p = Processor::with_capacity(max_nodes);
let src_node_ptr = src_node as fn(&[Input], &mut [Buffer]);
let src_a = g.add_node(NodeData::new1(BoxedNode::new(src_node_ptr)));
let src_b = g.add_node(NodeData::new1(BoxedNode::new(src_node_ptr)));
let sum = g.add_node(NodeData::new1(BoxedNode::new(node::Sum)));
g.add_edge(src_a, sum, ());
g.add_edge(src_b, sum, ());
p.process(&mut g, sum);
let expected = Buffer::from([0.2; Buffer::LEN]);
assert_eq!(&g[sum].buffers[..], &[expected][..]);
let src_c = g.add_node(NodeData::new1(BoxedNode::new(src_node_ptr)));
let src_d = g.add_node(NodeData::new1(BoxedNode::new(src_node_ptr)));
let src_e = g.add_node(NodeData::new1(BoxedNode::new(src_node_ptr)));
g.add_edge(src_c, sum, ());
g.add_edge(src_d, sum, ());
g.add_edge(src_e, sum, ());
p.process(&mut g, sum);
let expected = Buffer::from([0.5; Buffer::LEN]);
assert_eq!(&g[sum].buffers[..], &[expected][..]);
}
#[test]
fn test_sum2() {
type Graph = petgraph::Graph<NodeData<BoxedNode>, (), petgraph::Directed, u32>;
type Processor = dasp_graph::Processor<Graph>;
let mut g = Graph::new();
let mut p = Processor::with_capacity(g.node_count());
let src_node_ptr = src_node as fn(&[Input], &mut [Buffer]);
let src_a = g.add_node(NodeData::new2(BoxedNode::new(src_node_ptr)));
let src_b = g.add_node(NodeData::new2(BoxedNode::new(src_node_ptr)));
let src_c = g.add_node(NodeData::new2(BoxedNode::new(src_node_ptr)));
let sum_a_b = g.add_node(NodeData::new2(BoxedNode::new(node::Sum)));
let sum_ab_c = g.add_node(NodeData::new2(BoxedNode::new(node::Sum)));
g.add_edge(src_a, sum_a_b, ());
g.add_edge(src_b, sum_a_b, ());
g.add_edge(sum_a_b, sum_ab_c, ());
g.add_edge(src_c, sum_ab_c, ());
p.process(&mut g, sum_ab_c);
let expected = vec![Buffer::from([0.2; Buffer::LEN]); 2];
assert_eq!(&g[sum_a_b].buffers[..], &expected[..]);
let expected = vec![Buffer::from([0.3; Buffer::LEN]); 2];
assert_eq!(&g[sum_ab_c].buffers[..], &expected[..]);
}
#[test]
fn test_sum_unboxed() {
enum TestNode {
SourceFnPtr(fn(&[Input], &mut [Buffer])),
Sum(node::Sum),
}
impl Node for TestNode {
fn process(&mut self, inputs: &[Input], output: &mut [Buffer]) {
match *self {
TestNode::SourceFnPtr(ref mut f) => (*f)(inputs, output),
TestNode::Sum(ref mut sum) => sum.process(inputs, output),
}
}
}
type Graph = petgraph::Graph<NodeData<TestNode>, (), petgraph::Directed, u32>;
type Processor = dasp_graph::Processor<Graph>;
let mut g = Graph::new();
let mut p = Processor::with_capacity(g.node_count());
let src_node_ptr = src_node as _;
let src_a = g.add_node(NodeData::new1(TestNode::SourceFnPtr(src_node_ptr)));
let src_b = g.add_node(NodeData::new1(TestNode::SourceFnPtr(src_node_ptr)));
let sum = g.add_node(NodeData::new1(TestNode::Sum(node::Sum)));
g.add_edge(src_a, sum, ());
g.add_edge(src_b, sum, ());
p.process(&mut g, sum);
let expected = Buffer::from([0.2; Buffer::LEN]);
assert_eq!(&g[sum].buffers[..], &[expected][..]);
}