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 }