1 module tests.classes;
2
3 import unit_threaded;
4 import cerealed.cerealiser;
5 import cerealed.decerealiser;
6
7 private class DummyClass {
8 int i;
9 bool opEquals(DummyClass d) const pure nothrow {
10 return false;
11 }
12 }
13
14 void testDummyClass() {
15 auto enc = Cerealiser();
16 auto dummy = new DummyClass();
17 enc ~= dummy;
18 }
19
20 private struct DummyStruct {
21 ubyte first;
22 ushort second;
23 }
24
25 private class ClassWithStruct {
26 DummyStruct dummy;
27 ubyte anotherByte;
28 this() {
29 }
30 this(DummyStruct d, ubyte a) {
31 dummy = d;
32 anotherByte = a;
33 }
34 override string toString() const { //so it can be used in shouldEqual
35 import std.conv;
36 return text("ClassWithStruct(", dummy, ", ", anotherByte, ")");
37 }
38 }
39
40 void testClassWithStruct() {
41 auto enc = Cerealiser();
42 auto klass = new ClassWithStruct(DummyStruct(2, 3), 4);
43 enc ~= klass;
44 const bytes = [2, 0, 3, 4];
45 enc.bytes.shouldEqual(bytes);
46
47 auto dec = Decerealiser(bytes);
48 dec.value!ClassWithStruct.shouldEqual(klass);
49 }
50
51 class BaseClass {
52 ubyte byte1;
53 ubyte byte2;
54 this(ubyte byte1, ubyte byte2) {
55 this.byte1 = byte1;
56 this.byte2 = byte2;
57 }
58 }
59
60 class DerivedClass: BaseClass {
61 ubyte byte3;
62 ubyte byte4;
63 this() { //needed for deserialisation
64 this(0, 0, 0, 0);
65 }
66 this(ubyte byte1, ubyte byte2, ubyte byte3, ubyte byte4) {
67 super(byte1, byte2);
68 this.byte3 = byte3;
69 this.byte4 = byte4;
70 }
71 override string toString() const { //so it can be used in shouldEqual
72 import std.conv;
73 return text("DerivedClass(", byte1, ", ", byte2, ", ", byte2, ", ", byte4, ")");
74 }
75 }
76
77 void testDerivedClass() {
78 auto enc = Cerealiser();
79 auto klass = new DerivedClass(2, 4, 8, 9);
80 enc ~= klass;
81 const bytes = [2, 4, 8, 9];
82 enc.bytes.shouldEqual(bytes);
83
84 auto dec = Decerealiser(bytes);
85 dec.value!DerivedClass.shouldEqual(klass);
86 }
87
88
89 void testSerialisationViaBaseClass() {
90 BaseClass klass = new DerivedClass(2, 4, 8, 9);
91 const baseBytes = [2, 4];
92 const childBytes = [2, 4, 8, 9];
93
94 auto enc = Cerealiser();
95 enc ~= klass;
96 enc.bytes.shouldEqual(baseBytes);
97
98 Cerealiser.registerChildClass!DerivedClass;
99 enc.reset();
100 enc ~= klass;
101 enc.bytes.shouldEqual(childBytes);
102
103 auto dec = Decerealiser(childBytes);
104 dec.value!DerivedClass.shouldEqual(cast(DerivedClass)klass);
105 }