1 /**
2    From clang.Cursor to dpp.node.Node.
3    The tests can't be pure because clang.Cursor.children isn't.
4  */
5 module ut.transform.cursor;
6 
7 
8 import ut.transform;
9 import clang: Cursor, ClangType = Type;
10 import dpp2.transform: toNode;
11 
12 
13 @("struct.onefield.int")
14 @safe unittest {
15     const tu = mockTU!(Module("contract.aggregates"),
16                        CodeURL("it.c.compile.struct_", "onefield.int"));
17 
18     const actual = tu.toNode;
19     const expected = [Node(
20         Struct(
21             "Foo",
22             [
23                 Node(Field(Type(Int()), "i")),
24             ],
25             "struct Foo",
26         )
27     )];
28 
29     () @trusted { actual.should == expected; }();
30 }
31 
32 
33 @("struct.nested")
34 @safe unittest {
35     const tu = mockTU!(Module("contract.aggregates"),
36                        CodeURL("it.c.compile.struct_", "nested"));
37 
38     const actual = tu.toNode;
39     const expected = [Node(
40         Struct(
41             "Outer",
42             [
43                 Node(Field(Type(Int()), "integer")),
44                 Node(Struct("Inner", [ Node(Field(Type(Int()), "x")) ], "struct Inner")),
45                 Node(Field(Type(UserDefinedType("Inner")), "inner")),
46             ],
47             "struct Outer",
48         )
49     )];
50 
51     () @trusted { actual.should == expected; }();
52 }
53 
54 
55 @("struct.typedef.name")
56 @safe unittest {
57     const tu = mockTU!(Module("contract.aggregates"),
58                        CodeURL("it.c.compile.struct_", "typedef.name"));
59 
60     const actual = tu.toNode;
61     const expected = [
62         Node(Struct("TypeDefd_", [], "struct TypeDefd_")),
63         Node(Typedef("TypeDefd", Type(UserDefinedType("TypeDefd_")))),
64     ];
65 
66     () @trusted { actual.should == expected; }();
67 }
68 
69 
70 @("struct.typedef.anon")
71 @safe unittest {
72     const tu = mockTU!(Module("contract.aggregates"),
73                        CodeURL("it.c.compile.struct_", "typedef.anon"));
74 
75     const actual = tu.toNode;
76     const expected = [
77         Node(
78             Struct(
79                 "",
80                 [
81                     Node(Field(Type(Int()), "x")),
82                     Node(Field(Type(Int()), "y")),
83                     Node(Field(Type(Int()), "z")),
84                 ],
85                 "Nameless1",
86             ),
87         ),
88         Node(Typedef("Nameless1", Type(UserDefinedType("Nameless1")))),
89         Node(
90             Struct(
91                 "",
92                 [
93                     Node(Field(Type(Double()), "d")),
94                 ],
95                 "Nameless2",
96             ),
97         ),
98         Node(Typedef("Nameless2", Type(UserDefinedType("Nameless2")))),
99     ];
100 
101 
102     () @trusted { actual.should == expected; }();
103 }
104 
105 
106 @("struct.typedef.before")
107 @safe unittest {
108     const tu = mockTU!(Module("contract.aggregates"),
109                        CodeURL("it.c.compile.struct_", "typedef.before"));
110     const actual = tu.toNode;
111     const expected = [
112         Node(Typedef("B", Type(UserDefinedType("A")))),
113         Node(Struct("A", [Node(Field(Type(Int()), "a"))], "struct A")),
114     ];
115 
116     () @trusted { actual.should == expected; }();
117 }