#[typetag::serde(tag = "type")]
trait SerdeNode: Node {}
#[typetag::serde]
impl SerdeNode for node::Expr {}
#[typetag::serde]
impl SerdeNode for node::Push<node::Expr> {}
#[typetag::serde]
impl SerdeNode for node::Pull<node::Expr> {}
use gantz_core::node::{self, Expr, Node, Pull, Push, WithPullEval, WithPushEval};
use serde_json;
fn basic_expr() -> Expr {
node::expr("(+ $a $b)").unwrap()
}
fn push_expr() -> Push<Expr> {
node::expr("(+ $a $b)").unwrap().with_push_eval()
}
fn pull_expr() -> Pull<Expr> {
node::expr("(+ $a $b)").unwrap().with_pull_eval()
}
#[test]
fn test_serde_basic_expr() {
let node = basic_expr();
let boxed: Box<dyn SerdeNode> = Box::new(node);
let serialized = serde_json::to_string(&boxed).expect("Failed to serialize");
let deserialized: Box<dyn SerdeNode> =
serde_json::from_str(&serialized).expect("Failed to deserialize");
let n = deserialized;
assert_eq!(n.n_inputs(), 2);
assert_eq!(n.n_outputs(), 1);
assert!(n.push_eval().is_empty());
assert!(n.pull_eval().is_empty());
}
#[test]
fn test_serde_push_node() {
let node = push_expr();
let boxed: Box<dyn SerdeNode> = Box::new(node);
let serialized = serde_json::to_string(&boxed).expect("Failed to serialize");
let deserialized: Box<dyn SerdeNode> =
serde_json::from_str(&serialized).expect("Failed to deserialize");
let n = deserialized;
assert_eq!(n.n_inputs(), 2);
assert_eq!(n.n_outputs(), 1);
assert!(!n.push_eval().is_empty());
assert!(n.pull_eval().is_empty());
}
#[test]
fn test_serde_node_vector() {
let nodes: Vec<Box<dyn SerdeNode>> = vec![
Box::new(basic_expr()),
Box::new(push_expr()),
Box::new(pull_expr()),
];
let serialized = serde_json::to_string(&nodes).expect("Failed to serialize vector");
let deserialized: Vec<Box<dyn SerdeNode>> =
serde_json::from_str(&serialized).expect("Failed to deserialize vector");
assert_eq!(nodes.len(), deserialized.len());
assert!(deserialized[0].push_eval().is_empty());
assert!(deserialized[0].pull_eval().is_empty());
assert!(!deserialized[1].push_eval().is_empty());
assert!(deserialized[1].pull_eval().is_empty());
assert!(deserialized[2].push_eval().is_empty());
assert!(!deserialized[2].pull_eval().is_empty());
}