New test.
[mono.git] / mcs / class / System.XML / Test / System.Xml.Serialization / XmlSerializerTestClasses.cs
1 //\r
2 // System.Xml.XmlSerializerTestClasses\r
3 //\r
4 // Author:\r
5 //   Erik LeBel <eriklebel@yahoo.ca>\r
6 //\r
7 // (C) 2003 Erik LeBel\r
8 //\r
9 // Classes to use in the testing of the XmlSerializer\r
10 //\r
11 \r
12 using System;\r
13 using System.ComponentModel;\r
14 using System.Collections;\r
15 using System.Xml;\r
16 using System.Xml.Schema;\r
17 using System.Xml.Serialization;\r
18 \r
19 namespace MonoTests.System.Xml.TestClasses\r
20 {\r
21         public enum SimpleEnumeration { FIRST, SECOND };\r
22 \r
23         [Flags]\r
24         public enum EnumDefaultValue { e1 = 1, e2 = 2, e3 = 3 }\r
25         public enum EnumDefaultValueNF { e1 = 1, e2 = 2, e3 = 3 }\r
26 \r
27         [Flags]\r
28         public enum FlagEnum { \r
29                 [XmlEnum ("one")]\r
30                 e1 = 1,\r
31                 [XmlEnum ("two")]\r
32                 e2 = 2,\r
33                 [XmlEnum ("four")]\r
34                 e4 = 4\r
35         }\r
36 \r
37         [Flags]\r
38         [SoapType ("flagenum")]\r
39         public enum FlagEnum_Encoded\r
40         {\r
41                 [SoapEnum ("one")]\r
42                 e1 = 1,\r
43                 [SoapEnum ("two")]\r
44                 e2 = 2,\r
45                 [SoapEnum ("four")]\r
46                 e4 = 4\r
47         }\r
48 \r
49         [Flags]\r
50         public enum ZeroFlagEnum {\r
51                 [XmlEnum ("zero")]\r
52                 e0 = 0,\r
53                 [XmlEnum ("o<n>e")]\r
54                 e1 = 1,\r
55                 [XmlEnum ("tns:t<w>o")]\r
56                 e2 = 2,\r
57                 [XmlEnum ("four")]\r
58                 [XmlIgnore]\r
59                 e4 = 4\r
60         }\r
61         \r
62         public class SimpleClass\r
63         {\r
64                 public string something = null;\r
65         }\r
66 \r
67         public class StringCollection : CollectionBase\r
68         {\r
69                 public void Add (String parameter) \r
70                 {\r
71                         List.Insert (Count, parameter);\r
72                 }\r
73                         \r
74                 public String this [int index]\r
75                 {\r
76                         get\r
77                         { \r
78                                 if (index < 0 || index > Count)\r
79                                         throw new ArgumentOutOfRangeException ();\r
80                                         \r
81                                 return (String) List [index]; \r
82                         }\r
83                         set { List [index] = value; }\r
84                 }\r
85         }\r
86         \r
87         public class StringCollectionContainer\r
88         {\r
89                 StringCollection messages = new StringCollection();\r
90                 \r
91                 public StringCollection Messages\r
92                 {\r
93                         get { return messages; }\r
94                 }\r
95         }\r
96 \r
97         public class ArrayContainer\r
98         {\r
99                 public object [] items = null;\r
100         }\r
101         \r
102         public class ClassArrayContainer\r
103         {\r
104                 public SimpleClass [] items = null;\r
105         }\r
106         \r
107         [XmlRoot("simple")]\r
108         public class SimpleClassWithXmlAttributes\r
109         {\r
110                 [XmlAttribute("member")]\r
111                 public string something = null;\r
112         }\r
113         \r
114         [XmlRoot("field")]\r
115         public class Field\r
116         {\r
117                 [XmlAttribute ("flag1")]\r
118                 [DefaultValue (1)]\r
119                 public FlagEnum Flags1;\r
120 \r
121                 [XmlAttribute ("flag2")]\r
122                 [DefaultValue (FlagEnum.e1)]\r
123                 public FlagEnum Flags2;\r
124 \r
125                 [XmlAttribute ("flag3", Form = XmlSchemaForm.Qualified)]\r
126                 [DefaultValue (FlagEnum.e1 | FlagEnum.e2)]\r
127                 public FlagEnum Flags3;\r
128 \r
129                 [XmlAttribute ("flag4")]\r
130                 public FlagEnum Flags4;\r
131 \r
132                 [XmlAttribute("modifiers")]\r
133                 public MapModifiers Modifiers;\r
134 \r
135                 [XmlAttribute ("modifiers2", Form=XmlSchemaForm.Unqualified)]\r
136                 public MapModifiers Modifiers2;\r
137 \r
138                 [XmlAttribute ("modifiers3")]\r
139                 [DefaultValue (0)]\r
140                 public MapModifiers Modifiers3;\r
141 \r
142                 [XmlAttribute ("modifiers4", Form=XmlSchemaForm.Unqualified)]\r
143                 [DefaultValue (MapModifiers.Protected)]\r
144                 public MapModifiers Modifiers4;\r
145 \r
146                 [XmlAttribute ("modifiers5", Form = XmlSchemaForm.Qualified)]\r
147                 [DefaultValue (MapModifiers.Public)]\r
148                 public MapModifiers Modifiers5;\r
149 \r
150                 [XmlAttribute ("names")]\r
151                 public string[] Names;\r
152 \r
153                 [XmlAttribute ("street")]\r
154                 public string Street;\r
155         }\r
156 \r
157         [SoapType ("field", Namespace = "some:urn")]\r
158         public class Field_Encoded\r
159         {\r
160                 [SoapAttribute ("flag1")]\r
161                 [DefaultValue (FlagEnum_Encoded.e1)]\r
162                 public FlagEnum_Encoded Flags1;\r
163 \r
164                 [SoapAttribute ("flag2")]\r
165                 [DefaultValue (FlagEnum_Encoded.e1)]\r
166                 public FlagEnum_Encoded Flags2;\r
167 \r
168                 [SoapAttribute ("flag3")]\r
169                 [DefaultValue (FlagEnum_Encoded.e1 | FlagEnum_Encoded.e2)]\r
170                 public FlagEnum_Encoded Flags3;\r
171 \r
172                 [SoapAttribute ("flag4")]\r
173                 public FlagEnum_Encoded Flags4;\r
174 \r
175                 [SoapAttribute ("modifiers")]\r
176                 public MapModifiers Modifiers;\r
177 \r
178                 [SoapAttribute ("modifiers2")]\r
179                 public MapModifiers Modifiers2;\r
180 \r
181                 [SoapAttribute ("modifiers3")]\r
182                 [DefaultValue (MapModifiers.Public)]\r
183                 public MapModifiers Modifiers3;\r
184 \r
185                 [SoapAttribute ("modifiers4")]\r
186                 [DefaultValue (MapModifiers.Protected)]\r
187                 public MapModifiers Modifiers4;\r
188 \r
189                 [SoapAttribute ("modifiers5")]\r
190                 [DefaultValue (MapModifiers.Public)]\r
191                 public MapModifiers Modifiers5;\r
192 \r
193                 public string[] Names;\r
194 \r
195                 [SoapAttribute ("street")]\r
196                 public string Street;\r
197         }\r
198 \r
199         [Flags]\r
200         public enum MapModifiers\r
201         {\r
202                 [XmlEnum("public")]\r
203                 Public = 0,\r
204                 [XmlEnum("protected")]\r
205                 Protected = 1,\r
206         }\r
207 \r
208         public class MyList : ArrayList\r
209         {\r
210                 object container;\r
211                 \r
212                 // NOTE: MyList has no public constructor\r
213                 public MyList (object container) : base()\r
214                 {\r
215                         this.container = container;\r
216                 }\r
217         }\r
218         \r
219         public class Container\r
220         {\r
221                 public MyList Items;\r
222                 \r
223                 public Container () {\r
224                         Items = new MyList(this);\r
225                 }\r
226         }\r
227         \r
228         public class Container2\r
229         {\r
230                 public MyList Items;\r
231                 \r
232                 public Container2 () {\r
233                 }\r
234                 \r
235                 public Container2 (bool b) {\r
236                         Items = new MyList(this);\r
237                 }\r
238         }\r
239 \r
240         public class MyElem: XmlElement\r
241         {\r
242                 public MyElem (XmlDocument doc): base ("","myelem","", doc)\r
243                 {\r
244                         SetAttribute ("aa","1");\r
245                 }\r
246 \r
247                 [XmlAttribute]\r
248                 public int kk=1;\r
249         }\r
250 \r
251         public class MyDocument: XmlDocument\r
252         {\r
253                 public MyDocument ()\r
254                 {\r
255                 }\r
256 \r
257                 [XmlAttribute]\r
258                 public int kk=1;\r
259         }\r
260         \r
261         public class CDataContainer\r
262         {\r
263                 public XmlCDataSection cdata;\r
264         }\r
265         \r
266         public class NodeContainer\r
267         {\r
268                 public XmlNode node;\r
269         }\r
270         \r
271         public class Choices\r
272         {\r
273                 [XmlElementAttribute("ChoiceZero", typeof(string), IsNullable=false)]\r
274                 [XmlElementAttribute("ChoiceOne", typeof(string), IsNullable=false)]\r
275                 [XmlElementAttribute("ChoiceTwo", typeof(string), IsNullable=false)]\r
276                 [XmlChoiceIdentifier("ItemType")]\r
277                 public string MyChoice;\r
278 \r
279                 [XmlIgnore]\r
280                 public ItemChoiceType ItemType;\r
281         }\r
282         \r
283         [XmlType(IncludeInSchema = false)]\r
284         public enum ItemChoiceType\r
285         {\r
286                 ChoiceZero,\r
287                 [XmlEnum ("ChoiceOne")]\r
288                 StrangeOne,\r
289                 ChoiceTwo,\r
290         }\r
291         \r
292         public class WrongChoices\r
293         {\r
294                 [XmlElementAttribute("ChoiceZero", typeof(string), IsNullable=false)]\r
295                 [XmlElementAttribute("StrangeOne", typeof(string), IsNullable=false)]\r
296                 [XmlElementAttribute("ChoiceTwo", typeof(string), IsNullable=false)]\r
297                 [XmlChoiceIdentifier("ItemType")]\r
298                 public string MyChoice;\r
299 \r
300                 [XmlIgnore]\r
301                 public ItemChoiceType ItemType;\r
302         }\r
303         \r
304         [XmlType ("Type with space")]\r
305         public class TestSpace\r
306         {\r
307            [XmlElement (ElementName = "Element with space")]\r
308            public int elem;\r
309             \r
310            [XmlAttribute (AttributeName = "Attribute with space")]\r
311            public int attr; \r
312         }\r
313 \r
314         [Serializable]\r
315         public class ReadOnlyProperties {\r
316                 string[] strArr = new string[2] { "string1", "string2" };\r
317 \r
318                 public string[] StrArr {\r
319                         get { return strArr; }\r
320                 }\r
321                 \r
322                 public string dat {\r
323                         get { return "fff"; }\r
324                 } \r
325         }\r
326         \r
327         [XmlRoot("root")]\r
328         public class ListDefaults\r
329         {\r
330                 public ListDefaults ()\r
331                 {\r
332                         ed = new SimpleClass ();\r
333                         str = "hola";\r
334                 }\r
335                 \r
336             public ArrayList list2;\r
337             \r
338             public MyList list3;\r
339             \r
340             public string[] list4;\r
341             \r
342                 [XmlElement("e", typeof(SimpleClass))]\r
343             public ArrayList list5;\r
344             \r
345                 [DefaultValue (null)]\r
346             public SimpleClass ed;\r
347             \r
348                 [DefaultValue (null)]\r
349             public string str; \r
350         }\r
351         \r
352         public class clsPerson\r
353         {\r
354                 public IList EmailAccounts;\r
355         }\r
356         \r
357         public class ArrayClass\r
358         {\r
359                 public object names = new object[] { "un","dos" };\r
360         }\r
361         \r
362         public class CompositeValueType\r
363         {\r
364                 public void Init ()\r
365                 {\r
366                         Items = new object[] { 1, 2 };\r
367                         ItemsElementName = new ItemsChoiceType[] { ItemsChoiceType.In, ItemsChoiceType.Es };\r
368                 }\r
369            \r
370                 [XmlElementAttribute("Es", typeof(int))]\r
371                 [XmlElementAttribute("In", typeof(int))]\r
372                 [XmlChoiceIdentifierAttribute("ItemsElementName")]\r
373                 public object[] Items;\r
374            \r
375                 [XmlElementAttribute("ItemsElementName")]\r
376                 [XmlIgnoreAttribute()]\r
377                 public ItemsChoiceType[] ItemsElementName;\r
378         }\r
379 \r
380         public enum ItemsChoiceType {\r
381            In, Es\r
382         }\r
383         \r
384         public class ArrayAttributeWithType\r
385         {\r
386                 [XmlAttribute (DataType="anyURI")]\r
387                 public string[] at = new string [] { "a","b" };\r
388 \r
389                 [XmlAttribute (DataType="base64Binary")]\r
390                 public byte[][] bin1 = new byte[][] { new byte[]{1,2},  new byte[]{1,2}};\r
391                 \r
392                 [XmlAttribute (DataType="base64Binary")]\r
393                 public byte[] bin2 = new byte[] { 1,2 };\r
394         }\r
395         \r
396         public class ArrayAttributeWithWrongType\r
397         {\r
398                 [XmlAttribute (DataType="int")]\r
399                 public string[] at = new string [] { "a","b" };\r
400         }\r
401         \r
402         [XmlType ("Container")]\r
403         public class EntityContainer\r
404         {\r
405                 EntityCollection collection1;\r
406                 EntityCollection collection2;\r
407                 EntityCollection collection3 = new EntityCollection ("root");\r
408                 EntityCollection collection4 = new EntityCollection ("root");\r
409                 \r
410                 [XmlArray (IsNullable=true)]\r
411                 public EntityCollection Collection1 {\r
412                         get { return collection1; }\r
413                         set { collection1 = value; collection1.Container = "assigned"; }\r
414                 }\r
415                 \r
416                 [XmlArray (IsNullable=false)]\r
417                 public EntityCollection Collection2 {\r
418                         get { return collection2; }\r
419                         set { collection2 = value; collection2.Container = "assigned"; }\r
420                 }\r
421                 \r
422                 [XmlArray (IsNullable=true)]\r
423                 public EntityCollection Collection3 {\r
424                         get { return collection3; }\r
425                         set { collection3 = value; collection3.Container = "assigned"; }\r
426                 }\r
427                 \r
428                 [XmlArray (IsNullable=false)]\r
429                 public EntityCollection Collection4 {\r
430                         get { return collection4; }\r
431                         set { collection4 = value; collection4.Container = "assigned"; }\r
432                 }\r
433         }\r
434         \r
435         [XmlType ("Container")]\r
436         public class ArrayEntityContainer\r
437         {\r
438                 Entity[] collection1;\r
439                 Entity[] collection2;\r
440                 Entity[] collection3 = new Entity [0];\r
441                 Entity[] collection4 = new Entity [0];\r
442                 \r
443                 [XmlArray (IsNullable=true)]\r
444                 public Entity[] Collection1 {\r
445                         get { return collection1; }\r
446                         set { collection1 = value; }\r
447                 }\r
448                 \r
449                 [XmlArray (IsNullable=false)]\r
450                 public Entity[] Collection2 {\r
451                         get { return collection2; }\r
452                         set { collection2 = value; }\r
453                 }\r
454                 \r
455                 [XmlArray (IsNullable=true)]\r
456                 public Entity[] Collection3 {\r
457                         get { return collection3; }\r
458                         set { collection3 = value; }\r
459                 }\r
460                 \r
461                 [XmlArray (IsNullable=false)]\r
462                 public Entity[] Collection4 {\r
463                         get { return collection4; }\r
464                         set { collection4 = value; }\r
465                 }\r
466         }\r
467         \r
468         public class Entity\r
469         {\r
470                 private string _name = string.Empty;\r
471                 private string _parent = null;\r
472 \r
473                 [XmlAttribute]\r
474                 public string Name {\r
475                         get { return _name; }\r
476                         set { _name = value; }\r
477                 }\r
478 \r
479                 [XmlIgnore] \r
480                 public string Parent {\r
481                         get { return _parent; }\r
482                         set { _parent = value; }\r
483                 }\r
484         }\r
485 \r
486         public class EntityCollection : ArrayList\r
487         {\r
488                 public string _container;\r
489 \r
490                 public EntityCollection ()\r
491                 {\r
492                 }\r
493 \r
494                 public EntityCollection (string c)\r
495                 {\r
496                         _container = c;\r
497                 }\r
498 \r
499                 public string Container {\r
500                         get { return _container; }\r
501                         set { _container = value; }\r
502                 }\r
503 \r
504                 public int Add (Entity value)\r
505                 {\r
506                         if(_container != null)\r
507                                 value.Parent = _container;\r
508 \r
509                         return base.Add(value);\r
510                 }\r
511 \r
512                 public new Entity this[int index]\r
513                 {\r
514                         get { return (Entity) base[index]; }\r
515                         set { base[index] = value; }\r
516                 }\r
517         }\r
518         \r
519         [XmlType ("Container")]\r
520         public class ObjectWithReadonlyCollection\r
521         {\r
522                 EntityCollection collection1 = new EntityCollection ("root");\r
523                 \r
524                 public EntityCollection Collection1 {\r
525                         get { return collection1; }\r
526                 }\r
527         }\r
528         \r
529         [XmlType ("Container")]\r
530         public class ObjectWithReadonlyNulCollection\r
531         {\r
532                 EntityCollection collection1;\r
533                 \r
534                 public EntityCollection Collection1 {\r
535                         get { return collection1; }\r
536                 }\r
537         }\r
538         \r
539         [XmlType ("Container")]\r
540         public class ObjectWithReadonlyArray\r
541         {\r
542                 Entity[] collection1 = new Entity [0];\r
543                 \r
544                 public Entity[] Collection1 {\r
545                         get { return collection1; }\r
546                 }\r
547         }\r
548         \r
549         [XmlInclude (typeof(SubclassTestSub))]\r
550         public class SubclassTestBase\r
551         {\r
552         }\r
553         \r
554         public class SubclassTestSub: SubclassTestBase\r
555         {\r
556         }\r
557         \r
558         public class SubclassTestExtra\r
559         {\r
560         }\r
561         \r
562         public class SubclassTestContainer\r
563         {\r
564                 [XmlElement ("a", typeof(SubclassTestBase))]\r
565                 [XmlElement ("b", typeof(SubclassTestExtra))]\r
566                 public object data;\r
567         }\r
568 \r
569         public class DictionaryWithIndexer : DictionaryBase\r
570         {\r
571                 public TimeSpan this[int index] {\r
572                         get { return TimeSpan.MinValue; }\r
573                 }\r
574 \r
575                 public void Add (TimeSpan value)\r
576                 {\r
577                 }\r
578         }\r
579 \r
580         [XmlRoot(Namespace="some:urn")]\r
581         [SoapTypeAttribute (Namespace="another:urn")]\r
582         public class PrimitiveTypesContainer\r
583         {\r
584                 public PrimitiveTypesContainer ()\r
585                 {\r
586                         Number = 2004;\r
587                         Name = "some name";\r
588                         Index = (byte) 56;\r
589                         Password = new byte[] { 243, 15 };\r
590                         PathSeparatorCharacter = '/';\r
591                 }\r
592 \r
593                 public int Number;\r
594                 public string Name;\r
595                 public byte Index;\r
596                 public byte[] Password;\r
597                 public char PathSeparatorCharacter;\r
598         }\r
599         \r
600         public class TestSchemaForm1\r
601         {\r
602                 public PrintTypeResponse p1;\r
603                 \r
604                 [XmlElement(Namespace="urn:oo")]\r
605                 public PrintTypeResponse p2;\r
606         }\r
607 \r
608         [XmlType (Namespace="urn:testForm")]\r
609         public class TestSchemaForm2\r
610         {\r
611                 public PrintTypeResponse p1;\r
612                 \r
613                 [XmlElement(Namespace="urn:oo")]\r
614                 public PrintTypeResponse p2;\r
615         }\r
616 \r
617         [XmlType (Namespace="urn:responseTypes")]\r
618         public class PrintTypeResponse {\r
619                 [XmlElement (Form=XmlSchemaForm.Unqualified, IsNullable=true)]\r
620             public OutputType result;\r
621             public PrintTypeResponse intern;\r
622             \r
623             public void Init ()\r
624             {\r
625                 result = new OutputType ();\r
626                 result.data = "data1";\r
627                 intern = new PrintTypeResponse ();\r
628                 intern.result = new OutputType ();\r
629                 intern.result.data = "data2";\r
630             }\r
631         }\r
632 \r
633         [XmlType (Namespace="urn:responseTypes")]\r
634         public class OutputType {\r
635             \r
636                 [XmlElement (Form=XmlSchemaForm.Unqualified, IsNullable=true)]\r
637             public string data;\r
638         }\r
639 \r
640         [XmlRootAttribute ("testDefault", Namespace="urn:myNS", IsNullable=false)]\r
641         [SoapType("testDefault", Namespace="urn:myNS")]\r
642         public class TestDefault\r
643         {\r
644                 public string str;\r
645 \r
646                 [DefaultValue ("Default Value")]\r
647                 public string strDefault = "Default Value";\r
648 \r
649                 [DefaultValue (true)]\r
650                 public bool boolT = true;\r
651 \r
652                 [DefaultValue (false)]\r
653                 public bool boolF = false;\r
654 \r
655                 [DefaultValue (typeof (decimal), "10")]\r
656                 public decimal decimalval = 10m;\r
657 \r
658                 [DefaultValue (FlagEnum.e1 | FlagEnum.e4)]\r
659                 public FlagEnum flag = (FlagEnum.e1 | FlagEnum.e4);\r
660 \r
661                 [DefaultValue (FlagEnum_Encoded.e1 | FlagEnum_Encoded.e4)]\r
662                 public FlagEnum_Encoded flagencoded = (FlagEnum_Encoded.e1 | FlagEnum_Encoded.e4);\r
663         }\r
664 \r
665         [XmlType ("optionalValueType", Namespace="some:urn")]\r
666         [XmlRootAttribute ("optionalValue", Namespace="another:urn", IsNullable=false)]\r
667         public class OptionalValueTypeContainer\r
668         {\r
669                 [DefaultValue (FlagEnum.e1 | FlagEnum.e4)]\r
670                 public FlagEnum Attributes = FlagEnum.e1 | FlagEnum.e4;\r
671 \r
672                 [DefaultValue (FlagEnum.e1)]\r
673                 public FlagEnum Flags = FlagEnum.e1;\r
674 \r
675                 [XmlIgnore]\r
676                 [SoapIgnore]\r
677                 public bool FlagsSpecified;\r
678 \r
679                 [DefaultValue (false)]\r
680                 public bool IsEmpty;\r
681 \r
682                 [XmlIgnore]\r
683                 [SoapIgnore]\r
684                 public bool IsEmptySpecified {\r
685                         get { return _isEmptySpecified; }\r
686                         set { _isEmptySpecified = value; }\r
687                 }\r
688 \r
689                 [DefaultValue (false)]\r
690                 public bool IsNull;\r
691 \r
692                 private bool _isEmptySpecified;\r
693         }\r
694 }\r
695 \r