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 }