All files
[pithos-ms-client] / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / Serialization / CamelCasePropertyNamesContractResolverTests.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 using System;
27 using System.Collections.Generic;
28 using System.Linq;
29 using System.Text;
30 using Newtonsoft.Json.Serialization;
31 using NUnit.Framework;
32 using Newtonsoft.Json.Tests.TestObjects;
33 using Newtonsoft.Json.Linq;
34 using System.Reflection;
35 using Newtonsoft.Json.Utilities;
36
37 namespace Newtonsoft.Json.Tests.Serialization
38 {
39   public class CamelCasePropertyNamesContractResolverTests : TestFixtureBase
40   {
41     [Test]
42     public void JsonConvertSerializerSettings()
43     {
44       Person person = new Person();
45       person.BirthDate = new DateTime(2000, 11, 20, 23, 55, 44, DateTimeKind.Utc);
46       person.LastModified = new DateTime(2000, 11, 20, 23, 55, 44, DateTimeKind.Utc);
47       person.Name = "Name!";
48
49       string json = JsonConvert.SerializeObject(person, Formatting.Indented, new JsonSerializerSettings
50                                                                {
51                                                                  ContractResolver = new CamelCasePropertyNamesContractResolver()
52                                                                });
53
54       Assert.AreEqual(@"{
55   ""name"": ""Name!"",
56   ""birthDate"": ""\/Date(974764544000)\/"",
57   ""lastModified"": ""\/Date(974764544000)\/""
58 }", json);
59
60       Person deserializedPerson = JsonConvert.DeserializeObject<Person>(json, new JsonSerializerSettings
61                                                                         {
62                                                                           ContractResolver = new CamelCasePropertyNamesContractResolver()
63                                                                         });
64
65       Assert.AreEqual(person.BirthDate, deserializedPerson.BirthDate);
66       Assert.AreEqual(person.LastModified, deserializedPerson.LastModified);
67       Assert.AreEqual(person.Name, deserializedPerson.Name);
68
69       json = JsonConvert.SerializeObject(person, Formatting.Indented);
70       Assert.AreEqual(@"{
71   ""Name"": ""Name!"",
72   ""BirthDate"": ""\/Date(974764544000)\/"",
73   ""LastModified"": ""\/Date(974764544000)\/""
74 }", json);
75
76     }
77
78     [Test]
79     public void JTokenWriter()
80     {
81       JsonIgnoreAttributeOnClassTestClass ignoreAttributeOnClassTestClass = new JsonIgnoreAttributeOnClassTestClass();
82       ignoreAttributeOnClassTestClass.Field = int.MinValue;
83
84       JsonSerializer serializer = new JsonSerializer();
85       serializer.ContractResolver = new CamelCasePropertyNamesContractResolver();
86
87       JTokenWriter writer = new JTokenWriter();
88
89       serializer.Serialize(writer, ignoreAttributeOnClassTestClass);
90
91       JObject o = (JObject) writer.Token;
92       JProperty p = o.Property("theField");
93
94       Assert.IsNotNull(p);
95       Assert.AreEqual(int.MinValue, (int)p.Value);
96
97       string json = o.ToString();
98     }
99
100     [Test]
101     public void MemberSearchFlags()
102     {
103       PrivateMembersClass privateMembersClass = new PrivateMembersClass("PrivateString!", "InternalString!");
104
105       string json = JsonConvert.SerializeObject(privateMembersClass, Formatting.Indented, new JsonSerializerSettings
106       {
107         ContractResolver = new CamelCasePropertyNamesContractResolver { DefaultMembersSearchFlags = BindingFlags.NonPublic | BindingFlags.Instance }
108       });
109
110       Assert.AreEqual(@"{
111   ""_privateString"": ""PrivateString!"",
112   ""i"": 0,
113   ""_internalString"": ""InternalString!""
114 }", json);
115
116       PrivateMembersClass deserializedPrivateMembersClass = JsonConvert.DeserializeObject<PrivateMembersClass>(@"{
117   ""_privateString"": ""Private!"",
118   ""i"": -2,
119   ""_internalString"": ""Internal!""
120 }", new JsonSerializerSettings
121       {
122         ContractResolver = new CamelCasePropertyNamesContractResolver { DefaultMembersSearchFlags = BindingFlags.NonPublic | BindingFlags.Instance }
123       });
124
125       Assert.AreEqual("Private!", ReflectionUtils.GetMemberValue(typeof(PrivateMembersClass).GetField("_privateString", BindingFlags.Instance | BindingFlags.NonPublic), deserializedPrivateMembersClass));
126       Assert.AreEqual("Internal!", ReflectionUtils.GetMemberValue(typeof(PrivateMembersClass).GetField("_internalString", BindingFlags.Instance | BindingFlags.NonPublic), deserializedPrivateMembersClass));
127
128       // readonly
129       Assert.AreEqual(0, ReflectionUtils.GetMemberValue(typeof(PrivateMembersClass).GetField("i", BindingFlags.Instance | BindingFlags.NonPublic), deserializedPrivateMembersClass));
130     }
131
132     [Test]
133     public void BlogPostExample()
134     {
135       Product product = new Product
136                           {
137                             ExpiryDate = new DateTime(2010, 12, 20, 18, 1, 0, DateTimeKind.Utc),
138                             Name = "Widget",
139                             Price = 9.99m,
140                             Sizes = new[] {"Small", "Medium", "Large"}
141                           };
142
143       string json = 
144         JsonConvert.SerializeObject(
145           product,
146           Formatting.Indented,
147           new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }
148         );
149
150       //{
151       //  "name": "Widget",
152       //  "expiryDate": "\/Date(1292868060000)\/",
153       //  "price": 9.99,
154       //  "sizes": [
155       //    "Small",
156       //    "Medium",
157       //    "Large"
158       //  ]
159       //}
160
161       Assert.AreEqual(@"{
162   ""name"": ""Widget"",
163   ""expiryDate"": ""\/Date(1292868060000)\/"",
164   ""price"": 9.99,
165   ""sizes"": [
166     ""Small"",
167     ""Medium"",
168     ""Large""
169   ]
170 }", json);
171     }
172
173 #if !(NET35 || NET20 || WINDOWS_PHONE)
174     [Test]
175     public void DynamicCamelCasePropertyNames()
176     {
177       dynamic o = new DynamicTests.TestDynamicObject();
178       o.Text = "Text!";
179       o.Integer = int.MaxValue;
180
181       string json = JsonConvert.SerializeObject(o, Formatting.Indented,
182         new JsonSerializerSettings
183         {
184           ContractResolver = new CamelCasePropertyNamesContractResolver()
185         });
186
187       Assert.AreEqual(@"{
188   ""text"": ""Text!"",
189   ""integer"": 2147483647,
190   ""int"": 0,
191   ""childObject"": null
192 }", json);
193     }
194 #endif
195
196     [Test]
197     public void DictionaryCamelCasePropertyNames()
198     {
199       Dictionary<string, string> values = new Dictionary<string, string>
200         {
201           {"First", "Value1!"},
202           {"Second", "Value2!"}
203         };
204
205       string json = JsonConvert.SerializeObject(values, Formatting.Indented,
206         new JsonSerializerSettings
207         {
208           ContractResolver = new CamelCasePropertyNamesContractResolver()
209         });
210
211       Assert.AreEqual(@"{
212   ""first"": ""Value1!"",
213   ""second"": ""Value2!""
214 }", json);
215     }
216   }
217 }