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 spec.serialization.OverrideSerializer; 8 9 import dspec.Dsl; 10 11 import mambo.core._; 12 import mambo.serialization.Serializer; 13 import mambo.serialization.archives.XmlArchive; 14 import spec.serialization.Util; 15 16 Serializer serializer; 17 XmlArchive!(char) archive; 18 19 class Base 20 { 21 int x; 22 } 23 24 class Foo : Base 25 { 26 private int a_; 27 private int b_; 28 29 int a () { return a_; } 30 int a (int a) { return a_ = a; } 31 int b () { return b_; } 32 int b (int b) { return b_ = b; } 33 } 34 35 Foo foo; 36 int i; 37 38 void toData (Foo foo, Serializer serializer, Serializer.Data key) 39 { 40 i += 4; 41 } 42 43 void fromData (ref Foo foo, Serializer serializer, Serializer.Data key) 44 { 45 i += 4; 46 } 47 48 void overrideToData (Foo foo, Serializer serializer, Serializer.Data key) 49 { 50 i++; 51 serializer.serialize(foo.a, "a"); 52 serializer.serialize(foo.b, "b"); 53 serializer.serializeBase(foo); 54 } 55 56 void overrideFromData (ref Foo foo, Serializer serializer, Serializer.Data key) 57 { 58 i++; 59 foo.a = serializer.deserialize!(int)("a"); 60 foo.b = serializer.deserialize!(int)("b"); 61 serializer.deserializeBase(foo); 62 } 63 64 unittest 65 { 66 archive = new XmlArchive!(char); 67 serializer = new Serializer(archive); 68 69 foo = new Foo; 70 foo.a = 3; 71 foo.b = 4; 72 foo.x = 5; 73 i = 3; 74 75 describe! "serialize object using an overridden serializer" in { 76 it! "should return a custom serialized object" in { 77 Serializer.registerSerializer!(Foo)(&toData); 78 Serializer.registerDeserializer!(Foo)(&fromData); 79 80 serializer.overrideSerializer!(Foo)(&overrideToData); 81 serializer.overrideDeserializer!(Foo)(&overrideFromData); 82 83 serializer.serialize(foo); 84 85 assert(archive.data().containsDefaultXmlContent()); 86 assert(archive.data().containsXmlTag("object", `runtimeType="spec.serialization.OverrideSerializer.Foo" type="spec.serialization.OverrideSerializer.Foo" key="0" id="0"`)); 87 assert(archive.data().containsXmlTag("int", `key="a" id="1"`, "3")); 88 assert(archive.data().containsXmlTag("int", `key="b" id="2"`, "4")); 89 90 assert(archive.data().containsXmlTag("base", `type="spec.serialization.OverrideSerializer.Base" key="1" id="3"`)); 91 assert(archive.data().containsXmlTag("int", `key="x" id="4"`, "5")); 92 93 assert(i == 4); 94 }; 95 }; 96 97 describe! "deserialize object using an overridden deserializer" in { 98 it! "short return a custom deserialized object equal to the original object" in { 99 auto f = serializer.deserialize!(Foo)(archive.untypedData); 100 101 assert(foo.a == f.a); 102 assert(foo.b == f.b); 103 assert(foo.x == f.x); 104 105 assert(i == 5); 106 107 Serializer.resetSerializers; 108 }; 109 }; 110 }