1pub mod rewrite;
4pub mod prelude {
5 pub use crate::rewrite::*;
7}
8
9#[cfg(test)]
10mod tests {
11 use super::*;
12 use crate::prelude::*;
13 use kotoba_core::{types::*, ir::*};
14 use kotoba_graph::prelude::*;
15 use std::collections::HashMap;
16
17 #[test]
18 fn test_rewrite_engine_creation() {
19 let engine = RewriteEngine::new();
21 assert!(true);
23 }
24
25 #[test]
26 fn test_rule_matcher_creation() {
27 let matcher = RuleMatcher::new();
29 assert!(true);
30 }
31
32 #[test]
33 fn test_rule_applier_creation() {
34 let applier = RuleApplier::new();
36 assert!(true);
37 }
38
39 #[test]
40 fn test_rule_ir_creation() {
41 let rule = RuleIR {
43 name: "test_rule".to_string(),
44 types: std::collections::HashMap::new(),
45 lhs: GraphPattern { nodes: vec![], edges: vec![] },
46 context: GraphPattern { nodes: vec![], edges: vec![] },
47 rhs: GraphPattern { nodes: vec![], edges: vec![] },
48 nacs: vec![],
49 guards: vec![],
50 };
51 assert_eq!(rule.name, "test_rule");
52 assert!(rule.lhs.nodes.is_empty());
53 assert!(rule.rhs.nodes.is_empty());
54 }
55
56 #[test]
57 fn test_strategy_ir_creation() {
58 let strategy = StrategyIR {
60 strategy: StrategyOp::Once {
61 rule: "test_rule".to_string(),
62 },
63 };
64
65 if let StrategyOp::Once { rule } = &strategy.strategy {
66 assert_eq!(rule, "test_rule");
67 } else {
68 panic!("Expected Once strategy");
69 }
70 }
71
72 #[test]
73 fn test_pattern_creation() {
74 let mut pattern = GraphPattern { nodes: vec![], edges: vec![] };
76 assert!(pattern.nodes.is_empty());
77 assert!(pattern.edges.is_empty());
78
79 let element = GraphElement {
81 id: "person1".to_string(),
82 type_: Some("Person".to_string()),
83 props: Some(HashMap::new()),
84 };
85 pattern.nodes.push(element);
86 assert_eq!(pattern.nodes.len(), 1);
87 assert!(pattern.nodes.iter().any(|e| e.id == "person1"));
88 }
89
90 #[test]
91 fn test_patch_creation() {
92 let patch = Patch::empty();
94 assert!(patch.adds.vertices.is_empty() && patch.adds.edges.is_empty());
95 assert!(patch.dels.vertices.is_empty() && patch.dels.edges.is_empty());
96 assert!(patch.updates.props.is_empty() && patch.updates.relinks.is_empty());
97 }
98
99 #[test]
100 fn test_match_creation() {
101 let mut mapping = HashMap::new();
103 mapping.insert("x".to_string(), VertexId::new_v4());
104
105 let match_result = Match { mapping, score: 1.0 };
106 assert_eq!(match_result.mapping.len(), 1);
107 assert!(match_result.mapping.contains_key("x"));
108 }
109
110 #[test]
111 fn test_catalog_creation() {
112 let catalog = Catalog::empty();
114 assert!(catalog.labels.is_empty());
115 assert!(catalog.indexes.is_empty());
116 assert!(catalog.invariants.is_empty());
117 }
118
119 #[test]
120 fn test_rewrite_engine_with_empty_graph() {
121 let engine = RewriteEngine::new();
123 let graph = GraphRef::new(Graph::empty());
124 let rule = RuleIR {
125 name: "empty_rule".to_string(),
126 types: std::collections::HashMap::new(),
127 lhs: GraphPattern { nodes: vec![], edges: vec![] },
128 context: GraphPattern { nodes: vec![], edges: vec![] },
129 rhs: GraphPattern { nodes: vec![], edges: vec![] },
130 nacs: vec![],
131 guards: vec![],
132 };
133 let catalog = Catalog::empty();
134
135 let matches = engine.match_rule(&graph, &rule, &catalog);
137 assert!(matches.is_ok());
138 }
139
140 #[test]
141 fn test_rewrite_engine_with_strategy() {
142 let engine = RewriteEngine::new();
144 let graph = GraphRef::new(Graph::empty());
145 let rule = RuleIR {
146 name: "test_rule".to_string(),
147 types: std::collections::HashMap::new(),
148 lhs: GraphPattern { nodes: vec![], edges: vec![] },
149 context: GraphPattern { nodes: vec![], edges: vec![] },
150 rhs: GraphPattern { nodes: vec![], edges: vec![] },
151 nacs: vec![],
152 guards: vec![],
153 };
154 let strategy = StrategyIR {
155 strategy: StrategyOp::Once {
156 rule: "test_rule".to_string(),
157 },
158 };
159
160 let result = engine.rewrite(&graph, &rule, &strategy);
162 assert!(result.is_ok());
163 }
164}