1 /**
2  * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved.
3  * Authors: Jacob Carlborg
4  * Version: Initial created: Aug 6, 2011
5  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
6  */
7 module tests.Pointer;
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 F
18 {
19     int value;
20     int* ptr;
21     int* ptr2;
22 }
23 
24 F f;
25 F fDeserialized;
26 int pointee;
27 
28 class OutOfOrder
29 {
30     int* ptr;
31     int value;
32     int* ptr2;
33 }
34 
35 OutOfOrder outOfOrder;
36 OutOfOrder outOfOrderDeserialized;
37 int outOfOrderPointee;
38 
39 unittest
40 {
41     archive = new XmlArchive!(char);
42     serializer = new Serializer(archive);
43 
44     pointee = 3;
45     f = new F;
46     f.value = 9;
47     f.ptr = &f.value;
48     f.ptr2 = &pointee;
49 
50     outOfOrderPointee = 3;
51     outOfOrder = new OutOfOrder;
52     outOfOrder.value = 9;
53     outOfOrder.ptr = &outOfOrder.value;
54     outOfOrder.ptr2 = &outOfOrderPointee;
55 
56     describe("serialize pointer") in {
57         it("should return a serialized pointer") in {
58             auto expected = q"xml
59 <?xml version="1.0" encoding="UTF-8"?>
60 <archive version="1.0.0" type="org.dsource.orange.xml">
61     <data>
62         <object runtimeType="tests.Pointer.F" type="tests.Pointer.F" key="0" id="0">
63             <int key="value" id="1">9</int>
64             <pointer key="ptr" id="2">
65                 <reference key="1">1</reference>
66             </pointer>
67             <pointer key="ptr2" id="3">
68                 <int key="2" id="4">3</int>
69             </pointer>
70         </object>
71     </data>
72 </archive>
73 xml";
74             serializer.reset();
75             serializer.serialize(f);
76 
77             assert(expected.equalToXml(archive.data));
78         };
79     };
80 
81     describe("deserialize pointer") in {
82         fDeserialized = serializer.deserialize!(F)(archive.untypedData);
83 
84         it("should return a deserialized pointer equal to the original pointer") in {
85             assert(*f.ptr == *fDeserialized.ptr);
86         };
87 
88         it("the pointer should point to the deserialized value") in {
89             assert(fDeserialized.ptr == &fDeserialized.value);
90         };
91     };
92 
93     describe("serialize pointer out of order") in {
94         it("should return a serialized pointer") in {
95             auto expected = q"xml
96 <?xml version="1.0" encoding="UTF-8"?>
97 <archive version="1.0.0" type="org.dsource.orange.xml">
98     <data>
99         <object runtimeType="tests.Pointer.OutOfOrder" type="tests.Pointer.OutOfOrder" key="0" id="0">
100             <pointer key="ptr" id="1">
101                 <int key="1" id="2">9</int>
102             </pointer>
103             <reference key="value">1</reference>
104             <pointer key="ptr2" id="4">
105                 <int key="2" id="5">3</int>
106             </pointer>
107         </object>
108     </data>
109 </archive>
110 xml";
111             serializer.reset();
112             serializer.serialize(outOfOrder);
113 
114             assert(expected.equalToXml(archive.data));
115         };
116     };
117 
118     describe("deserialize pointer out of order") in {
119         outOfOrderDeserialized = serializer.deserialize!(OutOfOrder)(archive.untypedData);
120 
121         it("should return a deserialized pointer equal to the original pointer") in {
122             assert(*outOfOrder.ptr == *outOfOrderDeserialized.ptr);
123         };
124 
125         it("the pointer should point to the deserialized value") in {
126             assert(outOfOrderDeserialized.ptr == &outOfOrderDeserialized.value);
127         };
128     };
129 }