2003-5-15: Jean-Marc ANDRE (jean-marc.andre@polymtl.ca)
[mono.git] / mcs / class / System.Runtime.Serialization.Formatters.Soap / Test / SoapFormatterTest.cs
1 // project created on 09/05/2003 at 18:07\r
2 using System;\r
3 using System.Collections;\r
4 using System.Runtime.Remoting.Messaging;\r
5 using System.Runtime.Serialization;\r
6 using System.Runtime.Serialization.Formatters.Soap;\r
7 using System.IO;\r
8 using NUnit.Framework;\r
9 \r
10 namespace MonoTests.System.Runtime.Serialization.Formatters.Soap {\r
11         \r
12         internal class NonSerializableObject {\r
13                 \r
14         }\r
15         \r
16         public delegate void TrucDlg(string s);\r
17         \r
18         [Serializable]\r
19         public class MoreComplexObject {\r
20                 public event TrucDlg TrucEvent;\r
21                 private string _string;\r
22                 private Queue _queue = new Queue();\r
23                 public Hashtable _table = new Hashtable();\r
24 \r
25                 public string ObjString {\r
26                         get { return _string; }\r
27                 }\r
28 \r
29                 public MoreComplexObject() {\r
30                         TrucEvent += new TrucDlg(WriteString);\r
31                         _queue.Enqueue(1);\r
32                         _queue.Enqueue(null);\r
33                         _queue.Enqueue("foo");\r
34                         _table["foo"]="barr";\r
35                         _table[1]="foo";\r
36                         _table['c'] = "barr";\r
37                         _table["barr"] = 1234567890;\r
38                 }\r
39 \r
40                 public void OnTrucEvent(string s) {\r
41                         TrucEvent(s);\r
42                 }\r
43 \r
44                 public void WriteString(string s) {\r
45                         _string = s;\r
46                 }\r
47 \r
48                 public override bool Equals(object obj) {\r
49                         MoreComplexObject objReturn = obj as MoreComplexObject;\r
50                         if(objReturn == null) return false;\r
51                         if(objReturn._string != this._string) return false;\r
52                         IEnumerator myEnum = this._table.GetEnumerator();\r
53                         foreach(DictionaryEntry e in objReturn._table) {\r
54                                 myEnum.MoveNext();\r
55                                 DictionaryEntry s = (DictionaryEntry) myEnum.Current;\r
56                                 Assertion.AssertEquals("#_table", s.Key, e.Key);\r
57                                 Assertion.AssertEquals("#_table", s.Value, e.Value);\r
58                                 if(s.Key.ToString() != e.Key.ToString() || s.Value.ToString() != e.Value.ToString()) return false;\r
59                         }\r
60 //                      Assertion.Assert("#_table is null", objReturn._table != null);\r
61 //                      Console.WriteLine("_table[foo]: {0}", objReturn._table["foo"]);\r
62 //                      Assertion.AssertEquals("#_table[\"foo\"]", "barr", objReturn._table["foo"]);\r
63 //                      Console.WriteLine("_table[1]: {0}", objReturn._table[1]);\r
64 //                      Assertion.AssertEquals("#_table[1]", "foo", objReturn._table[1]);\r
65 //                      Console.WriteLine("_table['c']: {0}", objReturn._table['c']);\r
66 //                      Assertion.AssertEquals("#_table['c']", "barr", objReturn._table['c']);\r
67 //                      Console.WriteLine("_table[barr]: {0}", objReturn._table["barr"]);\r
68 //                      Assertion.AssertEquals("#_table[\"barr\"]", 1234567890, objReturn._table["barr"]);\r
69                         return SoapFormatterTest.CheckArray(this._queue.ToArray(), objReturn._queue.ToArray());\r
70                         \r
71                 }\r
72                 \r
73         }\r
74         \r
75         [Serializable]\r
76         internal class MarshalObject: MarshalByRefObject {\r
77                 private string _name;\r
78                 private long _id;\r
79                 \r
80                 public MarshalObject() {\r
81                         \r
82                 }\r
83                 \r
84                 public MarshalObject(string name, long id) {\r
85                         _name = name;\r
86                         _id = id;\r
87                 }\r
88         }\r
89         \r
90         [Serializable]\r
91         internal class SimpleObject {\r
92                 private string _name;\r
93                 private int _id;\r
94                 \r
95                 public SimpleObject(string name, int id) {\r
96                         _name = name;\r
97                         _id = id;\r
98                 }\r
99                 \r
100                 public override bool Equals(object obj) {\r
101                         SimpleObject objCmp = obj as SimpleObject;\r
102                         if(objCmp == null) return false;\r
103                         if(objCmp._name != this._name) return false;\r
104                         if(objCmp._id != this._id) return false;\r
105                         return true;\r
106                 }\r
107         }\r
108         \r
109         [TestFixture]\r
110         public class SoapFormatterTest\r
111         {\r
112                 private SoapFormatterT _soapFormatter;\r
113                 \r
114                 private object Serialize(object objGraph) {\r
115                         MemoryStream stream = new MemoryStream();\r
116                         _soapFormatter.Serialize(stream, objGraph);\r
117                         \r
118                         \r
119                         stream.Position = 0;\r
120                         \r
121                         object objReturn = _soapFormatter.Deserialize(stream);\r
122                         Assertion.Assert(objReturn != null);\r
123                         Assertion.AssertEquals("#Tests "+objGraph.GetType(), objGraph.GetType(), objReturn.GetType());\r
124                         stream = new MemoryStream();\r
125                         _soapFormatter.Serialize(stream, objReturn);\r
126                         stream.Position = 0;\r
127                         StreamReader r = new StreamReader(stream);\r
128                         Console.WriteLine(r.ReadToEnd());\r
129                         \r
130                         return objReturn;\r
131                 }\r
132                 \r
133                 [SetUp]\r
134                 public void GetReady() {\r
135                         _soapFormatter = new SoapFormatterT(new RemotingSurrogateSelector(), new StreamingContext(StreamingContextStates.All));\r
136                 }\r
137                 \r
138                 [TearDown]\r
139                 public void Clean() {\r
140                         \r
141                 }\r
142                 \r
143                 \r
144                 [Test]\r
145                 public void TestValueTypes() {\r
146                         object objReturn;\r
147                         objReturn = Serialize((short)1);\r
148                         Assertion.AssertEquals("#int16", objReturn, 1);\r
149                         objReturn = Serialize(1);\r
150                         Assertion.AssertEquals("#int32", objReturn, 1);\r
151                         objReturn = Serialize((Single)0.1234);\r
152                         Assertion.AssertEquals("#Single", objReturn, 0.1234);\r
153                         objReturn = Serialize((Double)1234567890.0987654321);\r
154                         Assertion.AssertEquals("#iDouble", objReturn, 1234567890.0987654321);\r
155                         objReturn = Serialize(true);\r
156                         Assertion.AssertEquals("#Bool", objReturn, true);\r
157                         objReturn = Serialize((Int64) 1234567890);\r
158                         Assertion.AssertEquals("#Int64", objReturn, 1234567890);\r
159                         objReturn = Serialize('c');\r
160                         Assertion.AssertEquals("#Char", objReturn, 'c');\r
161                 }\r
162                 \r
163                 [Test]\r
164                 public void TestObjects() {\r
165                         object objReturn;\r
166                         objReturn = Serialize("");\r
167                         objReturn = Serialize("hello world!");\r
168                         Assertion.AssertEquals("#string", "hello world!", objReturn);\r
169                         SimpleObject obj = new SimpleObject("simple object", 1);\r
170                         objReturn = Serialize(obj);\r
171                         Assertion.AssertEquals("#SimpleObject", obj, objReturn);\r
172                         objReturn = Serialize(typeof(SimpleObject));\r
173                         Assertion.AssertEquals("#Type", typeof(SimpleObject), (Type)objReturn);\r
174                         objReturn = Serialize(obj.GetType().Assembly);\r
175                         Assertion.AssertEquals("#Assembly", obj.GetType().Assembly, objReturn);\r
176                 }\r
177                 \r
178                 public static bool CheckArray(object objTest, object objReturn) {\r
179                         Array objTestAsArray = objTest as Array;\r
180                         Array objReturnAsArray = objReturn as Array;\r
181                         \r
182                         Assertion.Assert("#Not an Array "+objTest, objReturnAsArray != null);\r
183                         Assertion.AssertEquals("#Different lengths "+objTest, objTestAsArray.Length, objReturnAsArray.Length);\r
184                         \r
185                         IEnumerator iEnum = objReturnAsArray.GetEnumerator();\r
186                         iEnum.Reset();\r
187                         object obj2;\r
188                         foreach(object obj1 in objTestAsArray) {\r
189                                 iEnum.MoveNext();\r
190                                 obj2 = iEnum.Current;\r
191                                 Assertion.AssertEquals("#The content of the 2 arrays is different", obj1, obj2);\r
192                         }\r
193                         \r
194                         return true;\r
195                 }\r
196                 \r
197                 [Test]\r
198                 public void TestArray() {\r
199                         object objReturn;\r
200                         object objTest;\r
201                         objReturn = Serialize(new int[]{});\r
202                         objTest = new int[]{1, 2, 3, 4};\r
203                         objReturn = Serialize(objTest);\r
204                         CheckArray(objTest, objReturn);\r
205                         objReturn = Serialize(new long[]{1, 2, 3, 4});\r
206                         objTest = new object[]{1, null, ":-)", 1234567890};\r
207                         objReturn = Serialize(objTest);\r
208                         objTest = new int[,]{{0, 1}, {2, 3}, {123, 4}};\r
209                         objReturn = Serialize(objTest);\r
210                         CheckArray(objTest, objReturn);\r
211                         object[,,] objArray = new object[3,2,1];\r
212                         objArray[0,0,0] = 1;\r
213                         objArray[2,1,0] = "end";\r
214                         objReturn = Serialize(objArray);\r
215                         CheckArray(objArray, objReturn);\r
216                 }\r
217                 \r
218                 [Test]\r
219                 public void TestMarshalByRefObject() {\r
220                         Serialize(new MarshalObject("thing", 1234567890));\r
221                 }\r
222                 \r
223                 [Test]\r
224                 [ExpectedException(typeof(ArgumentNullException))]\r
225                 public void TestNullObject() {\r
226                         MemoryStream stream = new MemoryStream();\r
227                         _soapFormatter.Serialize(stream, null);\r
228                 }\r
229                 \r
230                 [Test]\r
231                 [ExpectedException(typeof(SerializationException))]\r
232                 public void TestNonSerialisable() {\r
233                         Serialize(new NonSerializableObject());\r
234                 }\r
235 \r
236                 [Test]\r
237                 public void TestMoreComplexObject() {\r
238                         MoreComplexObject objReturn;\r
239                         MoreComplexObject objTest = new MoreComplexObject();\r
240                         objReturn = (MoreComplexObject) Serialize(objTest);\r
241                         Assertion.AssertEquals("#Equals", objTest, objReturn);\r
242                         objReturn.OnTrucEvent("bidule");\r
243                         Assertion.AssertEquals("#dlg", "bidule", objReturn.ObjString);\r
244                 }\r
245         }\r
246 }\r