1 module ut.ctfe.reflection.types;
2 
3 
4 import ut.ctfe.reflection;
5 
6 
7 @("empty")
8 @safe pure unittest {
9     module_!"modules.empty".should == Module("modules.empty");
10 }
11 
12 
13 @("imports")
14 @safe pure unittest {
15     module_!"modules.imports".should == Module("modules.imports");
16 }
17 
18 
19 @("nameskinds")
20 @safe pure unittest {
21     import std.algorithm: map;
22 
23     enum mod = module_!"modules.types";
24 
25     static struct NameAndKind {
26         string id;
27         Aggregate.Kind kind;
28     }
29 
30     static NameAndKind xform(Aggregate a) {
31         return NameAndKind(a.identifier, a.kind);
32     }
33 
34     mod.aggregates.map!xform.should == [
35         NameAndKind("modules.types.String", Aggregate.Kind.struct_),
36         NameAndKind("modules.types.Enum", Aggregate.Kind.enum_),
37         NameAndKind("modules.types.Class", Aggregate.Kind.class_),
38         NameAndKind("modules.types.Interface", Aggregate.Kind.interface_),
39         NameAndKind("modules.types.AbstractClass", Aggregate.Kind.class_),
40         NameAndKind("modules.types.MiddleClass", Aggregate.Kind.class_),
41         NameAndKind("modules.types.LeafClass", Aggregate.Kind.class_),
42         NameAndKind("modules.types.Point", Aggregate.Kind.struct_),
43         NameAndKind("modules.types.Inner1", Aggregate.Kind.struct_),
44         NameAndKind("modules.types.EvenInner", Aggregate.Kind.struct_),
45         NameAndKind("modules.types.Inner2", Aggregate.Kind.struct_),
46         NameAndKind("modules.types.Outer", Aggregate.Kind.struct_),
47         NameAndKind("modules.types.Char", Aggregate.Kind.enum_),
48         NameAndKind("modules.types.Union", Aggregate.Kind.union_),
49     ];
50 
51     mod.allAggregates.map!xform.should == [
52         NameAndKind("modules.types.String", Aggregate.Kind.struct_),
53         NameAndKind("modules.types.Enum", Aggregate.Kind.enum_),
54         NameAndKind("modules.types.Class", Aggregate.Kind.class_),
55         NameAndKind("modules.types.Interface", Aggregate.Kind.interface_),
56         NameAndKind("modules.types.AbstractClass", Aggregate.Kind.class_),
57         NameAndKind("modules.types.MiddleClass", Aggregate.Kind.class_),
58         NameAndKind("modules.types.LeafClass", Aggregate.Kind.class_),
59         NameAndKind("modules.types.Point", Aggregate.Kind.struct_),
60         NameAndKind("modules.types.Inner1", Aggregate.Kind.struct_),
61         NameAndKind("modules.types.EvenInner", Aggregate.Kind.struct_),
62         NameAndKind("modules.types.Inner2", Aggregate.Kind.struct_),
63         NameAndKind("modules.types.Outer", Aggregate.Kind.struct_),
64         NameAndKind("modules.types.Char", Aggregate.Kind.enum_),
65         NameAndKind("modules.types.Union", Aggregate.Kind.union_),
66     ];
67 }
68 
69 
70 @("problems")
71 @safe pure unittest {
72     module_!"modules.problems".should ==
73         Module(
74             "modules.problems",
75             [],
76             [],
77             [Variable("int[]", "gInts")],
78             []
79         );
80 }
81 
82 
83 @("variables")
84 @safe pure unittest {
85     enum mod = module_!"modules.variables";
86     auto aggs = mod.aggregates[];
87     aggs.length.should == 1;
88     aggs[0].identifier.should == "modules.variables.Struct";
89     aggs[0].kind.should == Aggregate.Kind.struct_;
90 }
91 
92 
93 @("fields.String")
94 @safe pure unittest {
95     enum mod = module_!"modules.types";
96     auto string_ = mod.aggregates[0];
97     string_.fields.should == [
98         Variable("string", "value"),
99     ];
100 }
101 
102 
103 @("fields.Point")
104 @safe pure unittest {
105     import std.algorithm: find;
106     enum mod = module_!"modules.types";
107     auto point = mod.aggregates[].find!(a => a.identifier == "modules.types.Point")[0];
108     point.fields.should == [
109         Variable("double", "x"),
110         Variable("double", "y"),
111     ];
112 }