~ubuntu-branches/ubuntu/trusty/monodevelop/trusty-proposed

« back to all changes in this revision

Viewing changes to external/Newtonsoft.Json/Src/Newtonsoft.Json.Tests/Serialization/SerializationEventAttributeTests.cs

  • Committer: Package Import Robot
  • Author(s): Jo Shields
  • Date: 2013-05-12 09:46:03 UTC
  • mto: This revision was merged to the branch mainline in revision 29.
  • Revision ID: package-import@ubuntu.com-20130512094603-mad323bzcxvmcam0
Tags: upstream-4.0.5+dfsg
ImportĀ upstreamĀ versionĀ 4.0.5+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.Diagnostics;
 
29
using System.IO;
 
30
using System.Reflection;
 
31
using System.Runtime.Serialization;
 
32
using Newtonsoft.Json.Serialization;
 
33
using Newtonsoft.Json.Tests.TestObjects;
 
34
#if !NETFX_CORE
 
35
using NUnit.Framework;
 
36
#else
 
37
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
 
38
using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
 
39
using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
 
40
#endif
 
41
using Newtonsoft.Json.Linq;
 
42
using Newtonsoft.Json.Utilities;
 
43
 
 
44
namespace Newtonsoft.Json.Tests.Serialization
 
45
{
 
46
  [TestFixture]
 
47
  public class SerializationEventAttributeTests : TestFixtureBase
 
48
  {
 
49
    [Test]
 
50
    public void ObjectEvents()
 
51
    {
 
52
      SerializationEventTestObject obj = new SerializationEventTestObject();
 
53
 
 
54
      Assert.AreEqual(11, obj.Member1);
 
55
      Assert.AreEqual("Hello World!", obj.Member2);
 
56
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
57
      Assert.AreEqual(null, obj.Member4);
 
58
      Assert.AreEqual(null, obj.Member5);
 
59
 
 
60
      string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
 
61
      Assert.AreEqual(@"{
 
62
  ""Member1"": 11,
 
63
  ""Member2"": ""This value went into the data file during serialization."",
 
64
  ""Member4"": null
 
65
}", json);
 
66
 
 
67
      Assert.AreEqual(11, obj.Member1);
 
68
      Assert.AreEqual("This value was reset after serialization.", obj.Member2);
 
69
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
70
      Assert.AreEqual(null, obj.Member4);
 
71
      Assert.AreEqual("Error message for member Member6 = Error getting value from 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
 
72
 
 
73
      JObject o = JObject.Parse(@"{
 
74
  ""Member1"": 11,
 
75
  ""Member2"": ""This value went into the data file during serialization."",
 
76
  ""Member4"": null
 
77
}");
 
78
      o["Member6"] = "Dummy text for error";
 
79
 
 
80
      obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(o.ToString());
 
81
 
 
82
      Assert.AreEqual(11, obj.Member1);
 
83
      Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
 
84
      Assert.AreEqual("This value was set during deserialization", obj.Member3);
 
85
      Assert.AreEqual("This value was set after deserialization.", obj.Member4);
 
86
      Assert.AreEqual("Error message for member Member6 = Error setting value to 'Member6' on 'Newtonsoft.Json.Tests.TestObjects.SerializationEventTestObject'.", obj.Member5);
 
87
    }
 
88
 
 
89
    [Test]
 
90
    public void ObjectWithConstructorEvents()
 
91
    {
 
92
      SerializationEventTestObjectWithConstructor obj = new SerializationEventTestObjectWithConstructor(11, "Hello World!", null);
 
93
 
 
94
      Assert.AreEqual(11, obj.Member1);
 
95
      Assert.AreEqual("Hello World!", obj.Member2);
 
96
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
97
      Assert.AreEqual(null, obj.Member4);
 
98
 
 
99
      string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
 
100
      Assert.AreEqual(@"{
 
101
  ""Member1"": 11,
 
102
  ""Member2"": ""This value went into the data file during serialization."",
 
103
  ""Member4"": null
 
104
}", json);
 
105
 
 
106
      Assert.AreEqual(11, obj.Member1);
 
107
      Assert.AreEqual("This value was reset after serialization.", obj.Member2);
 
108
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
109
      Assert.AreEqual(null, obj.Member4);
 
110
 
 
111
      obj = JsonConvert.DeserializeObject<SerializationEventTestObjectWithConstructor>(json);
 
112
 
 
113
      Assert.AreEqual(11, obj.Member1);
 
114
      Assert.AreEqual("This value went into the data file during serialization.", obj.Member2);
 
115
      Assert.AreEqual("This value was set during deserialization", obj.Member3);
 
116
      Assert.AreEqual("This value was set after deserialization.", obj.Member4);
 
117
    }
 
118
 
 
119
    [Test]
 
120
    public void ListEvents()
 
121
    {
 
122
      SerializationEventTestList obj = new SerializationEventTestList
 
123
        {
 
124
          1.1m,
 
125
          2.222222222m,
 
126
          int.MaxValue,
 
127
          Convert.ToDecimal(Math.PI)
 
128
        };
 
129
 
 
130
      Assert.AreEqual(11, obj.Member1);
 
131
      Assert.AreEqual("Hello World!", obj.Member2);
 
132
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
133
      Assert.AreEqual(null, obj.Member4);
 
134
 
 
135
      string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
 
136
      Assert.AreEqual(@"[
 
137
  -1.0,
 
138
  1.1,
 
139
  2.222222222,
 
140
  2147483647.0,
 
141
  3.14159265358979
 
142
]", json);
 
143
 
 
144
      Assert.AreEqual(11, obj.Member1);
 
145
      Assert.AreEqual("This value was reset after serialization.", obj.Member2);
 
146
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
147
      Assert.AreEqual(null, obj.Member4);
 
148
 
 
149
      obj = JsonConvert.DeserializeObject<SerializationEventTestList>(json);
 
150
 
 
151
      Assert.AreEqual(11, obj.Member1);
 
152
      Assert.AreEqual("Hello World!", obj.Member2);
 
153
      Assert.AreEqual("This value was set during deserialization", obj.Member3);
 
154
      Assert.AreEqual("This value was set after deserialization.", obj.Member4);
 
155
    }
 
156
 
 
157
    [Test]
 
158
    public void DictionaryEvents()
 
159
    {
 
160
      SerializationEventTestDictionary obj = new SerializationEventTestDictionary
 
161
        {
 
162
          { 1.1m, "first" },
 
163
          { 2.222222222m, "second" },
 
164
          { int.MaxValue, "third" },
 
165
          { Convert.ToDecimal(Math.PI), "fourth" }
 
166
        };
 
167
 
 
168
      Assert.AreEqual(11, obj.Member1);
 
169
      Assert.AreEqual("Hello World!", obj.Member2);
 
170
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
171
      Assert.AreEqual(null, obj.Member4);
 
172
 
 
173
      string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
 
174
      Assert.AreEqual(@"{
 
175
  ""1.1"": ""first"",
 
176
  ""2.222222222"": ""second"",
 
177
  ""2147483647"": ""third"",
 
178
  ""3.14159265358979"": ""fourth"",
 
179
  ""79228162514264337593543950335"": ""Inserted on serializing""
 
180
}", json);
 
181
 
 
182
      Assert.AreEqual(11, obj.Member1);
 
183
      Assert.AreEqual("This value was reset after serialization.", obj.Member2);
 
184
      Assert.AreEqual("This is a nonserialized value", obj.Member3);
 
185
      Assert.AreEqual(null, obj.Member4);
 
186
 
 
187
      obj = JsonConvert.DeserializeObject<SerializationEventTestDictionary>(json);
 
188
 
 
189
      Assert.AreEqual(11, obj.Member1);
 
190
      Assert.AreEqual("Hello World!", obj.Member2);
 
191
      Assert.AreEqual("This value was set during deserialization", obj.Member3);
 
192
      Assert.AreEqual("This value was set after deserialization.", obj.Member4);
 
193
    }
 
194
 
 
195
    [Test]
 
196
    public void ObjectEventsDocumentationExample()
 
197
    {
 
198
      SerializationEventTestObject obj = new SerializationEventTestObject();
 
199
 
 
200
      Console.WriteLine(obj.Member1);
 
201
      // 11
 
202
      Console.WriteLine(obj.Member2);
 
203
      // Hello World!
 
204
      Console.WriteLine(obj.Member3);
 
205
      // This is a nonserialized value
 
206
      Console.WriteLine(obj.Member4);
 
207
      // null
 
208
      Console.WriteLine(obj.Member5);
 
209
      // null
 
210
 
 
211
      string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
 
212
      // {
 
213
      //   "Member1": 11,
 
214
      //   "Member2": "This value went into the data file during serialization.",
 
215
      //   "Member4": null
 
216
      // }
 
217
 
 
218
      Console.WriteLine(obj.Member1);
 
219
      // 11
 
220
      Console.WriteLine(obj.Member2);
 
221
      // This value was reset after serialization.
 
222
      Console.WriteLine(obj.Member3);
 
223
      // This is a nonserialized value
 
224
      Console.WriteLine(obj.Member4);
 
225
      // null
 
226
      Console.WriteLine(obj.Member5);
 
227
      // Error message for member Member6 = Exception has been thrown by the target of an invocation.
 
228
 
 
229
      obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
 
230
 
 
231
      Console.WriteLine(obj.Member1);
 
232
      // 11
 
233
      Console.WriteLine(obj.Member2);
 
234
      // This value went into the data file during serialization.
 
235
      Console.WriteLine(obj.Member3);
 
236
      // This value was set during deserialization
 
237
      Console.WriteLine(obj.Member4);
 
238
      // This value was set after deserialization.
 
239
    }
 
240
 
 
241
    public class SerializationEventBaseTestObject
 
242
    {
 
243
      public string TestMember { get; set; }
 
244
 
 
245
      [OnSerializing]
 
246
      internal void OnSerializingMethod(StreamingContext context)
 
247
      {
 
248
        TestMember = "Set!";
 
249
      }
 
250
    }
 
251
 
 
252
    public class SerializationEventContextSubClassTestObject : SerializationEventBaseTestObject
 
253
    {
 
254
    }
 
255
 
 
256
    [Test]
 
257
    public void SerializationEventContextTestObjectSubClassTest()
 
258
    {
 
259
      SerializationEventContextSubClassTestObject obj = new SerializationEventContextSubClassTestObject();
 
260
 
 
261
      string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
 
262
      Assert.AreEqual(@"{
 
263
  ""TestMember"": ""Set!""
 
264
}", json);
 
265
    }
 
266
 
 
267
#if !SILVERLIGHT && !NETFX_CORE
 
268
    public class SerializationEventContextTestObject
 
269
    {
 
270
      public string TestMember { get; set; }
 
271
 
 
272
      [OnSerializing]
 
273
      internal void OnSerializingMethod(StreamingContext context)
 
274
      {
 
275
        TestMember = context.State + " " + context.Context;
 
276
      }
 
277
    }
 
278
 
 
279
    [Test]
 
280
    public void SerializationEventContextTest()
 
281
    {
 
282
      SerializationEventContextTestObject value = new SerializationEventContextTestObject();
 
283
 
 
284
      string json = JsonConvert.SerializeObject(value, Formatting.Indented, new JsonSerializerSettings
 
285
                                                                              {
 
286
                                                                                Context =
 
287
                                                                                  new StreamingContext(
 
288
                                                                                  StreamingContextStates.Remoting,
 
289
                                                                                  "ContextValue")
 
290
                                                                              });
 
291
 
 
292
      Assert.AreEqual(@"{
 
293
  ""TestMember"": ""Remoting ContextValue""
 
294
}", json);
 
295
    }
 
296
#endif
 
297
 
 
298
    public void WhenSerializationErrorDetectedBySerializer_ThenCallbackIsCalled()
 
299
    {
 
300
      // Verify contract is properly finding our callback
 
301
      var resolver = new DefaultContractResolver().ResolveContract(typeof(FooEvent));
 
302
 
 
303
      Debug.Assert(resolver.OnError != null);
 
304
      Debug.Assert(resolver.OnError == typeof(FooEvent).GetMethod("OnError", BindingFlags.Instance | BindingFlags.NonPublic));
 
305
 
 
306
      var serializer = JsonSerializer.Create(new JsonSerializerSettings
 
307
      {
 
308
        // If I don't specify Error here, the callback isn't called
 
309
        // either, but no exception is thrown.
 
310
        MissingMemberHandling = MissingMemberHandling.Error,
 
311
      });
 
312
 
 
313
      // This throws with missing member exception, rather than calling my callback.
 
314
      var foo = serializer.Deserialize<FooEvent>(new JsonTextReader(new StringReader("{ Id: 25 }")));
 
315
 
 
316
      // When fixed, this would pass.
 
317
      Debug.Assert(foo.Identifier == 25);
 
318
    }
 
319
 
 
320
    public class FooEvent
 
321
    {
 
322
      public int Identifier { get; set; }
 
323
 
 
324
      [OnError]
 
325
      private void OnError(StreamingContext context, ErrorContext error)
 
326
      {
 
327
        this.Identifier = 25;
 
328
 
 
329
        // Here we could for example manually copy the
 
330
        // persisted "Id" value into the renamed "Identifier"
 
331
        // property, etc.
 
332
        error.Handled = true;
 
333
 
 
334
        // We never get here :(
 
335
        Console.WriteLine("Error has been fixed");
 
336
      }
 
337
    }
 
338
  }
 
339
}
 
340
#endif
 
 
b'\\ No newline at end of file'