Version
[pithos-ms-client] / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / Serialization / SerializationEventAttributeTests.cs
1 #region License
2 // Copyright (c) 2007 James Newton-King
3 //
4 // Permission is hereby granted, free of charge, to any person
5 // obtaining a copy of this software and associated documentation
6 // files (the "Software"), to deal in the Software without
7 // restriction, including without limitation the rights to use,
8 // copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the
10 // Software is furnished to do so, subject to the following
11 // conditions:
12 //
13 // The above copyright notice and this permission notice shall be
14 // included in all copies or substantial portions of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18 // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 // OTHER DEALINGS IN THE SOFTWARE.
24 #endregion
25
26 #if !PocketPC
27 using System;
28 using System.IO;
29 using System.Linq;
30 using System.Reflection;
31 using System.Runtime.Serialization;
32 using System.Text;
33 using Newtonsoft.Json.Tests;
34 using Newtonsoft.Json.Tests.TestObjects;
35 using NUnit.Framework;
36 using Newtonsoft.Json.Linq;
37 using Newtonsoft.Json.Converters;
38
39 namespace Newtonsoft.Json.Tests.Serialization
40 {
41   public class SerializationEventAttributeTests : TestFixtureBase
42   {
43     [Test]
44     public void ObjectEvents()
45     {
46       SerializationEventTestObject obj = new SerializationEventTestObject();
47
48       Assert.AreEqual(11, obj.Member1);
49       Assert.AreEqual("Hello World!", obj.Member2);
50       Assert.AreEqual("This is a nonserialized value", obj.Member3);
51       Assert.AreEqual(null, obj.Member4);
52       Assert.AreEqual(null, obj.Member5);
53
54       string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
55       Assert.AreEqual(@"{
56   ""Member1"": 11,
57   ""Member2"": ""This value went into the data file during serialization."",
58   ""Member4"": null
59 }", json);
60
61       Assert.AreEqual(11, obj.Member1);
62       Assert.AreEqual("This value was reset after serialization.", obj.Member2);
63       Assert.AreEqual("This is a nonserialized value", obj.Member3);
64       Assert.AreEqual(null, obj.Member4);
65       Assert.AreEqual("Error message for member Member6 = Error getting value from 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
66
67       JObject o = JObject.Parse(@"{
68   ""Member1"": 11,
69   ""Member2"": ""This value went into the data file during serialization."",
70   ""Member4"": null
71 }");
72       o["Member6"] = "Dummy text for error";
73
74       obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(o.ToString());
75
76       Assert.AreEqual(11, obj.Member1);
77       Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
78       Assert.AreEqual("This value was set during deserialization", obj.Member3);
79       Assert.AreEqual("This value was set after deserialization.", obj.Member4);
80       Assert.AreEqual("Error message for member Member6 = Error setting value to 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
81     }
82
83     [Test]
84     public void ObjectWithConstructorEvents()
85     {
86       SerializationEventTestObjectWithConstructor obj = new SerializationEventTestObjectWithConstructor(11, "Hello World!", null);
87
88       Assert.AreEqual(11, obj.Member1);
89       Assert.AreEqual("Hello World!", obj.Member2);
90       Assert.AreEqual("This is a nonserialized value", obj.Member3);
91       Assert.AreEqual(null, obj.Member4);
92
93       string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
94       Assert.AreEqual(@"{
95   ""Member1"": 11,
96   ""Member2"": ""This value went into the data file during serialization."",
97   ""Member4"": null
98 }", json);
99
100       Assert.AreEqual(11, obj.Member1);
101       Assert.AreEqual("This value was reset after serialization.", obj.Member2);
102       Assert.AreEqual("This is a nonserialized value", obj.Member3);
103       Assert.AreEqual(null, obj.Member4);
104
105       obj = JsonConvert.DeserializeObject<SerializationEventTestObjectWithConstructor>(json);
106
107       Assert.AreEqual(11, obj.Member1);
108       Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
109       Assert.AreEqual("This value was set during deserialization", obj.Member3);
110       Assert.AreEqual("This value was set after deserialization.", obj.Member4);
111     }
112
113     [Test]
114     public void ListEvents()
115     {
116       SerializationEventTestList obj = new SerializationEventTestList
117         {
118           1.1m,
119           2.222222222m,
120           int.MaxValue,
121           Convert.ToDecimal(Math.PI)
122         };
123
124       Assert.AreEqual(11, obj.Member1);
125       Assert.AreEqual("Hello World!", obj.Member2);
126       Assert.AreEqual("This is a nonserialized value", obj.Member3);
127       Assert.AreEqual(null, obj.Member4);
128
129       string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
130       Assert.AreEqual(@"[
131   -1.0,
132   1.1,
133   2.222222222,
134   2147483647.0,
135   3.14159265358979
136 ]", json);
137
138       Assert.AreEqual(11, obj.Member1);
139       Assert.AreEqual("This value was reset after serialization.", obj.Member2);
140       Assert.AreEqual("This is a nonserialized value", obj.Member3);
141       Assert.AreEqual(null, obj.Member4);
142
143       obj = JsonConvert.DeserializeObject<SerializationEventTestList>(json);
144
145       Assert.AreEqual(11, obj.Member1);
146       Assert.AreEqual("Hello World!", obj.Member2);
147       Assert.AreEqual("This value was set during deserialization", obj.Member3);
148       Assert.AreEqual("This value was set after deserialization.", obj.Member4);
149     }
150
151     [Test]
152     public void DictionaryEvents()
153     {
154       SerializationEventTestDictionary obj = new SerializationEventTestDictionary
155         {
156           { 1.1m, "first" },
157           { 2.222222222m, "second" },
158           { int.MaxValue, "third" },
159           { Convert.ToDecimal(Math.PI), "fourth" }
160         };
161
162       Assert.AreEqual(11, obj.Member1);
163       Assert.AreEqual("Hello World!", obj.Member2);
164       Assert.AreEqual("This is a nonserialized value", obj.Member3);
165       Assert.AreEqual(null, obj.Member4);
166
167       string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
168       Assert.AreEqual(@"{
169   ""1.1"": ""first"",
170   ""2.222222222"": ""second"",
171   ""2147483647"": ""third"",
172   ""3.14159265358979"": ""fourth"",
173   ""79228162514264337593543950335"": ""Inserted on serializing""
174 }", json);
175
176       Assert.AreEqual(11, obj.Member1);
177       Assert.AreEqual("This value was reset after serialization.", obj.Member2);
178       Assert.AreEqual("This is a nonserialized value", obj.Member3);
179       Assert.AreEqual(null, obj.Member4);
180
181       obj = JsonConvert.DeserializeObject<SerializationEventTestDictionary>(json);
182
183       Assert.AreEqual(11, obj.Member1);
184       Assert.AreEqual("Hello World!", obj.Member2);
185       Assert.AreEqual("This value was set during deserialization", obj.Member3);
186       Assert.AreEqual("This value was set after deserialization.", obj.Member4);
187     }
188
189     [Test]
190     public void ObjectEventsDocumentationExample()
191     {
192       SerializationEventTestObject obj = new SerializationEventTestObject();
193
194       Console.WriteLine(obj.Member1);
195       // 11
196       Console.WriteLine(obj.Member2);
197       // Hello World!
198       Console.WriteLine(obj.Member3);
199       // This is a nonserialized value
200       Console.WriteLine(obj.Member4);
201       // null
202       Console.WriteLine(obj.Member5);
203       // null
204
205       string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
206       // {
207       //   "Member1": 11,
208       //   "Member2": "This value went into the data file during serialization.",
209       //   "Member4": null
210       // }
211
212       Console.WriteLine(obj.Member1);
213       // 11
214       Console.WriteLine(obj.Member2);
215       // This value was reset after serialization.
216       Console.WriteLine(obj.Member3);
217       // This is a nonserialized value
218       Console.WriteLine(obj.Member4);
219       // null
220       Console.WriteLine(obj.Member5);
221       // Error message for member Member6 = Exception has been thrown by the target of an invocation.
222
223       obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
224
225       Console.WriteLine(obj.Member1);
226       // 11
227       Console.WriteLine(obj.Member2);
228       // This value went into the data file during serialization.
229       Console.WriteLine(obj.Member3);
230       // This value was set during deserialization
231       Console.WriteLine(obj.Member4);
232       // This value was set after deserialization.
233     }
234
235 #if !SILVERLIGHT
236     public class SerializationEventContextTestObject
237     {
238       public string TestMember { get; set; }
239
240       [OnSerializing]
241       internal void OnSerializingMethod(StreamingContext context)
242       {
243         TestMember = context.State + " " + context.Context;
244       }
245     }
246
247     [Test]
248     public void SerializationEventContextTest()
249     {
250       SerializationEventContextTestObject value = new SerializationEventContextTestObject();
251
252       string json = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings
253                                                                               {
254                                                                                 Context =
255                                                                                   new StreamingContext(
256                                                                                   StreamingContextStates.Remoting,
257                                                                                   "ContextValue")
258                                                                               });
259
260       Assert.AreEqual(@"{
261   ""TestMember"": ""Remoting ContextValue""
262 }", json);
263     }
264 #endif
265   }
266 }
267 #endif