comparison orange/serialization/Serializer.d @ 27:fc315d786f24 experimental

Added unit testing.
author Jacob Carlborg <doob@me.com>
date Fri, 19 Nov 2010 11:14:55 +0100
parents 78e5fef4bbf2
children bffcbc8c392b
comparison
equal deleted inserted replaced
26:78e5fef4bbf2 27:fc315d786f24
954 } 954 }
955 955
956 return annotations; 956 return annotations;
957 } 957 }
958 } 958 }
959 959 version (none):
960
961
962 debug (OrangeUnitTest)
963 {
964 import orange.serialization.archives.XMLArchive;
965
966 enum Foo { a, b, c }
967 typedef int Int;
968
969 class A {}
970 struct B {}
971 class C { string str; }
972 class D { int[] arr; }
973 class E { int[int] aa; }
974 class F { int value; int* ptr; }
975 class G { Foo foo; }
976
977 class H
978 {
979 bool bool_;
980 byte byte_;
981 //cdouble cdouble_; // currently not suppported by to!()
982 //cent cent_; // currently not implemented but a reserved keyword
983 //cfloat cfloat_; // currently not suppported by to!()
984 char char_;
985 //creal creal_; // currently not suppported by to!()
986 dchar dchar_;
987 double double_;
988 float float_;
989 //idouble idouble_; // currently not suppported by to!()
990 //ifloat ifloat_; // currently not suppported by to!()
991 int int_;
992 //ireal ireal_; // currently not suppported by to!()
993 long long_;
994 real real_;
995 short short_;
996 ubyte ubyte_;
997 //ucent ucent_; // currently not implemented but a reserved keyword
998 uint uint_;
999 ulong ulong_;
1000 ushort ushort_;
1001 wchar wchar_;
1002
1003 equals_t opEquals (Object other)
1004 {
1005 if (auto o = cast(H) other)
1006 {
1007 return bool_ == o.bool_ &&
1008 byte_ == o.byte_ &&
1009 //cdouble_ == o.cdouble_ && // currently not suppported by to!()
1010 //cent_ == o.cent_ && // currently not implemented but a reserved keyword
1011 //cfloat_ == o.cfloat_ && // currently not suppported by to!()
1012 char_ == o.char_ &&
1013 //creal_ == o.creal_ && // currently not suppported by to!()
1014 dchar_ == o.dchar_ &&
1015 double_ == o.double_ &&
1016 float_ == o.float_ &&
1017 //idouble_ == o.idouble_ && // currently not suppported by to!()
1018 //ifloat_ == o.ifloat_ && // currently not suppported by to!()
1019 int_ == o.int_ &&
1020 //ireal_ == o.ireal_ && // currently not suppported by to!()
1021 long_ == o.long_ &&
1022 real_ == o.real_ &&
1023 short_ == o.short_ &&
1024 ubyte_ == o.ubyte_ &&
1025 //ucent_ == o.ucent_ && // currently not implemented but a reserved keyword
1026 uint_ == o.uint_ &&
1027 ulong_ == o.ulong_ &&
1028 ushort_ == o.ushort_ &&
1029 wchar_ == o.wchar_;
1030 }
1031
1032 return false;
1033 }
1034 }
1035
1036 class I
1037 {
1038 Int a;
1039 }
1040
1041 void main () 960 void main ()
1042 { 961 {
1043 auto archive = new XMLArchive!(char); 962
1044 auto serializer = new Serializer(archive);
1045 string data;
1046 963
1047 void serializeObject () 964 void serializeObject ()
1048 { 965 {
1049 serializer.reset; 966 serializer.reset;
1050 data = `<?xml version="1.0" encoding="UTF-8"?> 967 data = `<?xml version="1.0" encoding="UTF-8"?>
1051 <archive type="org.dsource.orange.xml" version="1.0.0"> 968 <archive type="org.dsource.orange.xml" version="1.0.0">
1052 <data> 969 <data>
1053 <struct type="B" key="0"/> 970 <struct type="B" key="0"/>
1054 </data> 971 </data>
1055 </archive>`; 972 </archive>`;
1056 973
1057 serializer.serialize(B()); 974 serializer.serialize(B());
1058 assert(archive.data == data); 975 assert(archive.data == data);
1059 } 976 }
1060 977
1061 void serializeStruct () 978 void serializeStruct ()
1062 { 979 {
1063 serializer.reset; 980 serializer.reset;
1064 data = `<?xml version="1.0" encoding="UTF-8"?> 981 data = `<?xml version="1.0" encoding="UTF-8"?>
1065 <archive type="org.dsource.orange.xml" version="1.0.0"> 982 <archive type="org.dsource.orange.xml" version="1.0.0">
1066 <data> 983 <data>
1067 <struct type="B" key="0"/> 984 <struct type="tests.Serializer.B" key="0"/>
1068 </data> 985 </data>
1069 </archive>`; 986 </archive>`;
1070 987
1071 serializer.serialize(B()); 988 serializer.serialize(B());
1072 assert(archive.data == data); 989 assert(archive.data == data);
1073 } 990 }
1074 991
1078 995
1079 // String 996 // String
1080 997
1081 serializer.reset; 998 serializer.reset;
1082 data = `<?xml version="1.0" encoding="UTF-8"?> 999 data = `<?xml version="1.0" encoding="UTF-8"?>
1083 <archive type="org.dsource.orange.xml" version="1.0.0"> 1000 <archive type="org.dsource.orange.xml" version="1.0.0">
1084 <data> 1001 <data>
1085 <object runtimeType="orange.serialization.Serializer.C" type="C" key="0" id="0"> 1002 <object runtimeType="orange.serialization.Serializer.C" type="C" key="0" id="0">
1086 <string type="char" length="3" key="str" id="1">foo</string> 1003 <string type="char" length="3" key="str" id="1">foo</string>
1087 </object> 1004 </object>
1088 </data> 1005 </data>
1089 </archive>`; 1006 </archive>`;
1090 1007
1091 auto c = new C; 1008 auto c = new C;
1092 c.str = "foo"; 1009 c.str = "foo";
1093 serializer.serialize(c); 1010 serializer.serialize(c);
1094 assert(archive.data == data); 1011 assert(archive.data == data);
1097 1014
1098 auto cDeserialized = serializer.deserialize!(C)(data); 1015 auto cDeserialized = serializer.deserialize!(C)(data);
1099 assert(c.str == cDeserialized.str); 1016 assert(c.str == cDeserialized.str);
1100 1017
1101 // Array 1018 // Array
1102 1019
1103 serializer.reset; 1020 serializer.reset;
1104 data = `<?xml version="1.0" encoding="UTF-8"?> 1021 data = `<?xml version="1.0" encoding="UTF-8"?>
1105 <archive type="org.dsource.orange.xml" version="1.0.0"> 1022 <archive type="org.dsource.orange.xml" version="1.0.0">
1106 <data> 1023 <data>
1107 <object runtimeType="orange.serialization.Serializer.D" type="D" key="0" id="0"> 1024 <object runtimeType="orange.serialization.Serializer.D" type="D" key="0" id="0">
1108 <array type="int" length="6" key="arr" id="1"> 1025 <array type="int" length="6" key="arr" id="1">
1109 <int key="0">27</int> 1026 <int key="0">27</int>
1110 <int key="1">382</int> 1027 <int key="1">382</int>
1111 <int key="2">283</int> 1028 <int key="2">283</int>
1112 <int key="3">3820</int> 1029 <int key="3">3820</int>
1113 <int key="4">32</int> 1030 <int key="4">32</int>
1114 <int key="5">832</int> 1031 <int key="5">832</int>
1115 </array> 1032 </array>
1116 </object> 1033 </object>
1117 </data> 1034 </data>
1118 </archive>`; 1035 </archive>`;
1119 1036
1120 auto d = new D; 1037 auto d = new D;
1121 d.arr = [27, 382, 283, 3820, 32, 832]; 1038 d.arr = [27, 382, 283, 3820, 32, 832];
1122 serializer.serialize(d); 1039 serializer.serialize(d);
1123 assert(archive.data == data); 1040 assert(archive.data == data);
1129 1046
1130 // Associative Array 1047 // Associative Array
1131 1048
1132 serializer.reset(); 1049 serializer.reset();
1133 data = `<?xml version="1.0" encoding="UTF-8"?> 1050 data = `<?xml version="1.0" encoding="UTF-8"?>
1134 <archive type="org.dsource.orange.xml" version="1.0.0"> 1051 <archive type="org.dsource.orange.xml" version="1.0.0">
1135 <data> 1052 <data>
1136 <object runtimeType="orange.serialization.Serializer.E" type="E" key="0" id="0"> 1053 <object runtimeType="orange.serialization.Serializer.E" type="E" key="0" id="0">
1137 <associativeArray keyType="int" valueType="int" length="4" key="aa"> 1054 <associativeArray keyType="int" valueType="int" length="4" key="aa">
1138 <key key="0"> 1055 <key key="0">
1139 <int key="0">1</int> 1056 <int key="0">1</int>
1140 </key> 1057 </key>
1141 <value key="0"> 1058 <value key="0">
1142 <int key="0">2</int> 1059 <int key="0">2</int>
1143 </value> 1060 </value>
1144 <key key="1"> 1061 <key key="1">
1145 <int key="1">3</int> 1062 <int key="1">3</int>
1146 </key> 1063 </key>
1147 <value key="1"> 1064 <value key="1">
1148 <int key="1">4</int> 1065 <int key="1">4</int>
1149 </value> 1066 </value>
1150 <key key="2"> 1067 <key key="2">
1151 <int key="2">6</int> 1068 <int key="2">6</int>
1152 </key> 1069 </key>
1153 <value key="2"> 1070 <value key="2">
1154 <int key="2">7</int> 1071 <int key="2">7</int>
1155 </value> 1072 </value>
1156 <key key="3"> 1073 <key key="3">
1157 <int key="3">39</int> 1074 <int key="3">39</int>
1158 </key> 1075 </key>
1159 <value key="3"> 1076 <value key="3">
1160 <int key="3">472</int> 1077 <int key="3">472</int>
1161 </value> 1078 </value>
1162 </associativeArray> 1079 </associativeArray>
1163 </object> 1080 </object>
1164 </data> 1081 </data>
1165 </archive>`; 1082 </archive>`;
1166 1083
1167 auto e = new E; 1084 auto e = new E;
1168 e.aa = [3 : 4, 1 : 2, 39 : 472, 6 : 7]; 1085 e.aa = [3 : 4, 1 : 2, 39 : 472, 6 : 7];
1169 serializer.serialize(e); 1086 serializer.serialize(e);
1170 assert(archive.data == data); 1087 assert(archive.data == data);
1176 1093
1177 // Pointer 1094 // Pointer
1178 1095
1179 serializer.reset(); 1096 serializer.reset();
1180 data = `<?xml version="1.0" encoding="UTF-8"?> 1097 data = `<?xml version="1.0" encoding="UTF-8"?>
1181 <archive type="org.dsource.orange.xml" version="1.0.0"> 1098 <archive type="org.dsource.orange.xml" version="1.0.0">
1182 <data> 1099 <data>
1183 <object runtimeType="orange.serialization.Serializer.F" type="F" key="0" id="0"> 1100 <object runtimeType="orange.serialization.Serializer.F" type="F" key="0" id="0">
1184 <pointer key="ptr" id="2"> 1101 <pointer key="ptr" id="2">
1185 <int key="1">9</int> 1102 <int key="1">9</int>
1186 </pointer> 1103 </pointer>
1187 <int key="value">9</int> 1104 <int key="value">9</int>
1188 </object> 1105 </object>
1189 </data> 1106 </data>
1190 </archive>`; 1107 </archive>`;
1191 1108
1192 auto f = new F; 1109 auto f = new F;
1193 f.value = 9; 1110 f.value = 9;
1194 f.ptr = &f.value; 1111 f.ptr = &f.value;
1195 serializer.serialize(f); 1112 serializer.serialize(f);
1202 1119
1203 // Enum 1120 // Enum
1204 1121
1205 serializer.reset(); 1122 serializer.reset();
1206 data = `<?xml version="1.0" encoding="UTF-8"?> 1123 data = `<?xml version="1.0" encoding="UTF-8"?>
1207 <archive type="org.dsource.orange.xml" version="1.0.0"> 1124 <archive type="org.dsource.orange.xml" version="1.0.0">
1208 <data> 1125 <data>
1209 <object runtimeType="orange.serialization.Serializer.G" type="G" key="0" id="0"> 1126 <object runtimeType="orange.serialization.Serializer.G" type="G" key="0" id="0">
1210 <enum type="Foo" baseType="int" key="foo">1</enum> 1127 <enum type="Foo" baseType="int" key="foo">1</enum>
1211 </object> 1128 </object>
1212 </data> 1129 </data>
1213 </archive>`; 1130 </archive>`;
1214 1131
1215 auto g = new G; 1132 auto g = new G;
1216 g.foo = Foo.b; 1133 g.foo = Foo.b;
1217 serializer.serialize(g); 1134 serializer.serialize(g);
1218 assert(archive.data == data); 1135 assert(archive.data == data);
1224 1141
1225 // Primitives 1142 // Primitives
1226 1143
1227 serializer.reset; 1144 serializer.reset;
1228 data = `<?xml version="1.0" encoding="UTF-8"?> 1145 data = `<?xml version="1.0" encoding="UTF-8"?>
1229 <archive type="org.dsource.orange.xml" version="1.0.0"> 1146 <archive type="org.dsource.orange.xml" version="1.0.0">
1230 <data> 1147 <data>
1231 <object runtimeType="orange.serialization.Serializer.H" type="H" key="0" id="0"> 1148 <object runtimeType="orange.serialization.Serializer.H" type="H" key="0" id="0">
1232 <byte key="byte_">1</byte> 1149 <byte key="byte_">1</byte>
1233 <char key="char_">a</char> 1150 <char key="char_">a</char>
1234 <dchar key="dchar_">b</dchar> 1151 <dchar key="dchar_">b</dchar>
1235 <double key="double_">0</double> 1152 <double key="double_">0</double>
1236 <float key="float_">0</float> 1153 <float key="float_">0</float>
1237 <int key="int_">1</int> 1154 <int key="int_">1</int>
1238 <long key="long_">1</long> 1155 <long key="long_">1</long>
1239 <real key="real_">0</real> 1156 <real key="real_">0</real>
1240 <short key="short_">1</short> 1157 <short key="short_">1</short>
1241 <ubyte key="ubyte_">1</ubyte> 1158 <ubyte key="ubyte_">1</ubyte>
1242 <uint key="uint_">1</uint> 1159 <uint key="uint_">1</uint>
1243 <ulong key="ulong_">1</ulong> 1160 <ulong key="ulong_">1</ulong>
1244 <ushort key="ushort_">1</ushort> 1161 <ushort key="ushort_">1</ushort>
1245 <wchar key="wchar_">c</wchar> 1162 <wchar key="wchar_">c</wchar>
1246 <bool key="bool_">true</bool> 1163 <bool key="bool_">true</bool>
1247 </object> 1164 </object>
1248 </data> 1165 </data>
1249 </archive>`; 1166 </archive>`;
1250 1167
1251 auto h = new H; 1168 auto h = new H;
1252 1169
1253 h.bool_ = true; 1170 h.bool_ = true;
1254 h.byte_ = 1; 1171 h.byte_ = 1;
1282 1199
1283 // Typedef 1200 // Typedef
1284 1201
1285 serializer.reset(); 1202 serializer.reset();
1286 data = `<?xml version="1.0" encoding="UTF-8"?> 1203 data = `<?xml version="1.0" encoding="UTF-8"?>
1287 <archive type="org.dsource.orange.xml" version="1.0.0"> 1204 <archive type="org.dsource.orange.xml" version="1.0.0">
1288 <data> 1205 <data>
1289 <object runtimeType="orange.serialization.Serializer.I" type="I" key="0" id="0"> 1206 <object runtimeType="orange.serialization.Serializer.I" type="I" key="0" id="0">
1290 <typedef type="Int" key="a"> 1207 <typedef type="Int" key="a">
1291 <int key="1">1</int> 1208 <int key="1">1</int>
1292 </typedef> 1209 </typedef>
1293 </object> 1210 </object>
1294 </data> 1211 </data>
1295 </archive>`; 1212 </archive>`;
1296 1213
1297 auto i = new I; 1214 auto i = new I;
1298 i.a = 1; 1215 i.a = 1;
1299 serializer.serialize(i); 1216 serializer.serialize(i);
1300 assert(archive.data == data); 1217 assert(archive.data == data);
1304 auto iDeserialized = serializer.deserialize!(I)(data); 1221 auto iDeserialized = serializer.deserialize!(I)(data);
1305 assert(i.a == iDeserialized.a); 1222 assert(i.a == iDeserialized.a);
1306 1223
1307 println("unit tests successful"); 1224 println("unit tests successful");
1308 } 1225 }
1309 }