MemoryMappedFile support on Windows
[mono.git] / mcs / class / System.Windows.Forms / Test / System.Resources / ResXDataNodeSerialisedGetValueTypeNameTests.cs
1 //
2 // ResXDataNodeSerializedGetValueTypeNameTests.cs
3 // 
4 // Author:
5 //      Gary Barnett (gary.barnett.mono@gmail.com)
6 // 
7 // Copyright (C) Gary Barnett (2012)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
28 using System;
29 using System.IO;
30 using System.Reflection;
31 using System.Resources;
32 using System.Runtime.Serialization;
33 using System.Collections;
34 using NUnit.Framework;
35 using System.ComponentModel.Design;
36 using System.Runtime.Serialization.Formatters.Binary;
37
38 namespace MonoTests.System.Resources {
39         [TestFixture]
40         public class ResXDataNodeSerializedGetValueTypeNameTests : ResourcesTestHelper {
41                 [Test]
42                 public void ITRSUsedWithNodeFromReader ()
43                 {
44                         ResXDataNode originalNode, returnedNode;
45                         originalNode = GetNodeEmdeddedSerializable ();
46                         returnedNode = GetNodeFromResXReader (originalNode);
47
48                         Assert.IsNotNull (returnedNode, "#A1");
49                         string returnedType = returnedNode.GetValueTypeName (new ReturnSerializableSubClassITRS ());
50                         Assert.AreEqual ((typeof (serializableSubClass)).AssemblyQualifiedName, returnedType, "#A2");
51                 }
52
53                 [Test]
54                 public void ITRSOnlyUsedFirstTimeWithNodeFromReader ()
55                 {
56                         // check ITRS supplied to GetValueTypeName method for a node returned from reader are used when 
57                         // retrieving the value first time and returns this same value ignoring any new ITRS passed thereafter
58                         ResXDataNode originalNode, returnedNode;
59                         originalNode = GetNodeEmdeddedSerializable ();
60                         returnedNode = GetNodeFromResXReader (originalNode);
61
62                         Assert.IsNotNull (returnedNode, "#A1");
63                         string defaultType = returnedNode.GetValueTypeName ((ITypeResolutionService) null);
64                         Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, defaultType, "#A2");
65
66                         string newType = returnedNode.GetValueTypeName (new ReturnSerializableSubClassITRS ());
67                         Assert.AreNotEqual ((typeof (serializableSubClass)).AssemblyQualifiedName, newType, "#A3");
68                         Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, newType, "#A4");
69                 }
70                 
71                 [Test]
72                 public void ITRSNotUsedWhenNodeCreatedNew ()
73                 {
74                         ResXDataNode node;
75                         node = GetNodeEmdeddedSerializable ();
76
77                         string returnedType = node.GetValueTypeName (new ReturnSerializableSubClassITRS ());
78                         Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, returnedType, "#A1");
79                 }
80
81                 [Test]
82                 public void ITRSIsIgnoredIfGetValueAlreadyCalledWithAnotherITRS ()
83                 {
84                         // check that first call to GetValue sets the type for GetValueTypeName
85                         ResXDataNode originalNode, returnedNode;
86                         originalNode = GetNodeEmdeddedSerializable ();
87                         returnedNode = GetNodeFromResXReader (originalNode);
88
89                         Assert.IsNotNull (returnedNode, "#A1");
90                         // get value passing no params
91                         object val = returnedNode.GetValue ((ITypeResolutionService) null);
92                         Assert.IsInstanceOfType (typeof (serializable), val, "#A2");
93                         Assert.IsNotInstanceOfType (typeof (serializableSubClass), val, "#A3");
94
95                         //get value type passing different params
96                         string newType = returnedNode.GetValueTypeName (new ReturnSerializableSubClassITRS ());
97                         Assert.AreNotEqual ((typeof (serializableSubClass)).AssemblyQualifiedName, newType, "#A4");
98                         Assert.AreEqual ((typeof (serializable)).AssemblyQualifiedName, newType, "#A5");
99                 }
100
101                 [Test]
102                 public void SoapFormattedObject ()
103                 {
104                         ResXDataNode node = GetNodeFromResXReader (serializedResXSOAP);
105
106                         Assert.IsNotNull (node, "#A1");
107                         // hard coded assembly name value refers to that generated under 2.0 prefix, so use compatible available class
108                         string name = node.GetValueTypeName (new ReturnSerializableSubClassITRS ());
109                         Assert.AreEqual (typeof (serializableSubClass).AssemblyQualifiedName, name, "#A2");
110                 }
111
112                 [Test]
113                 public void DeserializationErrorReturnsObjectType ()
114                 {
115                         ResXDataNode node = GetNodeFromResXReader (serializedResXCorruped);
116                         Assert.IsNotNull (node, "#A1");
117                         string type = node.GetValueTypeName ((AssemblyName []) null);
118
119                         Assert.AreEqual (typeof (object).AssemblyQualifiedName,type, "#A2");
120                 }
121                 
122                 [Test]
123                 public void InvalidMimeTypeFromReaderReturnsNull ()
124                 {
125                         ResXDataNode node = GetNodeFromResXReader (serializedResXInvalidMimeType);
126                         Assert.IsNotNull (node, "#A1");
127                         string type = node.GetValueTypeName ((AssemblyName []) null);
128                         Assert.IsNull (type, "#A2");
129                 }
130
131                 [Test]
132                 public void AssemblyAutomaticallyLoaded ()
133                 {
134                         // DummyAssembly must be in the same directory as current assembly to work correctly
135                         ResXDataNode node = GetNodeFromResXReader (anotherSerializableFromDummyAssembly);
136                         Assert.IsNotNull (node, "#A1");
137                         string type = node.GetValueTypeName ((AssemblyName []) null);
138                         Assert.AreEqual ("DummyAssembly.AnotherSerializable, DummyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", type, "#A2");
139                 }
140
141                 [Test]
142                 public void ReturnsObjectAssemblyMissing ()
143                 {
144                         ResXDataNode node = GetNodeFromResXReader (missingSerializableFromMissingAssembly);
145                         Assert.IsNotNull (node, "#A1");
146                         string type = node.GetValueTypeName ((AssemblyName []) null);
147                         Assert.AreEqual (typeof (object).AssemblyQualifiedName, type, "#A2");
148                 }
149
150                 static string serializedResXInvalidMimeType =
151 @"<?xml version=""1.0"" encoding=""utf-8""?>
152 <root>
153   
154   <resheader name=""resmimetype"">
155         <value>text/microsoft-resx</value>
156   </resheader>
157   <resheader name=""version"">
158         <value>2.0</value>
159   </resheader>
160   <resheader name=""reader"">
161         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
162   </resheader>
163   <resheader name=""writer"">
164         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
165   </resheader>
166   <data name=""test"" mimetype=""application/xxxx"">
167         <value>
168                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
169                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
170                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
171                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
172 </value>
173   </data>
174 </root>";
175
176                 static string serializedResXCorruped =
177 @"<?xml version=""1.0"" encoding=""utf-8""?>
178 <root>
179   
180   <resheader name=""resmimetype"">
181         <value>text/microsoft-resx</value>
182   </resheader>
183   <resheader name=""version"">
184         <value>2.0</value>
185   </resheader>
186   <resheader name=""reader"">
187         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
188   </resheader>
189   <resheader name=""writer"">
190         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
191   </resheader>
192   <data name=""test"" mimetype=""application/x-microsoft.net.object.binary.base64"">
193         <value>
194                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
195                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
196                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
197                 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
198 </value>
199   </data>
200 </root>";
201
202                 static string serializedResXSOAP =
203 @"<?xml version=""1.0"" encoding=""utf-8""?>
204 <root> 
205   <resheader name=""resmimetype"">
206         <value>text/microsoft-resx</value>
207   </resheader>
208   <resheader name=""version"">
209         <value>2.0</value>
210   </resheader>
211   <resheader name=""reader"">
212         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
213   </resheader>
214   <resheader name=""writer"">
215         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
216   </resheader>
217   <data name=""test"" mimetype=""application/x-microsoft.net.object.soap.base64"">
218         <value>
219                 PFNPQVAtRU5WOkVudmVsb3BlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2Ui
220                 IHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOlNPQVAtRU5DPSJodHRwOi8vc2No
221                 ZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29kaW5nLyIgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAu
222                 b3JnL3NvYXAvZW52ZWxvcGUvIiB4bWxuczpjbHI9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vc29hcC9lbmNvZGlu
223                 Zy9jbHIvMS4wIiBTT0FQLUVOVjplbmNvZGluZ1N0eWxlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VuY29k
224                 aW5nLyI+DQo8U09BUC1FTlY6Qm9keT4NCjxhMTpzZXJpYWxpemFibGUgaWQ9InJlZi0xIiB4bWxuczphMT0iaHR0cDovL3Nj
225                 aGVtYXMubWljcm9zb2Z0LmNvbS9jbHIvbnNhc3NlbS9Nb25vVGVzdHMuU3lzdGVtLlJlc291cmNlcy9TeXN0ZW0uV2luZG93
226                 cy5Gb3Jtc190ZXN0X25ldF8yXzAlMkMlMjBWZXJzaW9uJTNEMC4wLjAuMCUyQyUyMEN1bHR1cmUlM0RuZXV0cmFsJTJDJTIw
227                 UHVibGljS2V5VG9rZW4lM0RudWxsIj4NCjxzZXJuYW1lIGlkPSJyZWYtMyI+YW5hbWU8L3Nlcm5hbWU+DQo8c2VydmFsdWUg
228                 aWQ9InJlZi00Ij5hdmFsdWU8L3NlcnZhbHVlPg0KPC9hMTpzZXJpYWxpemFibGU+DQo8L1NPQVAtRU5WOkJvZHk+DQo8L1NP
229                 QVAtRU5WOkVudmVsb3BlPg==
230         </value>
231   </data>
232 </root>";
233
234                 static string missingSerializableFromMissingAssembly =
235 @"<?xml version=""1.0"" encoding=""utf-8""?>
236 <root>
237   <resheader name=""resmimetype"">
238     <value>text/microsoft-resx</value>
239   </resheader>
240   <resheader name=""version"">
241     <value>2.0</value>
242   </resheader>
243   <resheader name=""reader"">
244     <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
245   </resheader>
246   <resheader name=""writer"">
247     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
248   </resheader>
249   <data name=""aname"" mimetype=""application/x-microsoft.net.object.binary.base64"">
250     <value>
251         AAEAAAD/////AQAAAAAAAAAMAgAAAEZNaXNzaW5nQXNzZW1ibHksIFZlcnNpb249MS4wLjAuMCwgQ3Vs
252         dHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAhRHVtbXlBc3NlbWJseS5NaXNzaW5n
253         U2VyaWFsaXphYmxlAgAAAAdzZXJuYW1lCHNlcnZhbHVlAQECAAAABgMAAAAFYW5hbWUGBAAAAAZhdmFs
254         dWUL
255 </value>
256   </data>
257 </root>";
258
259                 static string anotherSerializableFromDummyAssembly =
260 @"<?xml version=""1.0"" encoding=""utf-8""?>
261 <root>
262  
263   <resheader name=""resmimetype"">
264     <value>text/microsoft-resx</value>
265   </resheader>
266   <resheader name=""version"">
267     <value>2.0</value>
268   </resheader>
269   <resheader name=""reader"">
270     <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
271   </resheader>
272   <resheader name=""writer"">
273     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
274   </resheader>
275   <data name=""aname"" mimetype=""application/x-microsoft.net.object.binary.base64"">
276     <value>
277         AAEAAAD/////AQAAAAAAAAAMAgAAAEREdW1teUFzc2VtYmx5LCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1
278         cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAIUR1bW15QXNzZW1ibHkuQW5vdGhlclNl
279         cmlhbGl6YWJsZQIAAAAHc2VybmFtZQhzZXJ2YWx1ZQEBAgAAAAYDAAAABWFuYW1lBgQAAAAGYXZhbHVl
280         Cw==
281 </value>
282   </data>
283 </root>";
284
285                 static string convertableResXWithoutAssemblyName =
286 @"<?xml version=""1.0"" encoding=""utf-8""?>
287 <root>
288   
289   <resheader name=""resmimetype"">
290         <value>text/microsoft-resx</value>
291   </resheader>
292   <resheader name=""version"">
293         <value>2.0</value>
294   </resheader>
295   <resheader name=""reader"">
296         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
297   </resheader>
298   <resheader name=""writer"">
299         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
300   </resheader>
301   
302   <data name=""test"" type=""DummyAssembly.Convertable"">
303         <value>im a name        im a value</value>
304   </data>
305 </root>";
306
307                 static string thisAssemblyConvertableResXWithoutAssemblyName =
308         @"<?xml version=""1.0"" encoding=""utf-8""?>
309 <root>
310   
311   <resheader name=""resmimetype"">
312         <value>text/microsoft-resx</value>
313   </resheader>
314   <resheader name=""version"">
315         <value>2.0</value>
316   </resheader>
317   <resheader name=""reader"">
318         <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
319   </resheader>
320   <resheader name=""writer"">
321         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
322   </resheader>
323   
324   <data name=""test"" type=""MonoTests.System.Resources.ThisAssemblyConvertable"">
325         <value>im a name        im a value</value>
326   </data>
327 </root>";
328
329         }
330         
331 }
332