#![cfg(all(test, feature = "serde", feature = "serde_json"))]
use anyhow::Result;
use wolf_graph::prelude::*;
mod common;
use common::*;
#[test]
fn immutable_nodes() -> Result<()> {
let mut graph_1 = BlankGraph::new();
graph_1.add_node(nid!("A")).unwrap();
recode(&graph_1, r#"[["A"],[]]"#)?;
graph_1.add_node(nid!("B")).unwrap();
assert_eq!(graph_1, graph_1);
assert_eq!(graph_1.node_count(), 2);
assert_eq!(graph_1.all_nodes(), vec![nid!("A"), nid!("B")].into_iter().collect());
recode(&graph_1, r#"[["A","B"],[]]"#)?;
let mut graph_2 = graph_1.clone();
graph_2.add_node(nid!("C")).unwrap();
assert_eq!(graph_2, graph_2);
assert_eq!(graph_2.node_count(), 3);
assert_ne!(graph_1, graph_2);
recode(&graph_2, r#"[["A","B","C"],[]]"#)?;
recode(&graph_1, r#"[["A","B"],[]]"#)?;
Ok(())
}
#[test]
fn immutable_edges() -> Result<()> {
let mut graph_1 = BlankGraph::new();
graph_1.add_node(nid!("A")).unwrap();
graph_1.add_node(nid!("B")).unwrap();
graph_1.add_edge(eid!("AB"), nid!("A"), nid!("B")).unwrap();
assert_eq!(graph_1, graph_1);
assert_eq!(graph_1.edge_count(), 1);
assert_eq!(graph_1.all_edges(), vec![eid!("AB")].into_iter().collect());
recode(&graph_1, r#"[["A","B"],[["AB","A","B"]]]"#)?;
let mut graph_2 = graph_1.clone();
graph_2.add_node(nid!("C")).unwrap();
graph_2.add_edge(eid!("BC"), nid!("B"), nid!("C")).unwrap();
assert_eq!(graph_2, graph_2);
assert_eq!(graph_2.edge_count(), 2);
assert_ne!(graph_1, graph_2);
recode(&graph_1, r#"[["A","B"],[["AB","A","B"]]]"#)?;
recode(&graph_2, r#"[["A","B","C"],[["AB","A","B"],["BC","B","C"]]]"#)?;
Ok(())
}
#[test]
fn immutable_graph_data() -> Result<()> {
let mut graph_1: Graph<String, (), ()> = Graph::new();
recode(&graph_1, r#"[[],[],""]"#)?;
graph_1.set_data("A".to_string());
recode(&graph_1, r#"[[],[],"A"]"#)?;
let mut graph_2 = graph_1.clone();
graph_2.set_data("B".to_string());
recode(&graph_1, r#"[[],[],"A"]"#)?;
recode(&graph_2, r#"[[],[],"B"]"#)?;
Ok(())
}
#[test]
fn immutable_node_data() -> Result<()> {
let mut graph_1: Graph<(), String, ()> = Graph::new();
graph_1.add_node_with_data(nid!("A"), "NodeData1".to_string()).unwrap();
assert_eq!(graph_1, graph_1);
recode(&graph_1, r#"[[["A","NodeData1"]],[]]"#)?;
let mut graph_2 = graph_1.clone();
graph_2.set_node_data(nid!("A"), "NodeData2".to_string()).unwrap();
assert_eq!(graph_2, graph_2);
assert_ne!(graph_1, graph_2);
recode(&graph_1, r#"[[["A","NodeData1"]],[]]"#)?;
recode(&graph_2, r#"[[["A","NodeData2"]],[]]"#)?;
Ok(())
}
#[test]
fn immutable_edge_data() -> Result<()> {
let mut graph_1: Graph<(), (), String> = Graph::new();
graph_1.add_node(nid!("A")).unwrap();
graph_1.add_node(nid!("B")).unwrap();
graph_1.add_edge_with_data(eid!("AB"), nid!("A"), nid!("B"), "EdgeData1".to_string()).unwrap();
assert_eq!(graph_1, graph_1);
recode(&graph_1, r#"[["A","B"],[["AB","A","B","EdgeData1"]]]"#)?;
let mut graph_2 = graph_1.clone();
graph_2.set_edge_data(eid!("AB"), "EdgeData2".to_string()).unwrap();
assert_eq!(graph_2, graph_2);
assert_ne!(graph_1, graph_2);
recode(&graph_1, r#"[["A","B"],[["AB","A","B","EdgeData1"]]]"#)?;
recode(&graph_2, r#"[["A","B"],[["AB","A","B","EdgeData2"]]]"#)?;
Ok(())
}