2 // DataContractJsonSerializerTest.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
6 // Ankit Jain <JAnkit@novell.com>
7 // Antoine Cailliau <antoinecailliau@gmail.com>
9 // Copyright (C) 2005-2007 Novell, Inc. http://www.novell.com
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 // This test code contains tests for DataContractJsonSerializer, which is
34 // imported from DataContractSerializerTest.cs.
38 using System.Collections;
39 using System.Collections.Generic;
40 using System.Collections.ObjectModel;
43 using System.Runtime.Serialization;
44 using System.Runtime.Serialization.Json;
47 using NUnit.Framework;
49 namespace MonoTests.System.Runtime.Serialization.Json
52 public class DataContractJsonSerializerTest
54 static readonly XmlWriterSettings settings;
56 static DataContractJsonSerializerTest ()
58 settings = new XmlWriterSettings ();
59 settings.OmitXmlDeclaration = true;
66 public string Member1;
70 [ExpectedException (typeof (ArgumentNullException))]
71 public void ConstructorTypeNull ()
73 new DataContractJsonSerializer (null);
77 public void ConstructorKnownTypesNull ()
79 // null knownTypes is allowed.
80 new DataContractJsonSerializer (typeof (Sample1), (IEnumerable<Type>) null);
81 new DataContractJsonSerializer (typeof (Sample1), "Foo", null);
85 [ExpectedException (typeof (ArgumentNullException))]
86 public void ConstructorNameNull ()
88 new DataContractJsonSerializer (typeof (Sample1), (string) null);
92 [ExpectedException (typeof (ArgumentOutOfRangeException))]
93 public void ConstructorNegativeMaxObjects ()
95 new DataContractJsonSerializer (typeof (Sample1), "Sample1",
96 null, -1, false, null, false);
100 public void ConstructorMisc ()
102 new DataContractJsonSerializer (typeof (GlobalSample1)).WriteObject (new MemoryStream (), new GlobalSample1 ());
106 public void WriteObjectContent ()
108 StringWriter sw = new StringWriter ();
109 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
110 DataContractJsonSerializer ser =
111 new DataContractJsonSerializer (typeof (string));
112 xw.WriteStartElement ("my-element");
113 ser.WriteObjectContent (xw, "TEST STRING");
114 xw.WriteEndElement ();
116 Assert.AreEqual ("<my-element>TEST STRING</my-element>",
123 public void SerializeIntXml ()
125 StringWriter sw = new StringWriter ();
126 SerializeInt (XmlWriter.Create (sw, settings));
128 @"<root type=""number"">1</root>",
133 public void SerializeIntJson ()
135 MemoryStream ms = new MemoryStream ();
136 SerializeInt (JsonReaderWriterFactory.CreateJsonWriter (ms));
139 Encoding.UTF8.GetString (ms.ToArray ()));
142 void SerializeInt (XmlWriter writer)
144 DataContractJsonSerializer ser =
145 new DataContractJsonSerializer (typeof (int));
146 using (XmlWriter w = writer) {
147 ser.WriteObject (w, 1);
151 // int, with rootName
154 public void SerializeIntXmlWithRootName ()
156 StringWriter sw = new StringWriter ();
157 SerializeIntWithRootName (XmlWriter.Create (sw, settings));
159 @"<myroot type=""number"">1</myroot>",
164 // since JsonWriter supports only "root" as the root name, using
165 // XmlWriter from JsonReaderWriterFactory will always fail with
166 // an explicit rootName.
167 [ExpectedException (typeof (SerializationException))]
168 public void SerializeIntJsonWithRootName ()
170 MemoryStream ms = new MemoryStream ();
171 SerializeIntWithRootName (JsonReaderWriterFactory.CreateJsonWriter (ms));
174 Encoding.UTF8.GetString (ms.ToArray ()));
177 void SerializeIntWithRootName (XmlWriter writer)
179 DataContractJsonSerializer ser =
180 new DataContractJsonSerializer (typeof (int), "myroot");
181 using (XmlWriter w = writer) {
182 ser.WriteObject (w, 1);
186 // pass typeof(DCEmpty), serialize int
189 public void SerializeIntForDCEmptyXml ()
191 StringWriter sw = new StringWriter ();
192 SerializeIntForDCEmpty (XmlWriter.Create (sw, settings));
194 @"<root type=""number"">1</root>",
199 public void SerializeIntForDCEmptyJson ()
201 MemoryStream ms = new MemoryStream ();
202 SerializeIntForDCEmpty (JsonReaderWriterFactory.CreateJsonWriter (ms));
205 Encoding.UTF8.GetString (ms.ToArray ()));
208 void SerializeIntForDCEmpty (XmlWriter writer)
210 DataContractJsonSerializer ser =
211 new DataContractJsonSerializer (typeof (DCEmpty));
212 using (XmlWriter w = writer) {
213 ser.WriteObject (w, 1);
220 public void SerializeEmptyClassXml ()
222 StringWriter sw = new StringWriter ();
223 SerializeEmptyClass (XmlWriter.Create (sw, settings));
225 @"<root type=""object"" />",
230 public void SerializeEmptyClassJson ()
232 MemoryStream ms = new MemoryStream ();
233 SerializeEmptyClass (JsonReaderWriterFactory.CreateJsonWriter (ms));
236 Encoding.UTF8.GetString (ms.ToArray ()));
239 void SerializeEmptyClass (XmlWriter writer)
241 DataContractJsonSerializer ser =
242 new DataContractJsonSerializer (typeof (DCEmpty));
243 using (XmlWriter w = writer) {
244 ser.WriteObject (w, new DCEmpty ());
248 // string (primitive)
251 public void SerializePrimitiveStringXml ()
253 StringWriter sw = new StringWriter ();
254 SerializePrimitiveString (XmlWriter.Create (sw, settings));
261 public void SerializePrimitiveStringJson ()
263 MemoryStream ms = new MemoryStream ();
264 SerializePrimitiveString (JsonReaderWriterFactory.CreateJsonWriter (ms));
267 Encoding.UTF8.GetString (ms.ToArray ()));
270 void SerializePrimitiveString (XmlWriter writer)
272 XmlObjectSerializer ser =
273 new DataContractJsonSerializer (typeof (string));
274 using (XmlWriter w = writer) {
275 ser.WriteObject (w, "TEST");
279 // QName (primitive but ...)
282 public void SerializePrimitiveQNameXml ()
284 StringWriter sw = new StringWriter ();
285 SerializePrimitiveQName (XmlWriter.Create (sw, settings));
287 "<root>foo:urn:foo</root>",
292 public void SerializePrimitiveQNameJson ()
294 MemoryStream ms = new MemoryStream ();
295 SerializePrimitiveQName (JsonReaderWriterFactory.CreateJsonWriter (ms));
298 Encoding.UTF8.GetString (ms.ToArray ()));
301 void SerializePrimitiveQName (XmlWriter writer)
303 XmlObjectSerializer ser =
304 new DataContractJsonSerializer (typeof (XmlQualifiedName));
305 using (XmlWriter w = writer) {
306 ser.WriteObject (w, new XmlQualifiedName ("foo", "urn:foo"));
310 // DBNull (primitive)
313 public void SerializeDBNullXml ()
315 StringWriter sw = new StringWriter ();
316 SerializeDBNull (XmlWriter.Create (sw, settings));
318 @"<root type=""object"" />",
323 public void SerializeDBNullJson ()
325 MemoryStream ms = new MemoryStream ();
326 SerializeDBNull (JsonReaderWriterFactory.CreateJsonWriter (ms));
329 Encoding.UTF8.GetString (ms.ToArray ()));
332 void SerializeDBNull (XmlWriter writer)
334 DataContractJsonSerializer ser =
335 new DataContractJsonSerializer (typeof (DBNull));
336 using (XmlWriter w = writer) {
337 ser.WriteObject (w, DBNull.Value);
344 public void SerializeSimpleClass1Xml ()
346 StringWriter sw = new StringWriter ();
347 SerializeSimpleClass1 (XmlWriter.Create (sw, settings));
349 @"<root type=""object""><Foo>TEST</Foo></root>",
354 public void SerializeSimpleClass1Json ()
356 MemoryStream ms = new MemoryStream ();
357 SerializeSimpleClass1 (JsonReaderWriterFactory.CreateJsonWriter (ms));
359 @"{""Foo"":""TEST""}",
360 Encoding.UTF8.GetString (ms.ToArray ()));
363 void SerializeSimpleClass1 (XmlWriter writer)
365 DataContractJsonSerializer ser =
366 new DataContractJsonSerializer (typeof (DCSimple1));
367 using (XmlWriter w = writer) {
368 ser.WriteObject (w, new DCSimple1 ());
375 // NonDC is not a DataContract type.
376 public void SerializeNonDCOnlyCtor ()
378 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (NonDC));
382 //[ExpectedException (typeof (InvalidDataContractException))]
383 // NonDC is not a DataContract type.
384 // UPDATE: non-DataContract types are became valid in RTM.
385 public void SerializeNonDC ()
387 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (NonDC));
388 using (XmlWriter w = XmlWriter.Create (TextWriter.Null, settings)) {
389 ser.WriteObject (w, new NonDC ());
396 //[ExpectedException (typeof (InvalidDataContractException))]
397 // DCHasNonDC itself is a DataContract type whose field is
398 // marked as DataMember but its type is not DataContract.
399 // UPDATE: non-DataContract types are became valid in RTM.
400 public void SerializeDCHasNonDC ()
402 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCHasNonDC));
403 using (XmlWriter w = XmlWriter.Create (TextWriter.Null, settings)) {
404 ser.WriteObject (w, new DCHasNonDC ());
411 public void SerializeSimpleSerializable1Xml ()
413 StringWriter sw = new StringWriter ();
414 SerializeSimpleSerializable1 (XmlWriter.Create (sw, settings));
416 @"<root type=""object""><Ser type=""object""><Doh>doh!</Doh></Ser></root>",
421 public void SerializeSimpleSerializable1Json ()
423 MemoryStream ms = new MemoryStream ();
424 SerializeSimpleSerializable1 (JsonReaderWriterFactory.CreateJsonWriter (ms));
426 @"{""Ser"":{""Doh"":""doh!""}}",
427 Encoding.UTF8.GetString (ms.ToArray ()));
430 // DCHasSerializable itself is DataContract and has a field
431 // whose type is not contract but serializable.
432 void SerializeSimpleSerializable1 (XmlWriter writer)
434 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCHasSerializable));
435 using (XmlWriter w = writer) {
436 ser.WriteObject (w, new DCHasSerializable ());
441 public void SerializeDCWithNameXml ()
443 StringWriter sw = new StringWriter ();
444 SerializeDCWithName (XmlWriter.Create (sw, settings));
446 @"<root type=""object""><FooMember>value</FooMember></root>",
451 public void SerializeDCWithNameJson ()
453 MemoryStream ms = new MemoryStream ();
454 SerializeDCWithName (JsonReaderWriterFactory.CreateJsonWriter (ms));
456 @"{""FooMember"":""value""}",
457 Encoding.UTF8.GetString (ms.ToArray ()));
460 void SerializeDCWithName (XmlWriter writer)
462 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithName));
463 using (XmlWriter w = writer) {
464 ser.WriteObject (w, new DCWithName ());
469 public void SerializeDCWithEmptyName1 ()
471 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEmptyName));
472 StringWriter sw = new StringWriter ();
473 DCWithEmptyName dc = new DCWithEmptyName ();
474 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
476 ser.WriteObject (w, dc);
477 } catch (InvalidDataContractException) {
481 Assert.Fail ("Expected InvalidDataContractException");
485 public void SerializeDCWithEmptyName2 ()
487 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithName));
488 StringWriter sw = new StringWriter ();
490 /* DataContractAttribute.Name == "", not valid */
491 DCWithEmptyName dc = new DCWithEmptyName ();
492 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
494 ser.WriteObject (w, dc);
495 } catch (InvalidDataContractException) {
499 Assert.Fail ("Expected InvalidDataContractException");
503 [Category("NotWorking")]
504 public void SerializeDCWithNullName ()
506 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithNullName));
507 StringWriter sw = new StringWriter ();
508 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
510 /* DataContractAttribute.Name == "", not valid */
511 ser.WriteObject (w, new DCWithNullName ());
512 } catch (InvalidDataContractException) {
516 Assert.Fail ("Expected InvalidDataContractException");
520 public void SerializeDCWithEmptyNamespace1 ()
522 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEmptyNamespace));
523 StringWriter sw = new StringWriter ();
524 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
525 ser.WriteObject (w, new DCWithEmptyNamespace ());
530 public void SerializeWrappedClassXml ()
532 StringWriter sw = new StringWriter ();
533 SerializeWrappedClass (XmlWriter.Create (sw, settings));
535 @"<root type=""object"" />",
540 public void SerializeWrappedClassJson ()
542 MemoryStream ms = new MemoryStream ();
543 SerializeWrappedClass (JsonReaderWriterFactory.CreateJsonWriter (ms));
546 Encoding.UTF8.GetString (ms.ToArray ()));
549 void SerializeWrappedClass (XmlWriter writer)
551 DataContractJsonSerializer ser =
552 new DataContractJsonSerializer (typeof (Wrapper.DCWrapped));
553 using (XmlWriter w = writer) {
554 ser.WriteObject (w, new Wrapper.DCWrapped ());
558 // CollectionContainer : Items must have a setter. (but became valid in RTM).
560 public void SerializeReadOnlyCollectionMember ()
562 DataContractJsonSerializer ser =
563 new DataContractJsonSerializer (typeof (CollectionContainer));
564 StringWriter sw = new StringWriter ();
565 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
566 ser.WriteObject (w, null);
570 // DataCollectionContainer : Items must have a setter. (but became valid in RTM).
572 public void SerializeReadOnlyDataCollectionMember ()
574 DataContractJsonSerializer ser =
575 new DataContractJsonSerializer (typeof (DataCollectionContainer));
576 StringWriter sw = new StringWriter ();
577 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
578 ser.WriteObject (w, null);
583 [Ignore ("https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=409970")]
584 [ExpectedException (typeof (SerializationException))]
585 public void DeserializeReadOnlyDataCollection_NullCollection ()
587 DataContractJsonSerializer ser =
588 new DataContractJsonSerializer (typeof (CollectionContainer));
589 StringWriter sw = new StringWriter ();
590 var c = new CollectionContainer ();
593 using (XmlWriter w = XmlWriter.Create (sw, settings))
594 ser.WriteObject (w, c);
595 // CollectionContainer.Items is null, so it cannot deserialize non-null collection.
596 using (XmlReader r = XmlReader.Create (new StringReader (sw.ToString ())))
597 c = (CollectionContainer) ser.ReadObject (r);
601 public void SerializeGuidXml ()
603 StringWriter sw = new StringWriter ();
604 SerializeGuid (XmlWriter.Create (sw, settings));
606 @"<root>00000000-0000-0000-0000-000000000000</root>",
611 public void SerializeGuidJson ()
613 MemoryStream ms = new MemoryStream ();
614 SerializeGuid (JsonReaderWriterFactory.CreateJsonWriter (ms));
616 @"""00000000-0000-0000-0000-000000000000""",
617 Encoding.UTF8.GetString (ms.ToArray ()));
620 void SerializeGuid (XmlWriter writer)
622 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Guid));
623 using (XmlWriter w = writer) {
624 ser.WriteObject (w, Guid.Empty);
629 public void SerializeEnumXml ()
631 StringWriter sw = new StringWriter ();
632 SerializeEnum (XmlWriter.Create (sw, settings));
634 @"<root type=""number"">0</root>",
639 public void SerializeEnumJson ()
641 MemoryStream ms = new MemoryStream ();
642 SerializeEnum (JsonReaderWriterFactory.CreateJsonWriter (ms));
645 Encoding.UTF8.GetString (ms.ToArray ()));
648 void SerializeEnum (XmlWriter writer)
650 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Colors));
651 using (XmlWriter w = writer) {
652 ser.WriteObject (w, new Colors ());
657 public void SerializeEnum2Xml ()
659 StringWriter sw = new StringWriter ();
660 SerializeEnum2 (XmlWriter.Create (sw, settings));
662 @"<root type=""number"">0</root>",
667 public void SerializeEnum2Json ()
669 MemoryStream ms = new MemoryStream ();
670 SerializeEnum2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
673 Encoding.UTF8.GetString (ms.ToArray ()));
676 void SerializeEnum2 (XmlWriter writer)
678 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Colors));
679 using (XmlWriter w = writer) {
680 ser.WriteObject (w, 0);
684 [Test] // so, DataContract does not affect here.
685 public void SerializeEnumWithDCXml ()
687 StringWriter sw = new StringWriter ();
688 SerializeEnumWithDC (XmlWriter.Create (sw, settings));
690 @"<root type=""number"">0</root>",
695 public void SerializeEnumWithDCJson ()
697 MemoryStream ms = new MemoryStream ();
698 SerializeEnumWithDC (JsonReaderWriterFactory.CreateJsonWriter (ms));
701 Encoding.UTF8.GetString (ms.ToArray ()));
704 void SerializeEnumWithDC (XmlWriter writer)
706 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
707 using (XmlWriter w = writer) {
708 ser.WriteObject (w, new ColorsWithDC ());
713 public void SerializeEnumWithNoDCXml ()
715 StringWriter sw = new StringWriter ();
716 SerializeEnumWithNoDC (XmlWriter.Create (sw, settings));
718 @"<root type=""number"">0</root>",
723 public void SerializeEnumWithNoDCJson ()
725 MemoryStream ms = new MemoryStream ();
726 SerializeEnumWithNoDC (JsonReaderWriterFactory.CreateJsonWriter (ms));
729 Encoding.UTF8.GetString (ms.ToArray ()));
732 void SerializeEnumWithNoDC (XmlWriter writer)
734 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsEnumMemberNoDC));
735 using (XmlWriter w = writer) {
736 ser.WriteObject (w, new ColorsEnumMemberNoDC ());
741 public void SerializeEnumWithDC2Xml ()
743 StringWriter sw = new StringWriter ();
744 SerializeEnumWithDC2 (XmlWriter.Create (sw, settings));
746 @"<root type=""number"">3</root>",
751 public void SerializeEnumWithDC2Json ()
753 MemoryStream ms = new MemoryStream ();
754 SerializeEnumWithDC2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
757 Encoding.UTF8.GetString (ms.ToArray ()));
760 void SerializeEnumWithDC2 (XmlWriter writer)
762 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
763 using (XmlWriter w = writer) {
764 ser.WriteObject (w, 3);
770 [ExpectedException (typeof (SerializationException))]
771 public void SerializeEnumWithDCInvalid ()
773 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
774 StringWriter sw = new StringWriter ();
775 ColorsWithDC cdc = ColorsWithDC.Blue;
776 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
777 ser.WriteObject (w, cdc);
783 public void SerializeDCWithEnumXml ()
785 StringWriter sw = new StringWriter ();
786 SerializeDCWithEnum (XmlWriter.Create (sw, settings));
788 @"<root type=""object""><_colors type=""number"">0</_colors></root>",
793 public void SerializeDCWithEnumJson ()
795 MemoryStream ms = new MemoryStream ();
796 SerializeDCWithEnum (JsonReaderWriterFactory.CreateJsonWriter (ms));
799 Encoding.UTF8.GetString (ms.ToArray ()));
802 void SerializeDCWithEnum (XmlWriter writer)
804 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEnum));
805 using (XmlWriter w = writer) {
806 ser.WriteObject (w, new DCWithEnum ());
811 public void SerializerDCArrayXml ()
813 StringWriter sw = new StringWriter ();
814 SerializerDCArray (XmlWriter.Create (sw, settings));
816 @"<root type=""array""><item type=""object""><_colors type=""number"">0</_colors></item><item type=""object""><_colors type=""number"">1</_colors></item></root>",
821 public void SerializerDCArrayJson ()
823 MemoryStream ms = new MemoryStream ();
824 SerializerDCArray (JsonReaderWriterFactory.CreateJsonWriter (ms));
826 @"[{""_colors"":0},{""_colors"":1}]",
827 Encoding.UTF8.GetString (ms.ToArray ()));
830 void SerializerDCArray (XmlWriter writer)
832 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEnum []));
833 DCWithEnum [] arr = new DCWithEnum [2];
834 arr [0] = new DCWithEnum (); arr [0].colors = Colors.Red;
835 arr [1] = new DCWithEnum (); arr [1].colors = Colors.Green;
836 using (XmlWriter w = writer) {
837 ser.WriteObject (w, arr);
842 public void SerializerDCArray2Xml ()
844 StringWriter sw = new StringWriter ();
845 SerializerDCArray2 (XmlWriter.Create (sw, settings));
847 @"<root type=""array""><item __type=""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"" type=""object""><_colors type=""number"">0</_colors></item><item __type=""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"" type=""object""><Foo>hello</Foo></item></root>",
852 public void SerializerDCArray2Json ()
854 MemoryStream ms = new MemoryStream ();
855 SerializerDCArray2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
857 @"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0},{""__type"":""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"",""Foo"":""hello""}]",
858 Encoding.UTF8.GetString (ms.ToArray ()));
861 void SerializerDCArray2 (XmlWriter writer)
863 List<Type> known = new List<Type> ();
864 known.Add (typeof (DCWithEnum));
865 known.Add (typeof (DCSimple1));
866 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (object []), known);
867 object [] arr = new object [2];
868 arr [0] = new DCWithEnum (); ((DCWithEnum)arr [0]).colors = Colors.Red;
869 arr [1] = new DCSimple1 (); ((DCSimple1) arr [1]).Foo = "hello";
871 using (XmlWriter w = writer) {
872 ser.WriteObject (w, arr);
877 public void SerializerDCArray3Xml ()
879 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (int []));
880 StringWriter sw = new StringWriter ();
881 int [] arr = new int [2];
882 arr [0] = 1; arr [1] = 2;
884 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
885 ser.WriteObject (w, arr);
889 @"<root type=""array""><item type=""number"">1</item><item type=""number"">2</item></root>",
894 public void SerializerDCArray3Json ()
896 MemoryStream ms = new MemoryStream ();
897 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (int []));
898 int [] arr = new int [2];
899 arr [0] = 1; arr [1] = 2;
901 using (XmlWriter w = JsonReaderWriterFactory.CreateJsonWriter (ms)) {
902 ser.WriteObject (w, arr);
907 Encoding.UTF8.GetString (ms.ToArray ()));
911 // ... so, non-JSON XmlWriter is still accepted.
912 public void SerializeNonDCArrayXml ()
914 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
915 StringWriter sw = new StringWriter ();
916 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
917 ser.WriteObject (xw, new SerializeNonDCArrayType ());
919 Assert.AreEqual (@"<root type=""object""><IPAddresses type=""array"" /></root>",
924 public void SerializeNonDCArrayJson ()
926 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
927 MemoryStream ms = new MemoryStream ();
928 using (XmlWriter xw = JsonReaderWriterFactory.CreateJsonWriter (ms)) {
929 ser.WriteObject (xw, new SerializeNonDCArrayType ());
931 Assert.AreEqual (@"{""IPAddresses"":[]}",
932 Encoding.UTF8.GetString (ms.ToArray ()));
936 public void SerializeNonDCArrayItems ()
938 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
939 StringWriter sw = new StringWriter ();
940 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
941 SerializeNonDCArrayType obj = new SerializeNonDCArrayType ();
942 obj.IPAddresses = new NonDCItem [] {new NonDCItem () { Data = new byte [] {1, 2, 3, 4} } };
943 ser.WriteObject (xw, obj);
946 XmlDocument doc = new XmlDocument ();
947 doc.LoadXml (sw.ToString ());
948 XmlNamespaceManager nsmgr = new XmlNamespaceManager (doc.NameTable);
949 nsmgr.AddNamespace ("s", "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization");
950 nsmgr.AddNamespace ("n", "http://schemas.datacontract.org/2004/07/System.Net");
951 nsmgr.AddNamespace ("a", "http://schemas.microsoft.com/2003/10/Serialization/Arrays");
953 Assert.AreEqual (1, doc.SelectNodes ("/root/IPAddresses/item", nsmgr).Count, "#1");
954 XmlElement el = doc.SelectSingleNode ("/root/IPAddresses/item/Data", nsmgr) as XmlElement;
955 Assert.IsNotNull (el, "#3");
956 Assert.AreEqual (4, el.SelectNodes ("item", nsmgr).Count, "#4");
960 public void MaxItemsInObjectGraph1 ()
962 // object count == maximum
963 DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCEmpty), null, 1, false, null, false);
964 s.WriteObject (XmlWriter.Create (TextWriter.Null), new DCEmpty ());
968 [ExpectedException (typeof (SerializationException))]
969 public void MaxItemsInObjectGraph2 ()
971 // object count > maximum
972 DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCSimple1), null, 1, false, null, false);
973 s.WriteObject (XmlWriter.Create (TextWriter.Null), new DCSimple1 ());
977 public void DeserializeString ()
979 Assert.AreEqual ("ABC", Deserialize ("\"ABC\"", typeof (string)));
983 public void DeserializeInt ()
985 Assert.AreEqual (5, Deserialize ("5", typeof (int)));
989 public void DeserializeArray ()
991 int [] ret = (int []) Deserialize ("[5,6,7]", typeof (int []));
992 Assert.AreEqual (5, ret [0], "#1");
993 Assert.AreEqual (6, ret [1], "#2");
994 Assert.AreEqual (7, ret [2], "#3");
998 public void DeserializeArrayUntyped ()
1000 object [] ret = (object []) Deserialize ("[5,6,7]", typeof (object []));
1001 Assert.AreEqual (5, ret [0], "#1");
1002 Assert.AreEqual (6, ret [1], "#2");
1003 Assert.AreEqual (7, ret [2], "#3");
1007 public void DeserializeMixedArray ()
1009 object [] ret = (object []) Deserialize ("[5,\"6\",false]", typeof (object []));
1010 Assert.AreEqual (5, ret [0], "#1");
1011 Assert.AreEqual ("6", ret [1], "#2");
1012 Assert.AreEqual (false, ret [2], "#3");
1016 [ExpectedException (typeof (SerializationException))]
1017 public void DeserializeEmptyAsString ()
1019 // it somehow expects "root" which should have been already consumed.
1020 Deserialize ("", typeof (string));
1024 [ExpectedException (typeof (SerializationException))]
1025 public void DeserializeEmptyAsInt ()
1027 // it somehow expects "root" which should have been already consumed.
1028 Deserialize ("", typeof (int));
1032 [ExpectedException (typeof (SerializationException))]
1033 public void DeserializeEmptyAsDBNull ()
1035 // it somehow expects "root" which should have been already consumed.
1036 Deserialize ("", typeof (DBNull));
1040 public void DeserializeEmptyObjectAsString ()
1042 // looks like it is converted to ""
1043 Assert.AreEqual (String.Empty, Deserialize ("{}", typeof (string)));
1047 [ExpectedException (typeof (SerializationException))]
1048 public void DeserializeEmptyObjectAsInt ()
1050 Deserialize ("{}", typeof (int));
1054 public void DeserializeEmptyObjectAsDBNull ()
1056 Assert.AreEqual (DBNull.Value, Deserialize ("{}", typeof (DBNull)));
1060 [ExpectedException (typeof (SerializationException))]
1061 public void DeserializeEnumByName ()
1063 // enum is parsed into long
1064 Deserialize (@"""Red""", typeof (Colors));
1068 public void DeserializeEnum2 ()
1070 object o = Deserialize ("0", typeof (Colors));
1072 Assert.AreEqual (typeof (Colors), o.GetType (), "#de3");
1073 Colors c = (Colors) o;
1074 Assert.AreEqual (Colors.Red, c, "#de4");
1078 [ExpectedException (typeof (SerializationException))]
1079 public void DeserializeEnumInvalid ()
1081 Deserialize ("", typeof (Colors));
1085 [ExpectedException (typeof (SerializationException))]
1086 [Ignore ("NotDotNet")] // 0.0 is an invalid Colors value.
1087 public void DeserializeEnumInvalid3 ()
1089 //"0.0" instead of "0"
1096 public void DeserializeEnumWithDC ()
1098 object o = Deserialize ("0", typeof (ColorsWithDC));
1100 Assert.AreEqual (typeof (ColorsWithDC), o.GetType (), "#de5");
1101 ColorsWithDC cdc = (ColorsWithDC) o;
1102 Assert.AreEqual (ColorsWithDC.Red, o, "#de6");
1106 [ExpectedException (typeof (SerializationException))]
1107 [Ignore ("NotDotNet")] // 4 is an invalid Colors value.
1108 [Category ("NotWorking")]
1109 public void DeserializeEnumWithDCInvalid ()
1113 typeof (ColorsWithDC));
1117 public void DeserializeDCWithEnum ()
1119 object o = Deserialize (
1121 typeof (DCWithEnum));
1123 Assert.AreEqual (typeof (DCWithEnum), o.GetType (), "#de7");
1124 DCWithEnum dc = (DCWithEnum) o;
1125 Assert.AreEqual (Colors.Red, dc.colors, "#de8");
1129 public void ReadObjectVerifyObjectNameFalse ()
1131 string xml = @"<any><Member1>bar</Member1></any>";
1132 object o = new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1133 .ReadObject (XmlReader.Create (new StringReader (xml)), false);
1134 Assert.IsTrue (o is VerifyObjectNameTestData, "#1");
1136 string xml2 = @"<any><x:Member1 xmlns:x=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">bar</x:Member1></any>";
1137 o = new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1138 .ReadObject (XmlReader.Create (new StringReader (xml2)), false);
1139 Assert.IsTrue (o is VerifyObjectNameTestData, "#2");
1143 [ExpectedException (typeof (SerializationException))]
1144 public void ReadObjectVerifyObjectNameTrue ()
1146 string xml = @"<any><Member1>bar</Member1></any>";
1147 new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1148 .ReadObject (XmlReader.Create (new StringReader (xml)), true);
1151 [Test] // member name is out of scope
1152 public void ReadObjectVerifyObjectNameTrue2 ()
1154 string xml = @"<root><Member2>bar</Member2></root>";
1155 new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1156 .ReadObject (XmlReader.Create (new StringReader (xml)), true);
1160 public void ReadTypedObjectJson ()
1162 object o = Deserialize (@"{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}", typeof (DCWithEnum));
1163 Assert.AreEqual (typeof (DCWithEnum), o.GetType ());
1167 public void ReadObjectDCArrayJson ()
1169 object o = Deserialize (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}]",
1170 typeof (object []), typeof (DCWithEnum));
1171 Assert.AreEqual (typeof (object []), o.GetType (), "#1");
1172 object [] arr = (object []) o;
1173 Assert.AreEqual (typeof (DCWithEnum), arr [0].GetType (), "#2");
1177 public void ReadObjectDCArray2Json ()
1179 object o = Deserialize (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0},{""__type"":""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"",""Foo"":""hello""}]",
1180 typeof (object []), typeof (DCWithEnum), typeof (DCSimple1));
1181 Assert.AreEqual (typeof (object []), o.GetType (), "#1");
1182 object [] arr = (object []) o;
1183 Assert.AreEqual (typeof (DCWithEnum), arr [0].GetType (), "#2");
1184 Assert.AreEqual (typeof (DCSimple1), arr [1].GetType (), "#3");
1187 private object Deserialize (string xml, Type type, params Type [] knownTypes)
1189 DataContractJsonSerializer ser = new DataContractJsonSerializer (type, knownTypes);
1190 XmlReader xr = JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (xml), new XmlDictionaryReaderQuotas ());
1191 return ser.ReadObject (xr);
1194 public T Deserialize<T>(string json)
1196 var bytes = Encoding.Unicode.GetBytes (json);
1197 using (MemoryStream stream = new MemoryStream (bytes)) {
1198 var serializer = new DataContractJsonSerializer (typeof(T));
1199 return (T)serializer.ReadObject (stream);
1204 public void IsStartObject ()
1206 DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCSimple1));
1207 Assert.IsTrue (s.IsStartObject (XmlReader.Create (new StringReader ("<root></root>"))), "#1");
1208 Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<dummy></dummy>"))), "#2");
1209 Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<Foo></Foo>"))), "#3");
1210 Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<root xmlns='urn:foo'></root>"))), "#4");
1214 public void SerializeNonDC2 ()
1216 var ser = new DataContractJsonSerializer (typeof (TestData));
1217 StringWriter sw = new StringWriter ();
1218 var obj = new TestData () { Foo = "foo", Bar = "bar", Baz = "baz" };
1221 using (var xw = XmlWriter.Create (sw))
1222 ser.WriteObject (xw, obj);
1223 var s = sw.ToString ();
1224 // since the order is not preserved, we compare only contents.
1225 Assert.IsTrue (s.IndexOf ("<Foo>foo</Foo>") > 0, "#1-1");
1226 Assert.IsTrue (s.IndexOf ("<Bar>bar</Bar>") > 0, "#1-2");
1227 Assert.IsFalse (s.IndexOf ("<Baz>baz</Baz>") > 0, "#1-3");
1230 MemoryStream ms = new MemoryStream ();
1231 using (var xw = JsonReaderWriterFactory.CreateJsonWriter (ms))
1232 ser.WriteObject (ms, obj);
1233 s = new StreamReader (new MemoryStream (ms.ToArray ())).ReadToEnd ().Replace ('"', '/');
1234 // since the order is not preserved, we compare only contents.
1235 Assert.IsTrue (s.IndexOf ("/Foo/:/foo/") > 0, "#2-1");
1236 Assert.IsTrue (s.IndexOf ("/Bar/:/bar/") > 0, "#2-2");
1237 Assert.IsFalse (s.IndexOf ("/Baz/:/baz/") > 0, "#2-3");
1241 public void AlwaysEmitTypeInformation ()
1243 var ms = new MemoryStream ();
1244 var ds = new DataContractJsonSerializer (typeof (string), "root", null, 10, false, null, true);
1245 ds.WriteObject (ms, "foobar");
1246 var s = Encoding.UTF8.GetString (ms.ToArray ());
1247 Assert.AreEqual ("\"foobar\"", s, "#1");
1251 public void AlwaysEmitTypeInformation2 ()
1253 var ms = new MemoryStream ();
1254 var ds = new DataContractJsonSerializer (typeof (TestData), "root", null, 10, false, null, true);
1255 ds.WriteObject (ms, new TestData () { Foo = "foo"});
1256 var s = Encoding.UTF8.GetString (ms.ToArray ());
1257 Assert.AreEqual (@"{""__type"":""TestData:#MonoTests.System.Runtime.Serialization.Json"",""Bar"":null,""Foo"":""foo""}", s, "#1");
1261 public void AlwaysEmitTypeInformation3 ()
1263 var ms = new MemoryStream ();
1264 var ds = new DataContractJsonSerializer (typeof (TestData), "root", null, 10, false, null, false);
1265 ds.WriteObject (ms, new TestData () { Foo = "foo"});
1266 var s = Encoding.UTF8.GetString (ms.ToArray ());
1267 Assert.AreEqual (@"{""Bar"":null,""Foo"":""foo""}", s, "#1");
1271 public void TestNonpublicDeserialization ()
1273 string s1= @"{""Bar"":""bar"", ""Foo"":""foo"", ""Baz"":""baz""}";
1274 TestData o1 = ((TestData)(new DataContractJsonSerializer (typeof (TestData)).ReadObject (JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (s1), new XmlDictionaryReaderQuotas ()))));
1276 Assert.AreEqual (null, o1.Baz, "#1");
1278 string s2 = @"{""TestData"":[{""key"":""key1"",""value"":""value1""}]}";
1279 KeyValueTestData o2 = ((KeyValueTestData)(new DataContractJsonSerializer (typeof (KeyValueTestData)).ReadObject (JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (s2), new XmlDictionaryReaderQuotas ()))));
1281 Assert.AreEqual (1, o2.TestData.Count, "#2");
1282 Assert.AreEqual ("key1", o2.TestData[0].Key, "#3");
1283 Assert.AreEqual ("value1", o2.TestData[0].Value, "#4");
1286 // [Test] use this case if you want to check lame silverlight parser behavior. Seealso #549756
1287 public void QuotelessDeserialization ()
1289 string s1 = @"{FooMember:""value""}";
1290 var ds = new DataContractJsonSerializer (typeof (DCWithName));
1291 ds.ReadObject (new MemoryStream (Encoding.UTF8.GetBytes (s1)));
1293 string s2 = @"{FooMember:"" \""{dummy:string}\""""}";
1294 ds.ReadObject (new MemoryStream (Encoding.UTF8.GetBytes (s2)));
1298 [Category ("NotWorking")]
1299 public void TypeIsNotPartsOfKnownTypes ()
1301 var dcs = new DataContractSerializer (typeof (string));
1302 Assert.AreEqual (0, dcs.KnownTypes.Count, "KnownTypes #1");
1303 var dcjs = new DataContractJsonSerializer (typeof (string));
1304 Assert.AreEqual (0, dcjs.KnownTypes.Count, "KnownTypes #2");
1308 public void ReadWriteNullObject ()
1310 DataContractJsonSerializer dcjs = new DataContractJsonSerializer (typeof (string));
1311 using (MemoryStream ms = new MemoryStream ()) {
1312 dcjs.WriteObject (ms, null);
1314 using (StreamReader sr = new StreamReader (ms)) {
1315 string data = sr.ReadToEnd ();
1316 Assert.AreEqual ("null", data, "WriteObject(stream,null)");
1319 Assert.IsNull (dcjs.ReadObject (ms), "ReadObject(stream)");
1324 object ReadWriteObject (Type type, object obj, string expected)
1326 using (MemoryStream ms = new MemoryStream ()) {
1327 DataContractJsonSerializer dcjs = new DataContractJsonSerializer (type);
1328 dcjs.WriteObject (ms, obj);
1330 using (StreamReader sr = new StreamReader (ms)) {
1331 Assert.AreEqual (expected, sr.ReadToEnd (), "WriteObject");
1334 return dcjs.ReadObject (ms);
1340 [Ignore ("Wrong test case. See bug #573691")]
1341 public void ReadWriteObject_Single_SpecialCases ()
1343 Assert.IsTrue (Single.IsNaN ((float) ReadWriteObject (typeof (float), Single.NaN, "NaN")));
1344 Assert.IsTrue (Single.IsNegativeInfinity ((float) ReadWriteObject (typeof (float), Single.NegativeInfinity, "-INF")));
1345 Assert.IsTrue (Single.IsPositiveInfinity ((float) ReadWriteObject (typeof (float), Single.PositiveInfinity, "INF")));
1349 [Ignore ("Wrong test case. See bug #573691")]
1350 public void ReadWriteObject_Double_SpecialCases ()
1352 Assert.IsTrue (Double.IsNaN ((double) ReadWriteObject (typeof (double), Double.NaN, "NaN")));
1353 Assert.IsTrue (Double.IsNegativeInfinity ((double) ReadWriteObject (typeof (double), Double.NegativeInfinity, "-INF")));
1354 Assert.IsTrue (Double.IsPositiveInfinity ((double) ReadWriteObject (typeof (double), Double.PositiveInfinity, "INF")));
1358 public void ReadWriteDateTime ()
1360 var ms = new MemoryStream ();
1361 DataContractJsonSerializer serializer = new DataContractJsonSerializer (typeof (Query));
1362 Query query = new Query () {
1363 StartDate = DateTime.SpecifyKind (new DateTime (2010, 3, 4, 5, 6, 7), DateTimeKind.Utc),
1364 EndDate = DateTime.SpecifyKind (new DateTime (2010, 4, 5, 6, 7, 8), DateTimeKind.Utc)
1366 serializer.WriteObject (ms, query);
1367 Assert.AreEqual ("{\"StartDate\":\"\\/Date(1267679167000)\\/\",\"EndDate\":\"\\/Date(1270447628000)\\/\"}", Encoding.UTF8.GetString (ms.ToArray ()), "#1");
1369 Console.WriteLine (new StreamReader (ms).ReadToEnd ());
1371 var q = (Query) serializer.ReadObject(ms);
1372 Assert.AreEqual (query.StartDate, q.StartDate, "#2");
1373 Assert.AreEqual (query.EndDate, q.EndDate, "#3");
1376 [DataContract(Name = "DateTest")]
1377 public class DateTest
1379 [DataMember(Name = "should_have_value")]
1380 public DateTime? ShouldHaveValue { get; set; }
1384 // This tests both the extended format "number-0500" as well
1385 // as the nullable field in the structure
1387 public void BugXamarin163 ()
1389 string json = @"{""should_have_value"":""\/Date(1277355600000)\/""}";
1391 byte[] bytes = global::System.Text.Encoding.UTF8.GetBytes(json);
1392 Stream inputStream = new MemoryStream(bytes);
1394 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DateTest));
1395 DateTest t = serializer.ReadObject(inputStream) as DateTest;
1396 Assert.AreEqual (634129524000000000, t.ShouldHaveValue.Value.Ticks, "#1");
1400 public void NullableFieldsShouldSupportNullValue ()
1402 string json = @"{""should_have_value"":null}";
1403 var inputStream = new MemoryStream (Encoding.UTF8.GetBytes (json));
1404 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DateTest));
1405 Console.WriteLine ("# serializer assembly: {0}", serializer.GetType ().Assembly.Location);
1406 DateTest t = serializer.ReadObject (inputStream) as DateTest;
1407 Assert.AreEqual (false, t.ShouldHaveValue.HasValue, "#2");
1411 public void DeserializeNullMember ()
1413 var ds = new DataContractJsonSerializer (typeof (ClassA));
1414 var stream = new MemoryStream ();
1415 var a = new ClassA ();
1416 ds.WriteObject (stream, a);
1417 stream.Position = 0;
1418 a = (ClassA) ds.ReadObject (stream);
1419 Assert.IsNull (a.B, "#1");
1423 public void OnDeserializationMethods ()
1425 var ds = new DataContractJsonSerializer (typeof (GSPlayerListErg));
1426 var obj = new GSPlayerListErg ();
1427 var ms = new MemoryStream ();
1428 ds.WriteObject (ms, obj);
1431 Assert.IsTrue (GSPlayerListErg.A, "A");
1432 Assert.IsTrue (GSPlayerListErg.B, "B");
1433 Assert.IsTrue (GSPlayerListErg.C, "C");
1437 public void WriteChar ()
1439 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof (CharTest));
1440 using (MemoryStream ms = new MemoryStream()) {
1441 serializer.WriteObject(ms, new CharTest ());
1443 using (StreamReader reader = new StreamReader(ms)) {
1450 public void DictionarySerialization ()
1452 var dict = new MyDictionary<string,string> ();
1453 dict.Add ("key", "value");
1454 var serializer = new DataContractJsonSerializer (dict.GetType ());
1455 var stream = new MemoryStream ();
1456 serializer.WriteObject (stream, dict);
1457 stream.Position = 0;
1459 Assert.AreEqual ("[{\"Key\":\"key\",\"Value\":\"value\"}]", new StreamReader (stream).ReadToEnd (), "#1");
1460 stream.Position = 0;
1461 dict = (MyDictionary<string,string>) serializer.ReadObject (stream);
1462 Assert.AreEqual (1, dict.Count, "#2");
1463 Assert.AreEqual ("value", dict ["key"], "#3");
1467 public void ExplicitCustomDictionarySerialization ()
1469 var dict = new MyExplicitDictionary<string,string> ();
1470 dict.Add ("key", "value");
1471 var serializer = new DataContractJsonSerializer (dict.GetType ());
1472 var stream = new MemoryStream ();
1473 serializer.WriteObject (stream, dict);
1474 stream.Position = 0;
1476 Assert.AreEqual ("[{\"Key\":\"key\",\"Value\":\"value\"}]", new StreamReader (stream).ReadToEnd (), "#1");
1477 stream.Position = 0;
1478 dict = (MyExplicitDictionary<string,string>) serializer.ReadObject (stream);
1479 Assert.AreEqual (1, dict.Count, "#2");
1480 Assert.AreEqual ("value", dict ["key"], "#3");
1484 public void Bug13485 ()
1486 const string json = "{ \"Name\" : \"Test\", \"Value\" : \"ValueA\" }";
1488 string result = string.Empty;
1489 var serializer = new DataContractJsonSerializer (typeof (Bug13485Type));
1490 Bug13485Type entity;
1491 using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (json)))
1492 entity = (Bug13485Type) serializer.ReadObject (stream);
1494 result = entity.GetValue;
1495 Assert.AreEqual ("ValueA", result, "#1");
1498 [DataContract(Name = "UriTest")]
1499 public class UriTest
1501 [DataMember(Name = "members")]
1502 public Uri MembersRelativeLink { get; set; }
1506 public void Bug15169 ()
1508 const string json = "{\"members\":\"foo/bar/members\"}";
1509 var serializer = new DataContractJsonSerializer (typeof (UriTest));
1511 using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (json)))
1512 entity = (UriTest) serializer.ReadObject (stream);
1514 Assert.AreEqual ("foo/bar/members", entity.MembersRelativeLink.ToString ());
1517 #region Test methods for collection serialization
1520 public void TestArrayListSerialization ()
1522 var collection = new ArrayListContainer ();
1523 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1524 var expectedItemsCount = 4;
1526 var serializer = new DataContractJsonSerializer (collection.GetType ());
1527 var stream = new MemoryStream ();
1528 serializer.WriteObject (stream, collection);
1530 stream.Position = 0;
1531 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1533 stream.Position = 0;
1534 collection = (ArrayListContainer) serializer.ReadObject (stream);
1536 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1540 [ExpectedException (typeof (InvalidDataContractException))]
1541 public void TestBitArraySerialization ()
1543 var collection = new BitArrayContainer ();
1544 var serializer = new DataContractJsonSerializer (collection.GetType ());
1545 var stream = new MemoryStream ();
1546 serializer.WriteObject (stream, collection);
1550 public void TestHashtableSerialization ()
1552 var collection = new HashtableContainer ();
1553 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1555 var serializer = new DataContractJsonSerializer (collection.GetType ());
1556 var stream = new MemoryStream ();
1557 serializer.WriteObject (stream, collection);
1559 stream.Position = 0;
1560 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1564 [ExpectedException (typeof (ArgumentException))]
1565 public void TestHashtableDeserialization ()
1567 var collection = new HashtableContainer ();
1568 var serializer = new DataContractJsonSerializer (collection.GetType ());
1569 var stream = new MemoryStream ();
1570 serializer.WriteObject (stream, collection);
1572 stream.Position = 0;
1573 serializer.ReadObject (stream);
1577 [ExpectedException (typeof (InvalidDataContractException))]
1578 public void TestQueueSerialization ()
1580 var collection = new QueueContainer ();
1581 var serializer = new DataContractJsonSerializer (collection.GetType ());
1582 var stream = new MemoryStream ();
1583 serializer.WriteObject (stream, collection);
1587 public void TestSortedListSerialization ()
1589 var collection = new SortedListContainer ();
1590 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1592 var serializer = new DataContractJsonSerializer (collection.GetType ());
1593 var stream = new MemoryStream ();
1594 serializer.WriteObject (stream, collection);
1596 stream.Position = 0;
1597 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1601 [ExpectedException (typeof (ArgumentException))]
1602 public void TestSortedListDeserialization ()
1604 var collection = new SortedListContainer ();
1605 var serializer = new DataContractJsonSerializer (collection.GetType ());
1606 var stream = new MemoryStream ();
1607 serializer.WriteObject (stream, collection);
1609 stream.Position = 0;
1610 serializer.ReadObject (stream);
1614 [ExpectedException (typeof (InvalidDataContractException))]
1615 public void TestStackSerialization ()
1617 var collection = new StackContainer ();
1618 var serializer = new DataContractJsonSerializer (collection.GetType ());
1619 var stream = new MemoryStream ();
1620 serializer.WriteObject (stream, collection);
1624 public void TestEnumerableWithAddSerialization ()
1626 var collection = new EnumerableWithAddContainer ();
1627 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1628 var expectedItemsCount = 4;
1630 var serializer = new DataContractJsonSerializer (collection.GetType ());
1631 var stream = new MemoryStream ();
1632 serializer.WriteObject (stream, collection);
1634 stream.Position = 0;
1635 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1637 stream.Position = 0;
1638 collection = (EnumerableWithAddContainer) serializer.ReadObject (stream);
1640 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1644 [ExpectedException (typeof (InvalidDataContractException))]
1645 public void TestEnumerableWithSpecialAddSerialization ()
1647 var collection = new EnumerableWithSpecialAddContainer ();
1648 var serializer = new DataContractJsonSerializer (collection.GetType ());
1649 var stream = new MemoryStream ();
1650 serializer.WriteObject (stream, collection);
1654 public void TestHashSetSerialization ()
1656 var collection = new GenericHashSetContainer ();
1657 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1658 var expectedItemsCount = 2;
1660 var serializer = new DataContractJsonSerializer (collection.GetType ());
1661 var stream = new MemoryStream ();
1662 serializer.WriteObject (stream, collection);
1664 stream.Position = 0;
1665 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1667 stream.Position = 0;
1668 collection = (GenericHashSetContainer) serializer.ReadObject (stream);
1670 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1674 public void TestLinkedListSerialization ()
1676 var collection = new GenericLinkedListContainer ();
1677 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1678 var expectedItemsCount = 4;
1680 var serializer = new DataContractJsonSerializer (collection.GetType ());
1681 var stream = new MemoryStream ();
1682 serializer.WriteObject (stream, collection);
1684 stream.Position = 0;
1685 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1687 stream.Position = 0;
1688 collection = (GenericLinkedListContainer) serializer.ReadObject (stream);
1690 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1694 [ExpectedException (typeof (InvalidDataContractException))]
1695 public void TestGenericQueueSerialization ()
1697 var collection = new GenericQueueContainer ();
1698 var serializer = new DataContractJsonSerializer (collection.GetType ());
1699 var stream = new MemoryStream ();
1700 serializer.WriteObject (stream, collection);
1704 [ExpectedException (typeof (InvalidDataContractException))]
1705 public void TestGenericStackSerialization ()
1707 var collection = new GenericStackContainer ();
1708 var serializer = new DataContractJsonSerializer (collection.GetType ());
1709 var stream = new MemoryStream ();
1710 serializer.WriteObject (stream, collection);
1714 public void TestGenericDictionarySerialization ()
1716 var collection = new GenericDictionaryContainer ();
1717 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1718 var serializer = new DataContractJsonSerializer (collection.GetType ());
1719 var stream = new MemoryStream ();
1720 serializer.WriteObject (stream, collection);
1722 stream.Position = 0;
1723 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1727 [ExpectedException (typeof (ArgumentException))]
1728 public void TestGenericDictionaryDeserialization ()
1730 var collection = new GenericDictionaryContainer ();
1731 var serializer = new DataContractJsonSerializer (collection.GetType ());
1732 var stream = new MemoryStream ();
1733 serializer.WriteObject (stream, collection);
1735 stream.Position = 0;
1736 serializer.ReadObject (stream);
1740 public void TestGenericSortedListSerialization ()
1742 var collection = new GenericSortedListContainer ();
1743 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1744 var serializer = new DataContractJsonSerializer (collection.GetType ());
1745 var stream = new MemoryStream ();
1746 serializer.WriteObject (stream, collection);
1748 stream.Position = 0;
1749 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1753 [ExpectedException (typeof (ArgumentException))]
1754 public void TestGenericSortedListDeserialization ()
1756 var collection = new GenericSortedListContainer ();
1757 var serializer = new DataContractJsonSerializer (collection.GetType ());
1758 var stream = new MemoryStream ();
1759 serializer.WriteObject (stream, collection);
1761 stream.Position = 0;
1762 serializer.ReadObject (stream);
1766 public void TestGenericSortedDictionarySerialization ()
1768 var collection = new GenericSortedDictionaryContainer ();
1769 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1770 var serializer = new DataContractJsonSerializer (collection.GetType ());
1771 var stream = new MemoryStream ();
1772 serializer.WriteObject (stream, collection);
1774 stream.Position = 0;
1775 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1779 [ExpectedException (typeof (ArgumentException))]
1780 public void TestGenericSortedDictionaryDeserialization ()
1782 var collection = new GenericSortedDictionaryContainer ();
1783 var serializer = new DataContractJsonSerializer (collection.GetType ());
1784 var stream = new MemoryStream ();
1785 serializer.WriteObject (stream, collection);
1787 stream.Position = 0;
1788 serializer.ReadObject (stream);
1792 public void TestGenericEnumerableWithAddSerialization ()
1794 var collection = new GenericEnumerableWithAddContainer ();
1795 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1796 var expectedItemsCount = 4;
1798 var serializer = new DataContractJsonSerializer (collection.GetType ());
1799 var stream = new MemoryStream ();
1800 serializer.WriteObject (stream, collection);
1802 stream.Position = 0;
1803 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1805 stream.Position = 0;
1806 collection = (GenericEnumerableWithAddContainer) serializer.ReadObject (stream);
1808 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1812 [ExpectedException (typeof (InvalidDataContractException))]
1813 public void TestGenericEnumerableWithSpecialAddSerialization ()
1815 var collection = new GenericEnumerableWithSpecialAddContainer ();
1816 var serializer = new DataContractJsonSerializer (collection.GetType ());
1817 var stream = new MemoryStream ();
1818 serializer.WriteObject (stream, collection);
1822 [ExpectedException (typeof (InvalidDataContractException))]
1823 public void TestNonCollectionGetOnlyProperty ()
1825 var o = new NonCollectionGetOnlyContainer ();
1826 var serializer = new DataContractJsonSerializer (o.GetType ());
1827 var stream = new MemoryStream ();
1828 serializer.WriteObject (stream, o);
1831 // properly deserialize object with a polymorphic property (known derived type)
1833 public void Bug23058()
1835 string serializedObj = @"{""PolymorphicProperty"":{""__type"":""KnownDerivedType:#MonoTests.System.Runtime.Serialization.Json"",""BaseTypeProperty"":""Base"",""DerivedProperty"":""Derived 1""},""Name"":""Parent2""}";
1836 ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
1838 Assert.AreEqual (deserializedObj.PolymorphicProperty.GetType ().FullName, "MonoTests.System.Runtime.Serialization.Json.KnownDerivedType");
1839 Assert.AreEqual (deserializedObj.PolymorphicProperty.BaseTypeProperty, "Base");
1840 Assert.AreEqual ((deserializedObj.PolymorphicProperty as KnownDerivedType).DerivedProperty, "Derived 1");
1841 Assert.AreEqual (deserializedObj.Name, "Parent2");
1844 // properly deserialize object with a polymorphic property (base type with __type hint)
1846 public void DeserializeBaseTypePropHint()
1848 string serializedObj = @"{""PolymorphicProperty"":{""__type"":""BaseType:#MonoTests.System.Runtime.Serialization.Json"",""BaseTypeProperty"":""Base""},""Name"":""Parent2""}";
1849 ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
1851 Assert.AreEqual (deserializedObj.PolymorphicProperty.GetType ().FullName, "MonoTests.System.Runtime.Serialization.Json.BaseType");
1852 Assert.AreEqual (deserializedObj.PolymorphicProperty.BaseTypeProperty, "Base");
1855 // properly deserialize object with a polymorphic property (base type with __type hint)
1857 public void DeserializeBaseTypePropNoHint()
1859 string serializedObj = @"{""PolymorphicProperty"":{""BaseTypeProperty"":""Base""},""Name"":""Parent2""}";
1860 ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
1862 Assert.AreEqual (deserializedObj.PolymorphicProperty.GetType ().FullName, "MonoTests.System.Runtime.Serialization.Json.BaseType");
1863 Assert.AreEqual (deserializedObj.PolymorphicProperty.BaseTypeProperty, "Base");
1866 // properly fail deserializing object with a polymorphic property (unknown derived type)
1867 [ExpectedException (typeof (SerializationException))]
1869 public void FailDeserializingUnknownTypeProp()
1871 string serializedObj = @"{""PolymorphicProperty"":{""__type"":""UnknownDerivedType:#MonoTests.System.Runtime.Serialization.Json"",""BaseTypeProperty"":""Base"",""DerivedProperty"":""Derived 1""},""Name"":""Parent2""}";
1872 ParentType deserializedObj = Deserialize<ParentType> (serializedObj);
1878 public class CharTest
1883 public class TestData
1885 public string Foo { get; set; }
1886 public string Bar { get; set; }
1887 internal string Baz { get; set; }
1890 public enum Colors {
1894 [DataContract (Name = "_ColorsWithDC")]
1895 public enum ColorsWithDC {
1897 [EnumMember (Value = "_Red")]
1905 public enum ColorsEnumMemberNoDC {
1906 [EnumMember (Value = "_Red")]
1914 public class DCWithEnum {
1915 [DataMember (Name = "_colors")]
1916 public Colors colors;
1920 public class DCEmpty
1922 // serializer doesn't touch it.
1923 public string Foo = "TEST";
1927 public class DCSimple1
1930 public string Foo = "TEST";
1934 public class DCHasNonDC
1937 public NonDC Hoge= new NonDC ();
1942 public string Whee = "whee!";
1946 public class DCHasSerializable
1949 public SimpleSer1 Ser = new SimpleSer1 ();
1952 [DataContract (Name = "Foo")]
1953 public class DCWithName
1955 [DataMember (Name = "FooMember")]
1956 public string DMWithName = "value";
1959 [DataContract (Name = "")]
1960 public class DCWithEmptyName
1966 [DataContract (Name = null)]
1967 public class DCWithNullName
1973 [DataContract (Namespace = "")]
1974 public class DCWithEmptyNamespace
1981 public class SimpleSer1
1983 public string Doh = "doh!";
1986 public class Wrapper
1989 public class DCWrapped
1995 public class CollectionContainer
1997 Collection<string> items = new Collection<string> ();
2000 public Collection<string> Items {
2001 get { return items; }
2005 [CollectionDataContract]
2006 public class DataCollection<T> : Collection<T>
2011 public class DataCollectionContainer
2013 DataCollection<string> items = new DataCollection<string> ();
2016 public DataCollection<string> Items {
2017 get { return items; }
2022 class SerializeNonDCArrayType
2025 public NonDCItem [] IPAddresses = new NonDCItem [0];
2028 public class NonDCItem
2030 public byte [] Data { get; set; }
2034 public class VerifyObjectNameTestData
2037 string Member1 = "foo";
2041 public class KeyValueTestData {
2042 public List<KeyValuePair<string,string>> TestData = new List<KeyValuePair<string,string>>();
2045 [DataContract] // bug #586169
2048 [DataMember (Order=1)]
2049 public DateTime StartDate { get; set; }
2050 [DataMember (Order=2)]
2051 public DateTime EndDate { get; set; }
2054 public class ClassA {
2055 public ClassB B { get; set; }
2062 public class GSPlayerListErg
2064 public GSPlayerListErg ()
2072 ServerTimeUTC = DateTime.SpecifyKind (DateTime.MinValue, DateTimeKind.Utc);
2076 public void OnDeserializing (StreamingContext c)
2083 void OnDeserialized (StreamingContext c)
2088 public static bool A, B, C;
2090 [DataMember (Name = "T")]
2091 public long CodedServerTimeUTC { get; set; }
2092 public DateTime ServerTimeUTC { get; set; }
2095 #region polymorphism test helper classes
2098 [KnownType (typeof (KnownDerivedType))]
2099 public class ParentType
2102 public string Name { get; set; }
2105 public BaseType PolymorphicProperty { get; set; }
2109 public class BaseType
2112 public string BaseTypeProperty { get; set; }
2116 public class KnownDerivedType : BaseType
2118 [DataMemberAttribute]
2119 public string DerivedProperty { get; set; }
2123 public class UnknownDerivedType : BaseType
2126 public string DerivedProperty { get; set; }
2138 public class MyDictionary<K, V> : System.Collections.Generic.IDictionary<K, V>
2140 Dictionary<K,V> dic = new Dictionary<K,V> ();
2142 public void Add (K key, V value)
2144 dic.Add (key, value);
2147 public bool ContainsKey (K key)
2149 return dic.ContainsKey (key);
2152 public ICollection<K> Keys {
2153 get { return dic.Keys; }
2156 public bool Remove (K key)
2158 return dic.Remove (key);
2161 public bool TryGetValue (K key, out V value)
2163 return dic.TryGetValue (key, out value);
2166 public ICollection<V> Values {
2167 get { return dic.Values; }
2170 public V this [K key] {
2171 get { return dic [key]; }
2172 set { dic [key] = value; }
2175 IEnumerator IEnumerable.GetEnumerator ()
2177 return dic.GetEnumerator ();
2180 ICollection<KeyValuePair<K,V>> Coll {
2181 get { return (ICollection<KeyValuePair<K,V>>) dic; }
2184 public void Add (KeyValuePair<K, V> item)
2189 public void Clear ()
2194 public bool Contains (KeyValuePair<K, V> item)
2196 return Coll.Contains (item);
2199 public void CopyTo (KeyValuePair<K, V> [] array, int arrayIndex)
2201 Coll.CopyTo (array, arrayIndex);
2205 get { return dic.Count; }
2208 public bool IsReadOnly {
2209 get { return Coll.IsReadOnly; }
2212 public bool Remove (KeyValuePair<K, V> item)
2214 return Coll.Remove (item);
2217 public IEnumerator<KeyValuePair<K, V>> GetEnumerator ()
2219 return Coll.GetEnumerator ();
2223 public class MyExplicitDictionary<K, V> : IDictionary<K, V> {
2225 Dictionary<K,V> dic = new Dictionary<K,V> ();
2227 public void Add (K key, V value)
2229 dic.Add (key, value);
2232 public bool ContainsKey (K key)
2234 return dic.ContainsKey (key);
2237 ICollection<K> IDictionary<K, V>.Keys {
2238 get { return dic.Keys; }
2241 public bool Remove (K key)
2243 return dic.Remove (key);
2246 public bool TryGetValue (K key, out V value)
2248 return dic.TryGetValue (key, out value);
2251 ICollection<V> IDictionary<K, V>.Values {
2252 get { return dic.Values; }
2255 public V this [K key] {
2256 get { return dic [key]; }
2257 set { dic [key] = value; }
2260 IEnumerator IEnumerable.GetEnumerator ()
2262 return dic.GetEnumerator ();
2265 ICollection<KeyValuePair<K,V>> Coll {
2266 get { return (ICollection<KeyValuePair<K,V>>) dic; }
2269 public void Add (KeyValuePair<K, V> item)
2274 public void Clear ()
2279 public bool Contains (KeyValuePair<K, V> item)
2281 return Coll.Contains (item);
2284 public void CopyTo (KeyValuePair<K, V> [] array, int arrayIndex)
2286 Coll.CopyTo (array, arrayIndex);
2290 get { return dic.Count; }
2293 public bool IsReadOnly {
2294 get { return Coll.IsReadOnly; }
2297 public bool Remove (KeyValuePair<K, V> item)
2299 return Coll.Remove (item);
2302 public IEnumerator<KeyValuePair<K, V>> GetEnumerator ()
2304 return Coll.GetEnumerator ();
2309 public class Bug13485Type
2312 public string Name { get; set; }
2314 [DataMember (Name = "Value")]
2315 private string Value { get; set; }
2317 public string GetValue { get { return this.Value; } }
2320 #region Test classes for Collection serialization
2323 public abstract class CollectionContainer <V>
2331 if (items == null) items = Init ();
2336 public CollectionContainer ()
2341 protected abstract V Init ();
2345 public class ArrayListContainer : CollectionContainer<ArrayList> {
2346 protected override ArrayList Init ()
2348 return new ArrayList { "banana", "apple" };
2353 public class BitArrayContainer : CollectionContainer<BitArray> {
2354 protected override BitArray Init ()
2356 return new BitArray (new [] { false, true });
2361 public class HashtableContainer : CollectionContainer<Hashtable> {
2362 protected override Hashtable Init ()
2364 var ht = new Hashtable ();
2365 ht.Add ("key1", "banana");
2366 ht.Add ("key2", "apple");
2372 public class QueueContainer : CollectionContainer<Queue> {
2373 protected override Queue Init ()
2375 var q = new Queue ();
2376 q.Enqueue ("banana");
2377 q.Enqueue ("apple");
2383 public class SortedListContainer : CollectionContainer<SortedList> {
2384 protected override SortedList Init ()
2386 var l = new SortedList ();
2387 l.Add ("key1", "banana");
2388 l.Add ("key2", "apple");
2394 public class StackContainer : CollectionContainer<Stack> {
2395 protected override Stack Init ()
2397 var s = new Stack ();
2404 public class EnumerableWithAdd : IEnumerable
2406 private ArrayList items;
2408 public EnumerableWithAdd()
2410 items = new ArrayList();
2413 public IEnumerator GetEnumerator()
2415 return items.GetEnumerator();
2418 public void Add(object value)
2431 public class EnumerableWithSpecialAdd : IEnumerable
2433 private ArrayList items;
2435 public EnumerableWithSpecialAdd()
2437 items = new ArrayList();
2440 public IEnumerator GetEnumerator()
2442 return items.GetEnumerator();
2445 public void Add(object value, int index)
2460 public class EnumerableWithAddContainer : CollectionContainer<EnumerableWithAdd>
2462 protected override EnumerableWithAdd Init()
2464 var s = new EnumerableWithAdd();
2472 public class EnumerableWithSpecialAddContainer : CollectionContainer<EnumerableWithSpecialAdd>
2474 protected override EnumerableWithSpecialAdd Init()
2476 var s = new EnumerableWithSpecialAdd();
2484 public class GenericDictionaryContainer : CollectionContainer<Dictionary<string, string>> {
2485 protected override Dictionary<string, string> Init ()
2487 var d = new Dictionary<string, string> ();
2488 d.Add ("key1", "banana");
2489 d.Add ("key2", "apple");
2495 public class GenericHashSetContainer : CollectionContainer<HashSet<string>> {
2496 protected override HashSet<string> Init ()
2498 return new HashSet<string> { "banana", "apple" };
2503 public class GenericLinkedListContainer : CollectionContainer<LinkedList<string>> {
2504 protected override LinkedList<string> Init ()
2506 var l = new LinkedList<string> ();
2507 l.AddFirst ("apple");
2508 l.AddFirst ("banana");
2514 public class GenericListContainer : CollectionContainer<List<string>> {
2515 protected override List<string> Init ()
2517 return new List<string> { "banana", "apple" };
2522 public class GenericQueueContainer : CollectionContainer<Queue<string>> {
2523 protected override Queue<string> Init ()
2525 var q = new Queue<string> ();
2526 q.Enqueue ("banana");
2527 q.Enqueue ("apple" );
2533 public class GenericSortedDictionaryContainer : CollectionContainer<SortedDictionary<string, string>> {
2534 protected override SortedDictionary<string, string> Init ()
2536 var d = new SortedDictionary<string, string> ();
2537 d.Add ("key1", "banana");
2538 d.Add ("key2", "apple");
2544 public class GenericSortedListContainer : CollectionContainer<SortedList<string, string>> {
2545 protected override SortedList<string, string> Init ()
2547 var d = new SortedList<string, string> ();
2548 d.Add ("key1", "banana");
2549 d.Add ("key2", "apple");
2555 public class GenericStackContainer : CollectionContainer<Stack<string>> {
2556 protected override Stack<string> Init ()
2558 var s = new Stack<string> ();
2565 public class GenericEnumerableWithAdd : IEnumerable<string>
2567 private List<string> items;
2569 public GenericEnumerableWithAdd()
2571 items = new List<string>();
2574 IEnumerator IEnumerable.GetEnumerator()
2576 return items.GetEnumerator ();
2579 public IEnumerator<string> GetEnumerator()
2581 return items.GetEnumerator ();
2584 public void Add(string value)
2597 public class GenericEnumerableWithSpecialAdd : IEnumerable<string>
2599 private List<string> items;
2601 public GenericEnumerableWithSpecialAdd()
2603 items = new List<string>();
2606 IEnumerator IEnumerable.GetEnumerator()
2608 return items.GetEnumerator ();
2611 public IEnumerator<string> GetEnumerator()
2613 return items.GetEnumerator ();
2616 public void Add(string value, int index)
2631 public class GenericEnumerableWithAddContainer : CollectionContainer<GenericEnumerableWithAdd>
2633 protected override GenericEnumerableWithAdd Init()
2635 var s = new GenericEnumerableWithAdd();
2643 public class GenericEnumerableWithSpecialAddContainer : CollectionContainer<GenericEnumerableWithSpecialAdd>
2645 protected override GenericEnumerableWithSpecialAdd Init()
2647 var s = new GenericEnumerableWithSpecialAdd();
2655 public class NonCollectionGetOnlyContainer
2657 string _test = "my string";
2660 public string MyString {