1use crate::{AccountNode, CamelCaseString, Docs, NestedTypeNode, StructTypeNode};
2
3impl AccountNode {
4 pub fn new<T, U>(name: T, data: U) -> Self
5 where
6 T: Into<CamelCaseString>,
7 U: Into<NestedTypeNode<StructTypeNode>>,
8 {
9 Self {
10 name: name.into(),
11 size: None,
12 docs: Docs::default(),
13 data: data.into(),
14 pda: None,
15 discriminators: vec![],
16 }
17 }
18}
19
20#[cfg(test)]
21mod tests {
22 use super::*;
23 use crate::{NumberTypeNode, StringTypeNode, StructFieldTypeNode, U8};
24
25 #[test]
26 fn new() {
27 let node = AccountNode::new(
28 "myAccount",
29 StructTypeNode::new(vec![
30 StructFieldTypeNode::new("name", StringTypeNode::utf8()),
31 StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
32 ]),
33 );
34 assert_eq!(node.name, CamelCaseString::new("myAccount"));
35 assert_eq!(node.size, None);
36 assert_eq!(node.docs, Docs::default());
37 assert_eq!(
38 node.data,
39 NestedTypeNode::Value(StructTypeNode::new(vec![
40 StructFieldTypeNode::new("name", StringTypeNode::utf8()),
41 StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
42 ]))
43 );
44 assert_eq!(node.pda, None);
45 assert_eq!(node.discriminators, vec![]);
46 }
47
48 #[test]
49 fn direct_instantiation() {
50 let node = AccountNode {
51 name: "myAccount".into(),
52 size: None,
53 docs: Docs::default(),
54 data: StructTypeNode::new(vec![
55 StructFieldTypeNode::new("name", StringTypeNode::utf8()),
56 StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
57 ])
58 .into(),
59 pda: None,
60 discriminators: vec![],
61 };
62 assert_eq!(node.name, CamelCaseString::new("myAccount"));
63 assert_eq!(node.size, None);
64 assert_eq!(node.docs, Docs::default());
65 assert_eq!(
66 node.data,
67 NestedTypeNode::Value(StructTypeNode::new(vec![
68 StructFieldTypeNode::new("name", StringTypeNode::utf8()),
69 StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
70 ]))
71 );
72 assert_eq!(node.pda, None);
73 assert_eq!(node.discriminators, vec![]);
74 }
75
76 #[test]
77 fn to_json() {
78 let node = AccountNode::new(
79 "myAccount",
80 StructTypeNode::new(vec![
81 StructFieldTypeNode::new("name", StringTypeNode::utf8()),
82 StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
83 ]),
84 );
85 let json = serde_json::to_string(&node).unwrap();
86 assert_eq!(
87 json,
88 r#"{"kind":"accountNode","name":"myAccount","data":{"kind":"structTypeNode","fields":[{"kind":"structFieldTypeNode","name":"name","type":{"kind":"stringTypeNode","encoding":"utf8"}},{"kind":"structFieldTypeNode","name":"age","type":{"kind":"numberTypeNode","format":"u8","endian":"le"}}]}}"#
89 );
90 }
91
92 #[test]
93 fn from_json() {
94 let json = r#"{"kind":"accountNode","name":"myAccount","data":{"kind":"structTypeNode","fields":[{"kind":"structFieldTypeNode","name":"name","type":{"kind":"stringTypeNode","encoding":"utf8"}},{"kind":"structFieldTypeNode","name":"age","type":{"kind":"numberTypeNode","format":"u8","endian":"le"}}]}}"#;
95 let node: AccountNode = serde_json::from_str(json).unwrap();
96 assert_eq!(
97 node,
98 AccountNode::new(
99 "myAccount",
100 StructTypeNode::new(vec![
101 StructFieldTypeNode::new("name", StringTypeNode::utf8()),
102 StructFieldTypeNode::new("age", NumberTypeNode::le(U8)),
103 ]),
104 )
105 );
106 }
107}