1 /**
2  * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
3  * Authors: Jacob Carlborg
4  * Version: Initial created: Dec 20, 2011
5  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
6  */
7 module tests.OverrideSerializer;
8 
9 import orange.serialization.Serializer;
10 import orange.serialization.archives.XmlArchive;
11 import orange.test.UnitTester;
12 import tests.Util;
13 
14 Serializer serializer;
15 XmlArchive!(char) archive;
16 
17 class Base
18 {
19     int x;
20 }
21 
22 class Foo : Base
23 {
24     private int a_;
25     private int b_;
26 
27     int a () { return a_; }
28     int a (int a) { return a_ = a; }
29     int b () { return b_; }
30     int b (int b) { return b_ = b; }
31 }
32 
33 Foo foo;
34 int i;
35 
36 void toData (Foo foo, Serializer serializer, Serializer.Data key)
37 {
38     i += 4;
39 }
40 
41 void fromData (ref Foo foo, Serializer serializer, Serializer.Data key)
42 {
43     i += 4;
44 }
45 
46 void overrideToData (Foo foo, Serializer serializer, Serializer.Data key)
47 {
48     i++;
49     serializer.serialize(foo.a, "a");
50     serializer.serialize(foo.b, "b");
51     serializer.serializeBase(foo);
52 }
53 
54 void overrideFromData (ref Foo foo, Serializer serializer, Serializer.Data key)
55 {
56     i++;
57     foo.a = serializer.deserialize!(int)("a");
58     foo.b = serializer.deserialize!(int)("b");
59     serializer.deserializeBase(foo);
60 }
61 
62 unittest
63 {
64     archive = new XmlArchive!(char);
65     serializer = new Serializer(archive);
66 
67     foo = new Foo;
68     foo.a = 3;
69     foo.b = 4;
70     foo.x = 5;
71     i = 3;
72 
73     describe("serialize object using an overridden serializer") in {
74         it("should return a custom serialized object") in {
75             auto expected = q"xml
76 <?xml version="1.0" encoding="UTF-8"?>
77 <archive version="1.0.0" type="org.dsource.orange.xml">
78     <data>
79         <object runtimeType="tests.OverrideSerializer.Foo" type="tests.OverrideSerializer.Foo" key="0" id="0">
80             <int key="a" id="1">3</int>
81             <int key="b" id="2">4</int>
82             <base type="tests.OverrideSerializer.Base" key="1" id="3">
83                 <int key="x" id="4">5</int>
84             </base>
85         </object>
86     </data>
87 </archive>
88 xml";
89             Serializer.registerSerializer!(Foo)(&toData);
90             Serializer.registerDeserializer!(Foo)(&fromData);
91 
92             serializer.overrideSerializer!(Foo)(&overrideToData);
93             serializer.overrideDeserializer!(Foo)(&overrideFromData);
94 
95             serializer.serialize(foo);
96 
97             assert(i == 4);
98             assert(expected.equalToXml(archive.data));
99         };
100     };
101 
102     describe("deserialize object using an overridden deserializer") in {
103         it("short return a custom deserialized object equal to the original object") in {
104             auto f = serializer.deserialize!(Foo)(archive.untypedData);
105 
106             assert(foo.a == f.a);
107             assert(foo.b == f.b);
108             assert(foo.x == f.x);
109 
110             assert(i == 5);
111 
112             Serializer.resetSerializers;
113         };
114     };
115 }