use crate::model::descriptor::{
CompositeInputDescriptor, CompositeOperatorDescriptor, CompositeOutputDescriptor,
InputDescriptor, LinkDescriptor, NodeDescriptor, OperatorDescriptor, OutputDescriptor,
};
#[test]
fn test_flatten_composite_descriptor_non_nested() {
let _ = env_logger::try_init();
let composite_descriptor = CompositeOperatorDescriptor {
id: "composite-test".into(),
inputs: vec![
CompositeInputDescriptor::new("input-1", "my-operator-1", "operator-1-in-1"),
CompositeInputDescriptor::new("input-2", "my-operator-1", "operator-1-in-2"),
],
outputs: vec![CompositeOutputDescriptor::new(
"output-1",
"my-operator-2",
"operator-2-out",
)],
operators: vec![
NodeDescriptor {
id: "my-operator-1".into(),
descriptor: "file://./src/model/descriptor/tests/operator-1.yml".into(),
configuration: None,
},
NodeDescriptor {
id: "my-operator-2".into(),
descriptor: "file://./src/model/descriptor/tests/operator-2.yml".into(),
configuration: None,
},
],
links: vec![LinkDescriptor::new(
OutputDescriptor::new("my-operator-1", "operator-1-out"),
InputDescriptor::new("my-operator-2", "operator-2-in"),
)],
configuration: None,
};
let mut flow_links = vec![
LinkDescriptor::new(
OutputDescriptor::new("outer", "out-1"),
InputDescriptor::new("composite", "input-1"),
),
LinkDescriptor::new(
OutputDescriptor::new("outer", "out-2"),
InputDescriptor::new("composite", "input-2"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite", "output-1"),
InputDescriptor::new("outer", "in"),
),
LinkDescriptor::new(
OutputDescriptor::new("other-composite", "output-1"),
InputDescriptor::new("other-other-composite", "input-1"),
),
];
let operators = async_std::task::block_on(async {
composite_descriptor
.flatten("composite".into(), &mut flow_links, None, &mut Vec::new())
.await
})
.expect("Unexpected error while calling `flatten`");
let expected_operators = vec![
OperatorDescriptor {
id: "composite/my-operator-1".into(),
inputs: vec!["operator-1-in-1".into(), "operator-1-in-2".into()],
outputs: vec!["operator-1-out".into()],
uri: Some("file://operator-1.so".into()),
configuration: None,
},
OperatorDescriptor {
id: "composite/my-operator-2".into(),
inputs: vec!["operator-2-in".into()],
outputs: vec!["operator-2-out".into()],
uri: Some("file://operator-2.so".into()),
configuration: None,
},
];
assert_eq!(operators, expected_operators);
let expected_links = vec![
LinkDescriptor::new(
OutputDescriptor::new("outer", "out-1"),
InputDescriptor::new("composite/my-operator-1", "operator-1-in-1"),
),
LinkDescriptor::new(
OutputDescriptor::new("outer", "out-2"),
InputDescriptor::new("composite/my-operator-1", "operator-1-in-2"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite/my-operator-2", "operator-2-out"),
InputDescriptor::new("outer", "in"),
),
LinkDescriptor::new(
OutputDescriptor::new("other-composite", "output-1"),
InputDescriptor::new("other-other-composite", "input-1"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite/my-operator-1", "operator-1-out"),
InputDescriptor::new("composite/my-operator-2", "operator-2-in"),
),
];
assert_eq!(expected_links, flow_links);
}
#[test]
fn test_flatten_composite_descriptor_nested() {
let _ = env_logger::try_init();
let nested_composite_descriptor = CompositeOperatorDescriptor {
id: "nested-composite-test".into(),
inputs: vec![CompositeInputDescriptor::new(
"composite-input",
"composite-outer-i",
"composite-outer-in",
)],
outputs: vec![CompositeOutputDescriptor::new(
"composite-output",
"composite-outer-o",
"composite-outer-out",
)],
operators: vec![
NodeDescriptor {
id: "composite-outer-o".into(),
descriptor: "file://./src/model/descriptor/tests/composite-outer.yml".into(),
configuration: None,
},
NodeDescriptor {
id: "composite-nested".into(),
descriptor: "file://./src/model/descriptor/tests/composite-nested.yml".into(),
configuration: None,
},
NodeDescriptor {
id: "composite-outer-i".into(),
descriptor: "file://./src/model/descriptor/tests/composite-outer.yml".into(),
configuration: None,
},
],
links: vec![
LinkDescriptor::new(
OutputDescriptor::new("composite-outer-i", "composite-outer-out"),
InputDescriptor::new("composite-nested", "composite-nested-in"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite-nested", "composite-nested-out"),
InputDescriptor::new("composite-outer-o", "composite-outer-in"),
),
],
configuration: None,
};
let mut flow_links = vec![
LinkDescriptor::new(
OutputDescriptor::new("outer", "out"),
InputDescriptor::new("composite", "composite-input"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite", "composite-output"),
InputDescriptor::new("outer", "in"),
),
];
let operators = async_std::task::block_on(async {
nested_composite_descriptor
.flatten("composite".into(), &mut flow_links, None, &mut Vec::new())
.await
})
.expect("Unexpected error while calling `flatten`");
let expected_operators = vec![
OperatorDescriptor {
id: "composite/composite-outer-o".into(),
inputs: vec!["composite-outer-in".into()],
outputs: vec!["composite-outer-out".into()],
uri: Some("file://composite-outer.so".into()),
configuration: None,
},
OperatorDescriptor {
id: "composite/composite-nested/operator-1".into(),
inputs: vec!["operator-1-in-1".into(), "operator-1-in-2".into()],
outputs: vec!["operator-1-out".into()],
uri: Some("file://operator-1.so".into()),
configuration: None,
},
OperatorDescriptor {
id: "composite/composite-nested/operator-2".into(),
inputs: vec!["operator-2-in".into()],
outputs: vec!["operator-2-out".into()],
uri: Some("file://operator-2.so".into()),
configuration: None,
},
OperatorDescriptor {
id: "composite/composite-outer-i".into(),
inputs: vec!["composite-outer-in".into()],
outputs: vec!["composite-outer-out".into()],
uri: Some("file://composite-outer.so".into()),
configuration: None,
},
];
assert_eq!(expected_operators, operators);
let expected_links = vec![
LinkDescriptor::new(
OutputDescriptor::new("outer", "out"),
InputDescriptor::new("composite/composite-outer-i", "composite-outer-in"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite/composite-outer-o", "composite-outer-out"),
InputDescriptor::new("outer", "in"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite/composite-outer-i", "composite-outer-out"),
InputDescriptor::new("composite/composite-nested/operator-1", "operator-1-in-1"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite/composite-nested/operator-2", "operator-2-out"),
InputDescriptor::new("composite/composite-outer-o", "composite-outer-in"),
),
LinkDescriptor::new(
OutputDescriptor::new("composite/composite-nested/operator-1", "operator-1-out"),
InputDescriptor::new("composite/composite-nested/operator-2", "operator-2-in"),
),
];
assert_eq!(expected_links, flow_links);
}