<29/05/07 by:yoni yonik@mainsoft.com>
[mono.git] / mcs / class / System.Web / Test / System.Web.UI.WebControls / XmlDataSourceTest.cs
1 //\r
2 // Tests for System.Web.UI.WebControls.XmlDataSource.cs \r
3 //\r
4 // Author:\r
5 //      Chris Toshok (toshok@novell.com)\r
6 //      Yoni Klain   (yonik@mainsoft.com)   \r
7 //\r
8 \r
9 //\r
10 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)\r
11 //\r
12 // Permission is hereby granted, free of charge, to any person obtaining\r
13 // a copy of this software and associated documentation files (the\r
14 // "Software"), to deal in the Software without restriction, including\r
15 // without limitation the rights to use, copy, modify, merge, publish,\r
16 // distribute, sublicense, and/or sell copies of the Software, and to\r
17 // permit persons to whom the Software is furnished to do so, subject to\r
18 // the following conditions:\r
19 // \r
20 // The above copyright notice and this permission notice shall be\r
21 // included in all copies or substantial portions of the Software.\r
22 // \r
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
30 // NOTE: INCLUDE 2 CATEGORIES [Category ("NunitWeb")];[Category ("NotWorking")]\r
31                 \r
32 \r
33 #if NET_2_0\r
34 \r
35 \r
36 using System;\r
37 using System.Collections;\r
38 using System.Collections.Specialized;\r
39 using System.IO;\r
40 using System.Globalization;\r
41 using System.Web;\r
42 using System.Web.UI;\r
43 using System.Web.UI.WebControls;\r
44 using System.Xml;\r
45 using System.Xml.Xsl;\r
46 using NUnit.Framework;\r
47 using MonoTests.SystemWeb.Framework;\r
48 using MonoTests.stand_alone.WebHarness;\r
49 using System.Threading;\r
50 \r
51 namespace MonoTests.System.Web.UI.WebControls\r
52 {\r
53         class DSPoker : XmlDataSource\r
54         {\r
55                 public DSPoker () {\r
56                         TrackViewState ();\r
57                 }\r
58 \r
59                 public object SaveState () {\r
60                         return SaveViewState ();\r
61                 }\r
62                 public void LoadState (object o) {\r
63                         LoadViewState (o);\r
64                 }\r
65 \r
66                 public HierarchicalDataSourceView  DoGetHierarchicalView(string viewPath)\r
67                 {\r
68                          return base.GetHierarchicalView(viewPath);\r
69                 }\r
70 \r
71                 public void DoOnTransforming (EventArgs e)\r
72                 {\r
73                         base.OnTransforming (e);\r
74                 }\r
75 \r
76                 public void DoOnDataSourceChanged ()\r
77                 {\r
78                         base.OnDataSourceChanged (new EventArgs ());\r
79                 }\r
80         }\r
81 \r
82         [TestFixture]\r
83         public class XmlDataSourceTest\r
84         {\r
85                 string data = @"<?xml version=""1.0"" encoding=""utf-8""?><IranHistoricalPlaces name=""places""><Place name=""Taghe Bostan""><City>Kermanshah</City><Antiquity>2000</Antiquity></Place><Place name=""Persepolis""><City>Shiraz</City><Antiquity>2500</Antiquity></Place></IranHistoricalPlaces>";\r
86 \r
87                 [TestFixtureSetUp]\r
88                 public void CopyTestResources ()\r
89                 {\r
90 #if DOT_NET\r
91                         WebTest.CopyResource (GetType (), "MonoTests.System.Web.UI.WebControls.Resources.XMLDataSourceTest.xml", "XMLDataSourceTest.xml");\r
92                         WebTest.CopyResource (GetType (), "MonoTests.System.Web.UI.WebControls.Resources.XMLDataSourceTest.xsl", "XMLDataSourceTest.xsl");\r
93                         WebTest.CopyResource (GetType (), "MonoTests.System.Web.UI.WebControls.Resources.XMLDataSourceTest1.aspx", "XMLDataSourceTest1.aspx");\r
94                         WebTest.CopyResource (GetType (), "MonoTests.System.Web.UI.WebControls.Resources.XMLDataSourceTest2.aspx", "XMLDataSourceTest2.aspx");\r
95                         WebTest.CopyResource (GetType (), "MonoTests.System.Web.UI.WebControls.Resources.XMLDataSourceTest3.aspx", "XMLDataSourceTest3.aspx");\r
96                         WebTest.CopyResource (GetType (), "MonoTests.System.Web.UI.WebControls.Resources.XMLDataSourceTest4.aspx", "XMLDataSourceTest4.aspx");\r
97 #else\r
98                         WebTest.CopyResource (GetType (), "XMLDataSourceTest.xml", "XMLDataSourceTest.xml");\r
99                         WebTest.CopyResource (GetType (), "XMLDataSourceTest.xsl", "XMLDataSourceTest.xsl");\r
100                         WebTest.CopyResource (GetType (), "XMLDataSourceTest1.aspx", "XMLDataSourceTest1.aspx");\r
101                         WebTest.CopyResource (GetType (), "XMLDataSourceTest2.aspx", "XMLDataSourceTest2.aspx");\r
102                         WebTest.CopyResource (GetType (), "XMLDataSourceTest3.aspx", "XMLDataSourceTest3.aspx");\r
103                         WebTest.CopyResource (GetType (), "XMLDataSourceTest4.aspx", "XMLDataSourceTest4.aspx");\r
104 #endif\r
105                 }\r
106 \r
107                 [Test]\r
108                 public void Defaults ()\r
109                 {\r
110                         DSPoker p = new DSPoker ();\r
111 \r
112                         Assert.AreEqual ("", p.Data, "A4");\r
113                         Assert.AreEqual ("", p.DataFile, "A5");\r
114                         Assert.AreEqual ("", p.Transform, "A9");\r
115                         Assert.AreEqual ("", p.TransformFile, "A10");\r
116                         Assert.AreEqual ("", p.XPath, "A11");\r
117                         \r
118                         // Added\r
119                         Assert.AreEqual (null, p.TransformArgumentList, "A17");\r
120                 }\r
121 \r
122                 [Test]\r
123                 public void Defaults_NotWorking ()\r
124                 {\r
125                         DSPoker p = new DSPoker ();\r
126                         Assert.AreEqual (0, p.CacheDuration, "A12");\r
127                         Assert.AreEqual (DataSourceCacheExpiry.Absolute, p.CacheExpirationPolicy, "A13");\r
128                         Assert.AreEqual ("", p.CacheKeyDependency, "A14");\r
129                         Assert.AreEqual (true, p.EnableCaching, "A15");\r
130                 }\r
131 \r
132                 [Test]\r
133                 public void Attributes ()\r
134                 {\r
135                         DSPoker p = new DSPoker ();\r
136 \r
137                         p.Data = data;\r
138                         Assert.AreEqual (data, p.Data, "A1");\r
139 \r
140                         p.Transform = "transform";\r
141                         Assert.AreEqual ("transform", p.Transform, "A2");\r
142 \r
143                         p.XPath = "xpath";\r
144                         Assert.AreEqual ("xpath", p.XPath, "A3");\r
145                 }\r
146 \r
147                 [Test]\r
148                 public void ViewState ()\r
149                 {\r
150                         // XXX weird... something odd going on with\r
151                         // ViewState?  or are none of these stored?\r
152                         DSPoker p = new DSPoker ();\r
153 \r
154                         p.Data = data;\r
155                         p.Transform = "transform";\r
156                         p.XPath = "xpath";\r
157 \r
158                         object state = p.SaveState ();\r
159                         DSPoker copy = new DSPoker ();\r
160                         copy.LoadState (state);\r
161                         Assert.AreEqual ("", copy.Data, "A1");\r
162                         Assert.AreEqual ("", copy.Transform, "A2");\r
163                         Assert.AreEqual ("", copy.XPath, "A3");\r
164 \r
165                         p = new DSPoker ();\r
166                         p.DataFile = "DataFile";\r
167                         p.TransformFile = "TransformFile";\r
168 \r
169                         state = p.SaveState ();\r
170                         copy = new DSPoker ();\r
171 \r
172                         copy.LoadState (state);\r
173                         Assert.AreEqual ("", copy.DataFile, "A1");\r
174                         Assert.AreEqual ("", copy.TransformFile, "A2");\r
175                 }\r
176 \r
177                 #region help_results\r
178                 class eventAssert\r
179                 {\r
180                         private static int _testcounter;\r
181                         private static bool _eventChecker;\r
182                         private eventAssert ()\r
183                         {\r
184                                 _testcounter = 0;\r
185                         }\r
186 \r
187                         public static bool eventChecker\r
188                         {\r
189                                 get\r
190                                 {\r
191                                         throw new NotImplementedException ();\r
192                                 }\r
193                                 set\r
194                                 {\r
195                                         _eventChecker = value;\r
196                                 }\r
197                         }\r
198 \r
199                         static private void testAdded ()\r
200                         {\r
201                                 _testcounter++;\r
202                                 _eventChecker = false;\r
203                         }\r
204 \r
205                         public static void IsTrue (string msg)\r
206                         {\r
207                                 Assert.IsTrue (_eventChecker, msg + "#" + _testcounter);\r
208                                 testAdded ();\r
209 \r
210                         }\r
211 \r
212                         public static void IsFalse (string msg)\r
213                         {\r
214                                 Assert.IsFalse (_eventChecker, msg + "#" + _testcounter);\r
215                                 testAdded ();\r
216                         }\r
217                 }\r
218                 #endregion\r
219 \r
220                 [Test]\r
221                 public void XmlDataSource_DataSourceViewChanged ()\r
222                 {\r
223                         DSPoker p = new DSPoker ();\r
224                         ((IDataSource) p).DataSourceChanged += new EventHandler (XmlDataSourceTest_DataSourceChanged);\r
225                         p.DoOnDataSourceChanged ();\r
226                         eventAssert.IsTrue ("XmlDataSource"); // Assert include counter the first is zero\r
227 \r
228                         p.Data = data;\r
229                         eventAssert.IsTrue ("XmlDataSource");\r
230                         p.Transform = "transform";\r
231                         eventAssert.IsTrue ("XmlDataSource");\r
232                         p.XPath = "xpath";\r
233                         eventAssert.IsTrue ("XmlDataSource");\r
234                         p.DataFile = "DataFile";\r
235                         eventAssert.IsTrue ("XmlDataSource");\r
236                         p.TransformFile = "TransformFile";\r
237                         eventAssert.IsTrue ("XmlDataSource");\r
238                 }\r
239 \r
240                 void XmlDataSourceTest_DataSourceChanged (object sender, EventArgs e)\r
241                 {\r
242                         eventAssert.eventChecker = true;\r
243                         \r
244                 }\r
245 \r
246                 [Test]\r
247                 [Category ("NunitWeb")]\r
248                 public void DataFile ()\r
249                 {\r
250                         new WebTest (PageInvoker.CreateOnLoad (datafile)).Run ();\r
251                 }\r
252 \r
253                 public static void datafile (Page p)\r
254                 {\r
255                         string originalxml = @"<?xml version=""1.0"" encoding=""utf-8""?><bookstore xmlns:bk=""urn:samples""><book genre=""novel"" publicationdate=""1999"" bk:ISBN=""0192100262""><title>Pride and Prejudice</title><author><first-name>Jane</first-name><last-name>Austen</last-name></author><price>24.95</price>""\r
256                         </book><book genre=""novel"" publicationdate=""1985"" bk:ISBN=""0771008139""><title>The Handmaid's Tale</title><author><first-name>Margaret</first-name><last-name>Atwood</last-name></author><price>29.95</price></book></bookstore>";\r
257 \r
258                         XmlDataSource ds = new XmlDataSource ();\r
259                         p.Form.Controls.Add (ds);\r
260                         ds.DataFile = "~/XMLDataSourceTest.xml";\r
261                         ds.DataBind ();\r
262                         string derivedxml = ((XmlDocument) ds.GetXmlDocument ()).InnerXml;\r
263                         HtmlDiff.AssertAreEqual (originalxml, derivedxml, "Loading xml");\r
264                 }\r
265 \r
266                 [Test]\r
267                 public void GetXmlDocument ()\r
268                 {\r
269                         DSPoker p = new DSPoker ();\r
270                         p.Data = data;\r
271                         XmlDocument doc = p.GetXmlDocument ();\r
272                         HtmlDiff.AssertAreEqual (data, doc.InnerXml, "GetXmlDocument");\r
273                 }\r
274 \r
275                 [Test]\r
276                 [Category ("NunitWeb")]\r
277                 public void XPath ()\r
278                 {\r
279                         Page page = new Page ();\r
280                         XmlDataSource ds = new XmlDataSource ();\r
281                         ds.ID = "ds";\r
282                         ds.Data = @"<?xml version=""1.0"" encoding=""utf-8""?>\r
283                                         <bookstore xmlns:bk=""urn:samples"">\r
284                                           <book genre=""novel"" publicationdate=""1999"" bk:ISBN=""0192100262"">\r
285                                             <title>Pride and Prejudice</title>\r
286                                             <author>\r
287                                               <first-name>Jane</first-name>\r
288                                               <last-name>Austen</last-name>\r
289                                             </author>\r
290                                             <price>24.95</price>""\r
291                                           </book>\r
292                                           <book genre=""novel"" publicationdate=""1985"" bk:ISBN=""0771008139"">\r
293                                             <title>The Handmaid's Tale</title>\r
294                                             <author>\r
295                                               <first-name>Margaret</first-name>\r
296                                               <last-name>Atwood</last-name>\r
297                                             </author>\r
298                                             <price>29.95</price>\r
299                                           </book>\r
300                                         </bookstore>";\r
301                         DataList list0 = new DataList ();\r
302                         DataList list1 = new DataList ();\r
303                         DataList list2 = new DataList ();\r
304                         page.Controls.Add (list0);\r
305                         page.Controls.Add (list1);\r
306                         page.Controls.Add (list2);\r
307                         page.Controls.Add (ds);\r
308                         list0.DataSourceID = "ds";\r
309                         list0.DataBind ();\r
310                         Assert.AreEqual (2, list0.Items.Count, "Before XPath elements");\r
311 \r
312                         ds.XPath = "/bookstore/book [title='Pride and Prejudice']";\r
313                         list1.DataSourceID = "ds";\r
314                         list1.DataBind ();\r
315                         Assert.AreEqual (1, list1.Items.Count, "After XPath elements");\r
316 \r
317                         ds.XPath = "bookstore/book [@genre='novel']";\r
318                         list2.DataSourceID = "ds";\r
319                         list2.DataBind ();\r
320                         Assert.AreEqual (2, list2.Items.Count, "After XPath property");\r
321                 }\r
322 \r
323                 [Test]\r
324                 public void GetHierarchicalView ()\r
325                 {\r
326                         Page page = new Page ();\r
327                         DSPoker ds = new DSPoker ();\r
328                         ds.ID = "ds";\r
329                         ds.Data = @"<?xml version=""1.0"" encoding=""utf-8""?>\r
330                                         <bookstore xmlns:bk=""urn:samples"">\r
331                                           <book genre=""novel"" publicationdate=""1999"" bk:ISBN=""0192100262"">\r
332                                             <title>Pride and Prejudice</title>\r
333                                             <author>\r
334                                               <first-name>Jane</first-name>\r
335                                               <last-name>Austen</last-name>\r
336                                             </author>\r
337                                             <price>24.95</price>\r
338                                           </book>\r
339                                           <book genre=""novel"" publicationdate=""1985"" bk:ISBN=""0771008139"">\r
340                                             <title>The Handmaid's Tale</title>\r
341                                             <author>\r
342                                               <first-name>Margaret</first-name>\r
343                                               <last-name>Atwood</last-name>\r
344                                             </author>\r
345                                             <price>29.95</price>\r
346                                           </book>\r
347                                         </bookstore>";\r
348                         HierarchicalDataSourceView view = ds.DoGetHierarchicalView ("");\r
349                         IHierarchicalEnumerable num = view.Select ();\r
350                         foreach (object obj in num) {\r
351                                 IHierarchyData hdata = num.GetHierarchyData (obj);\r
352                                 XmlElement element = (XmlElement) hdata.Item;\r
353                                 Assert.AreEqual ("bookstore", element.Name, "RootElementName");\r
354                                 Assert.AreEqual ("Pride and PrejudiceJaneAusten24.95The Handmaid's TaleMargaretAtwood29.95", element.InnerText, "InnerText");\r
355                                 Assert.AreEqual (2, element.ChildNodes.Count, "ChildElementNodes");\r
356                         }\r
357                 }\r
358 \r
359                 [Test]\r
360                 [Category ("NunitWeb")]\r
361                 public void Transform ()\r
362                 {\r
363                         string origin = @"<div>\r
364                                                 <h2>Order</h2><hr>\r
365                                                 <table>\r
366                                                   <tr>\r
367                                                     <td>Customer</td>\r
368                                                     <td><font color=""blue"">12345</font></td>\r
369                                                     <td>Todd</td>\r
370                                                     <td>Rowe</td>\r
371                                                   </tr>\r
372                                                 </table>\r
373                                                 <hr></div>";\r
374                         string result = new WebTest ("XMLDataSourceTest1.aspx").Run();\r
375                         HtmlDiff.AssertAreEqual (origin, HtmlDiff.GetControlFromPageHtml(result) , "TransformFail");\r
376                 }\r
377 \r
378                 [Test]\r
379                 [Category ("NunitWeb")]\r
380                 public void TransformFile ()\r
381                 {\r
382                         string origin = @"<div><h2>Order</h2>\r
383                                                 <hr>\r
384                                                 <table>\r
385                                                   <tr>\r
386                                                     <td>Customer</td>\r
387                                                     <td><font color=""blue"">12345</font></td>\r
388                                                     <td>Todd</td>\r
389                                                     <td>Rowe</td>\r
390                                                   </tr>\r
391                                                 </table>\r
392                                                 <hr>\r
393                                           </div>";\r
394                         string result = new WebTest ("XMLDataSourceTest2.aspx").Run ();\r
395                         HtmlDiff.AssertAreEqual (origin, HtmlDiff.GetControlFromPageHtml (result), "TransformFileFail");\r
396                 }\r
397 \r
398                 [Test]\r
399                 [Category ("NunitWeb")]\r
400                 public void TransformArgumentList ()\r
401                 {\r
402                         string origin = @"<div>\r
403                                               <h2>Order</h2>\r
404                                                 <hr>\r
405                                                 <table>\r
406                                                   <tr>\r
407                                                     <td>Customer</td>\r
408                                                     <td><font color=""blue"">12345purchased by: Mainsoft developers</font></td>\r
409                                                     <td>Todd</td>\r
410                                                     <td>Rowe</td>\r
411                                                   </tr>\r
412                                                 </table>\r
413                                                 <hr>\r
414                                         </div>";\r
415                         string result = new WebTest ("XMLDataSourceTest3.aspx").Run ();\r
416                         HtmlDiff.AssertAreEqual (origin, HtmlDiff.GetControlFromPageHtml (result), "TransformArgumentListFail");\r
417                 }\r
418 \r
419                 [Test]\r
420                 [Category ("NunitWeb")]\r
421 #if TARGET_JVM\r
422                 [Category ("NotWorking")] // File watcher is not supported\r
423 #endif\r
424                 public void Save ()\r
425                 {\r
426                         string origin = @"<div>\r
427                                                 <h2>BookStore</h2><hr>\r
428                                                 <table>\r
429                                                   <tr>\r
430                                                     <td>Book</td>\r
431                                                     <td><font color=""blue"">ThisIsATest</font></td>\r
432                                                     <td></td>\r
433                                                     <td></td>\r
434                                                     <td>24.95</td>\r
435                                                   </tr>\r
436                                                 </table><hr>\r
437                                                 <h2>BookStore</h2><hr>\r
438                                                 <table>\r
439                                                   <tr>\r
440                                                     <td>Book</td>\r
441                                                     <td><font color=""blue"">The Handmaid's Tale</font></td>\r
442                                                     <td></td>\r
443                                                     <td></td>\r
444                                                     <td>29.95</td>\r
445                                                   </tr>\r
446                                                 </table><hr></div>";\r
447                         string result = new WebTest ("XMLDataSourceTest4.aspx").Run ();\r
448                         HtmlDiff.AssertAreEqual (origin, HtmlDiff.GetControlFromPageHtml (result), "TransformArgumentListFail");\r
449                 }\r
450 \r
451                 //events test\r
452                 bool checker;\r
453 \r
454                 [Test]\r
455                 public void Events ()\r
456                 {\r
457                         DSPoker p = new DSPoker ();\r
458                         p.Transforming += new EventHandler (p_Transforming);\r
459                         Assert.AreEqual (false, checker, "BeforeTransformingEvent");\r
460                         p.DoOnTransforming (new EventArgs ());\r
461                         Assert.AreEqual (true, checker, "AfterTransformingEvent");\r
462                 }\r
463 \r
464                 void p_Transforming (object sender, EventArgs e)\r
465                 {\r
466                         checker = true;\r
467                 }\r
468 \r
469                 //TODO: This is implementation specific test - remove it.\r
470                 [Test]\r
471                 [Category ("NotWorking")]\r
472                 [ExpectedException (typeof (NullReferenceException))]\r
473                 public void GetXmlDocumentException ()\r
474                 {\r
475                         DSPoker p = new DSPoker ();\r
476                         p.GetXmlDocument ();\r
477                 }\r
478 \r
479                 [TestFixtureTearDown]\r
480                 public void TearDown ()\r
481                 {\r
482                         WebTest.Unload ();\r
483                 }\r
484         }       \r
485 }\r
486 \r
487 #endif\r