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 }