merge -r 53370:58178
[mono.git] / mcs / class / System.XML / Test / System.Xml.Serialization / DeserializeTests.cs
1 //\r
2 // System.Xml.DeserializationTests\r
3 //\r
4 // Author:\r
5 //      Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>\r
6 //\r
7 // (C) 2003 Atsushi Enomoto\r
8 //\r
9 //\r
10 using System;\r
11 using System.IO;\r
12 using System.Xml;\r
13 using System.Xml.Serialization;\r
14 using NUnit.Framework;\r
15 using MonoTests.System.Xml.TestClasses;\r
16 \r
17 namespace MonoTests.System.XmlSerialization\r
18 {\r
19         public class Sample\r
20         {\r
21                 public string Text;\r
22                 public string [] ArrayText;\r
23         }\r
24 \r
25         [TestFixture]\r
26         public class DeserializationTests\r
27         {\r
28                 object result;\r
29 \r
30                 private object Deserialize (Type t, string xml)\r
31                 {\r
32                         StringReader sr = new StringReader (xml);\r
33                         XmlReader xr = new XmlTextReader (sr);\r
34                         return Deserialize (t, xr);\r
35                 }\r
36 \r
37                 private object DeserializeEncoded (Type t, string xml)\r
38                 {\r
39                         StringReader sr = new StringReader (xml);\r
40                         XmlReader xr = new XmlTextReader (sr);\r
41                         return DeserializeEncoded (t, xr);\r
42                 }\r
43 \r
44                 private object Deserialize (Type t, XmlReader xr)\r
45                 {\r
46                         XmlSerializer ser = new XmlSerializer (t);\r
47                         result = ser.Deserialize (xr);\r
48                         return result;\r
49                 }\r
50 \r
51                 private object DeserializeEncoded (Type t, XmlReader xr)\r
52                 {\r
53                         SoapReflectionImporter im = new SoapReflectionImporter ();\r
54                         XmlTypeMapping tm = im.ImportTypeMapping (t);\r
55                         XmlSerializer ser = new XmlSerializer (tm);\r
56                         result = ser.Deserialize (xr);\r
57                         return result;\r
58                 }\r
59 \r
60                 [Test]\r
61                 public void SimpleDeserialize ()\r
62                 {\r
63                         Deserialize (typeof (Sample), "<Sample><Text>Test.</Text></Sample>");\r
64                         Assertion.AssertEquals (typeof (Sample), result.GetType ());\r
65                         Sample sample = result as Sample;\r
66                         Assertion.AssertEquals ("Test.", sample.Text);\r
67                 }\r
68 \r
69                 [Test]\r
70                 public void DeserializeInt ()\r
71                 {\r
72                         Deserialize (typeof (int), "<int>10</int>");\r
73                         Assertion.AssertEquals (typeof (int), result.GetType ());\r
74                         Assertion.AssertEquals (10, result);\r
75                 }\r
76 \r
77                 [Test]\r
78                 public void DeserializeSimpleArray ()\r
79                 {\r
80                         Deserialize (typeof (Sample), "<Sample><ArrayText><string>Test1</string><string>Test2</string></ArrayText></Sample>");\r
81                         Assertion.AssertEquals (typeof (Sample), result.GetType ());\r
82                         Sample sample = result as Sample;\r
83                         Assertion.AssertEquals ("Test1", sample.ArrayText [0]);\r
84                         Assertion.AssertEquals ("Test2", sample.ArrayText [1]);\r
85                 }\r
86 \r
87                 [Test]\r
88                 public void DeserializeEmptyEnum ()\r
89                 {\r
90                         Field f = Deserialize (typeof (Field), "<field modifiers=\"\" />") as Field;\r
91                         Assertion.AssertEquals (MapModifiers.Public, f.Modifiers);\r
92                 }\r
93                 \r
94                 [Test]\r
95                 public void DeserializePrivateCollection ()\r
96                 {\r
97                         MemoryStream ms = new MemoryStream ();\r
98                         Container c = new Container();\r
99                         c.Items.Add(1);\r
100                         \r
101                         XmlSerializer serializer = new XmlSerializer(typeof(Container));\r
102                         serializer.Serialize(ms, c);\r
103                         \r
104                         ms.Position = 0;\r
105                         c = (Container) serializer.Deserialize (ms);\r
106                         Assertion.AssertEquals (1, c.Items[0]);\r
107                 }\r
108                 \r
109                 [Test]\r
110                 [Category("NotDotNet")]\r
111                 [ExpectedException (typeof (InvalidOperationException))]\r
112                 public void DeserializeEmptyPrivateCollection ()\r
113                 {\r
114                         MemoryStream ms = new MemoryStream ();\r
115                         Container2 c = new Container2(true);\r
116                         c.Items.Add(1);\r
117                         \r
118                         XmlSerializer serializer = new XmlSerializer(typeof(Container2));\r
119                         serializer.Serialize(ms, c);\r
120                         \r
121                         ms.Position = 0;\r
122                         c = (Container2) serializer.Deserialize (ms);\r
123                 }\r
124                 \r
125                 [Test]\r
126                 [Category("NotDotNet")]\r
127                 public void DeserializeArrayReferences ()\r
128                 {\r
129                         string s = "<Sample xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">";\r
130                         s += "<ArrayText xmlns:n3=\"http://schemas.xmlsoap.org/soap/encoding/\" xsi:type=\"n3:Array\" n3:arrayType=\"xsd:string[2]\">";\r
131                         s += "<item href=\"#id-606830706\"></item>";\r
132                         s += "<item xsi:type=\"xsd:string\">Hola</item>";\r
133                         s += "</ArrayText>";\r
134                         s += "<string id=\"id-606830706\" xsi:type=\"xsd:string\">Adeu</string>";\r
135                         s += "</Sample>";\r
136                         DeserializeEncoded (typeof(Sample), s);\r
137                 }\r
138                 \r
139                 
140                 [Test]
141                 public void TestDeserializeXmlNodeArray ()
142                 {
143                         object ob = Deserialize (typeof(object), "<anyType at=\"1\"><elem1/><elem2/></anyType>");
144                         Assertion.Assert ("Is node array", ob is XmlNode[]);
145                         
146                         XmlNode[] nods = (XmlNode[]) ob; 
147                         Assertion.AssertEquals ("lengh", 3, nods.Length);
148                         Assertion.Assert ("#1", nods[0] is XmlAttribute);
149                         Assertion.AssertEquals ("#2", "at", ((XmlAttribute)nods[0]).LocalName);
150                         Assertion.AssertEquals ("#3", "1", ((XmlAttribute)nods[0]).Value);
151                         Assertion.Assert ("#4", nods[1] is XmlElement);
152                         Assertion.AssertEquals ("#5", "elem1", ((XmlElement)nods[1]).LocalName);
153                         Assertion.Assert ("#6", nods[2] is XmlElement);
154                         Assertion.AssertEquals ("#7", "elem2", ((XmlElement)nods[2]).LocalName);
155                 }\r
156                 
157                 [Test]
158                 public void TestDeserializeXmlElement ()
159                 {
160                         object ob = Deserialize (typeof(XmlElement), "<elem/>");
161                         Assertion.Assert ("#1", ob is XmlElement);
162                         Assertion.AssertEquals ("#2", "elem", ((XmlElement)ob).LocalName);
163                 }\r
164                 
165                 [Test]
166                 public void TestDeserializeXmlCDataSection ()
167                 {
168                         CDataContainer c = (CDataContainer) Deserialize (typeof(CDataContainer), "<CDataContainer xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><cdata><![CDATA[data section contents]]></cdata></CDataContainer>");
169                         Assertion.AssertNotNull ("#1", c.cdata);
170                         Assertion.AssertEquals ("#2", "data section contents", c.cdata.Value);
171                 }\r
172                 \r
173                 [Test]
174                 public void TestDeserializeXmlNode ()
175                 {
176                         NodeContainer c = (NodeContainer) Deserialize (typeof(NodeContainer), "<NodeContainer xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><node>text</node></NodeContainer>");
177                         Assertion.Assert ("#1", c.node is XmlText);
178                         Assertion.AssertEquals ("#2", "text", c.node.Value);
179                 }\r
180                 \r
181                 [Test]\r
182                 public void TestDeserializeChoices ()\r
183                 {\r
184                         Choices ch = (Choices) Deserialize (typeof(Choices), "<Choices><ChoiceZero>choice text</ChoiceZero></Choices>");\r
185                         Assertion.AssertEquals ("#1", "choice text", ch.MyChoice);\r
186                         Assertion.AssertEquals ("#2", ItemChoiceType.ChoiceZero, ch.ItemType);\r
187                         \r
188                         ch = (Choices) Deserialize (typeof(Choices), "<Choices><ChoiceOne>choice text</ChoiceOne></Choices>");\r
189                         Assertion.AssertEquals ("#1", "choice text", ch.MyChoice);\r
190                         Assertion.AssertEquals ("#2", ItemChoiceType.StrangeOne, ch.ItemType);\r
191                         \r
192                         ch = (Choices) Deserialize (typeof(Choices), "<Choices><ChoiceTwo>choice text</ChoiceTwo></Choices>");\r
193                         Assertion.AssertEquals ("#1", "choice text", ch.MyChoice);\r
194                         Assertion.AssertEquals ("#2", ItemChoiceType.ChoiceTwo, ch.ItemType);\r
195                 }
196                 \r
197                 [Test]\r
198                 public void TestDeserializeNamesWithSpaces ()\r
199                 {
200                         TestSpace ts = (TestSpace) Deserialize (typeof(TestSpace), "<Type_x0020_with_x0020_space xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' Attribute_x0020_with_x0020_space='5'><Element_x0020_with_x0020_space>4</Element_x0020_with_x0020_space></Type_x0020_with_x0020_space>");
201                         Assertion.AssertEquals ("#1", 4, ts.elem);\r
202                         Assertion.AssertEquals ("#2", 5, ts.attr);\r
203                 }
204                 
205                 [Test]\r
206                 public void TestDeserializeDefaults ()
207                 {
208                         ListDefaults d2 = (ListDefaults) Deserialize (typeof(ListDefaults), "<root/>");
209                 
210                 Assertion.AssertNotNull ("list2", d2.list2);
211                 Assertion.AssertNull ("list3", d2.list3);
212                 Assertion.AssertNull ("list4", d2.list4);
213                 Assertion.AssertNotNull ("list5", d2.list5);
214                 Assertion.AssertNotNull ("ed", d2.ed);
215                 Assertion.AssertNotNull ("str", d2.str);
216                 
217                         d2 = (ListDefaults) Deserialize (typeof(ListDefaults), "<root></root>");
218                 
219                 Assertion.AssertNotNull ("2 list2", d2.list2);
220                 Assertion.AssertNull ("2 list3", d2.list3);
221                 Assertion.AssertNull ("2 list4", d2.list4);
222                 Assertion.AssertNotNull ("2 list5", d2.list5);
223                 Assertion.AssertNotNull ("2 ed", d2.ed);
224                 Assertion.AssertNotNull ("2 str", d2.str);
225                 }
226                 \r
227                 [Test]\r
228                 public void TestDeserializeChoiceArray ()
229                 {
230                         CompositeValueType v = (CompositeValueType) Deserialize (typeof(CompositeValueType), "<?xml version=\"1.0\" encoding=\"utf-16\"?><CompositeValueType xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><In>1</In><Es>2</Es></CompositeValueType>");
231                 Assertion.AssertNotNull ("v.Items", v.Items);
232                 Assertion.AssertNotNull ("v.ItemsElementName", v.ItemsElementName);
233                         Assertion.AssertEquals ("v.Items.Length", 2, v.Items.Length);\r
234                         Assertion.AssertEquals ("v.ItemsElementName.Length", 2, v.ItemsElementName.Length);\r
235                         Assertion.AssertEquals ("v.Items[0]", 1, v.Items[0]);\r
236                         Assertion.AssertEquals ("v.Items[1]", 2, v.Items[1]);\r
237                         Assertion.AssertEquals ("v.ItemsElementName[0]", ItemsChoiceType.In, v.ItemsElementName[0]);\r
238                         Assertion.AssertEquals ("v.ItemsElementName[1]", ItemsChoiceType.Es, v.ItemsElementName[1]);\r
239                 }
240         }\r
241 }\r