1use brack_sdk_rs::ast::{InnerNode, LeafNode, AST};
2use uuid::Uuid;
3
4pub fn new_document() -> AST {
5 AST::Document(InnerNode {
6 id: Uuid::new_v4().to_string(),
7 children: vec![],
8 })
9}
10
11pub fn new_document_with_children(children: Vec<AST>) -> AST {
12 AST::Document(InnerNode {
13 id: Uuid::new_v4().to_string(),
14 children,
15 })
16}
17
18pub fn new_stmt() -> AST {
19 AST::Stmt(InnerNode {
20 id: Uuid::new_v4().to_string(),
21 children: vec![],
22 })
23}
24
25pub fn new_stmt_with_children(children: Vec<AST>) -> AST {
26 AST::Stmt(InnerNode {
27 id: Uuid::new_v4().to_string(),
28 children,
29 })
30}
31
32pub fn new_expr() -> AST {
33 AST::Expr(InnerNode {
34 id: Uuid::new_v4().to_string(),
35 children: vec![],
36 })
37}
38
39pub fn new_expr_with_children(children: Vec<AST>) -> AST {
40 AST::Expr(InnerNode {
41 id: Uuid::new_v4().to_string(),
42 children,
43 })
44}
45
46pub fn new_angle() -> AST {
47 AST::Angle(InnerNode {
48 id: Uuid::new_v4().to_string(),
49 children: vec![],
50 })
51}
52
53pub fn new_angle_with_children(children: Vec<AST>) -> AST {
54 AST::Angle(InnerNode {
55 id: Uuid::new_v4().to_string(),
56 children,
57 })
58}
59
60pub fn new_curly() -> AST {
61 AST::Curly(InnerNode {
62 id: Uuid::new_v4().to_string(),
63 children: vec![],
64 })
65}
66
67pub fn new_curly_with_children(children: Vec<AST>) -> AST {
68 AST::Curly(InnerNode {
69 id: Uuid::new_v4().to_string(),
70 children,
71 })
72}
73
74pub fn new_square() -> AST {
75 AST::Square(InnerNode {
76 id: Uuid::new_v4().to_string(),
77 children: vec![],
78 })
79}
80
81pub fn new_square_with_children(children: Vec<AST>) -> AST {
82 AST::Square(InnerNode {
83 id: Uuid::new_v4().to_string(),
84 children,
85 })
86}
87
88pub fn new_ident(children: Vec<AST>) -> AST {
89 AST::Identifier(InnerNode {
90 id: Uuid::new_v4().to_string(),
91 children,
92 })
93}
94
95pub fn new_text(value: String) -> AST {
96 AST::Text(LeafNode {
97 id: Uuid::new_v4().to_string(),
98 value,
99 })
100}
101
102fn assert_inner_node_eq(node1: &InnerNode, node2: &InnerNode) {
103 assert_eq!(node1.children.len(), node2.children.len());
104 for i in 0..node1.children.len() {
105 assert_ast_eq(&node1.children[i], &node2.children[i]);
106 }
107}
108
109fn assert_leaf_node_eq(node1: &LeafNode, node2: &LeafNode) {
110 assert_eq!(node1.value, node2.value);
111}
112
113pub fn assert_ast_eq(node1: &AST, node2: &AST) {
114 match (node1, node2) {
115 (AST::Document(inner1), AST::Document(inner2)) => assert_inner_node_eq(inner1, inner2),
116 (AST::Stmt(inner1), AST::Stmt(inner2)) => assert_inner_node_eq(inner1, inner2),
117 (AST::Expr(inner1), AST::Expr(inner2)) => assert_inner_node_eq(inner1, inner2),
118 (AST::Angle(inner1), AST::Angle(inner2)) => assert_inner_node_eq(inner1, inner2),
119 (AST::Square(inner1), AST::Square(inner2)) => assert_inner_node_eq(inner1, inner2),
120 (AST::Curly(inner1), AST::Curly(inner2)) => assert_inner_node_eq(inner1, inner2),
121 (AST::Identifier(leaf1), AST::Identifier(leaf2)) => assert_inner_node_eq(leaf1, leaf2),
122 (AST::Text(leaf1), AST::Text(leaf2)) => assert_leaf_node_eq(leaf1, leaf2),
123 _ => panic!(
124 "Mismatched AST node types or unexpected AST node\nleft: {:?}\nright: {:?}",
125 node1, node2
126 ),
127 }
128}