1 module ut.meta.types;
2 
3 
4 import ut.meta;
5 
6 
7 @("empty")
8 @safe pure unittest {
9     alias mod = Module!"modules.empty";
10     typeNames!mod.should == [];
11 }
12 
13 
14 @("imports")
15 @safe pure unittest {
16     alias mod = Module!"modules.imports";
17     typeNames!mod.should == [];
18 }
19 
20 
21 @("types")
22 @safe pure unittest {
23     alias mod = Module!"modules.types";
24     typeNames!mod.shouldBeSameSetAs(
25         [
26             "String",
27             "Enum",
28             "Class",
29             "Interface",
30             "AbstractClass",
31             "MiddleClass",
32             "LeafClass",
33         ]
34     );
35 }
36 
37 
38 @("problems")
39 @safe pure unittest {
40     alias mod = Module!"modules.problems";
41     typeNames!mod.should == [];
42 }
43 
44 
45 @("variables")
46 @safe pure unittest {
47     alias mod = Module!"modules.variables";
48     typeNames!mod.should == ["Struct"];
49 }
50 
51 
52 @("isEnum")
53 @safe pure unittest {
54     static import modules.types;
55     import std.meta: Filter, AliasSeq;
56 
57     alias mod = Module!"modules.types";
58     alias aggregates = mod.Aggregates;
59     alias enums = Filter!(isEnum, aggregates);
60     static assert(is(enums == AliasSeq!(modules.types.Enum)), enums.stringof);
61 }
62 
63 
64 @("isStruct")
65 @safe pure unittest {
66     static import modules.types;
67     import std.meta: Filter, AliasSeq;
68 
69     alias mod = Module!"modules.types";
70     alias aggregates = mod.Aggregates;
71     alias structs = Filter!(isStruct, aggregates);
72     static assert(is(structs == AliasSeq!(modules.types.String)), structs.stringof);
73 }
74 
75 
76 @("isInterface")
77 @safe pure unittest {
78     static import modules.types;
79     import std.meta: Filter, AliasSeq;
80 
81     alias mod = Module!"modules.types";
82     alias aggregates = mod.Aggregates;
83     alias interfaces = Filter!(isInterface, aggregates);
84     static assert(is(interfaces == AliasSeq!(modules.types.Interface)), interfaces.stringof);
85 }
86 
87 
88 @("isClass")
89 @safe pure unittest {
90     static import modules.types;
91     import std.meta: Filter, AliasSeq;
92 
93     alias mod = Module!"modules.types";
94     alias aggregates = mod.Aggregates;
95     alias classes = Filter!(isClass, aggregates);
96     alias expected = AliasSeq!(
97         modules.types.Class,
98         modules.types.AbstractClass,
99         modules.types.MiddleClass,
100         modules.types.LeafClass,
101     );
102     static assert(is(classes == expected), classes.stringof);
103 }
104 
105 
106 @("isOOP")
107 @safe pure unittest {
108     static import modules.types;
109     import std.meta: Filter, AliasSeq;
110 
111     alias mod = Module!"modules.types";
112     alias aggregates = mod.Aggregates;
113     alias classes = Filter!(isOOP, aggregates);
114     alias expected = AliasSeq!(
115         modules.types.Class,
116         modules.types.Interface,
117         modules.types.AbstractClass,
118         modules.types.MiddleClass,
119         modules.types.LeafClass,
120     );
121     static assert(is(classes == expected), classes.stringof);
122 }
123 
124 
125 private string[] typeNames(alias module_)() {
126     import std.meta: staticMap;
127     enum name(alias Symbol) = __traits(identifier, Symbol);
128     enum names = staticMap!(name, module_.Aggregates);
129     return [names];
130 }