1 /** 2 * Copyright: Copyright (c) 2012 Jacob Carlborg. All rights reserved. 3 * Authors: Jacob Carlborg 4 * Version: Initial created: Nov 13, 2012 5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) 6 */ 7 module spec.serialization.CircularReference; 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 A 20 { 21 B b; 22 int x; 23 } 24 25 class B 26 { 27 A a; 28 int y; 29 } 30 31 A a; 32 B b; 33 34 unittest 35 { 36 archive = new XmlArchive!(char); 37 serializer = new Serializer(archive); 38 39 a = new A; 40 a.x = 3; 41 42 b = new B; 43 b.y = 4; 44 45 b.a = a; 46 a.b = b; 47 48 describe! "serialize objects with circular reference" in { 49 it! "should return a serialized object" in { 50 serializer.reset; 51 serializer.serialize(a); 52 53 assert(archive.data().containsDefaultXmlContent()); 54 assert(archive.data().contains(`<object runtimeType="spec.serialization.CircularReference.A" type="spec.serialization.CircularReference.A" key="0" id="0">`)); 55 56 assert(archive.data().contains(`<object runtimeType="spec.serialization.CircularReference.B" type="spec.serialization.CircularReference.B" key="b" id="1">`)); 57 assert(archive.data().containsXmlTag("int", `key="y" id="3"`, "4")); 58 59 assert(archive.data().containsXmlTag("int", `key="x" id="4"`, "3")); 60 }; 61 }; 62 63 describe! "deserialize objects with circular reference" in { 64 it! "should return a deserialized object equal to the original object" in { 65 auto aDeserialized = serializer.deserialize!(A)(archive.untypedData); 66 67 assert(a is a.b.a); 68 assert(a.x == aDeserialized.x); 69 assert(a.b.y == aDeserialized.b.y); 70 }; 71 }; 72 }