2007-01-30 Adar Wesley <adarw@mainsofot.com>
[mono.git] / mcs / class / System.Web / Test / System.Web.UI.HtmlControls / HtmlSelectTest.cs
1 //
2 // HtmlSelectTest.cs
3 //      - Unit tests for System.Web.UI.HtmlControls.HtmlSelect
4 //
5 // Author:
6 //      Dick Porter  <dick@ximian.com>
7 //
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 using System;
31 using System.IO;
32 using System.Web.UI;
33 using System.Web.UI.HtmlControls;
34 using System.Web.UI.WebControls;
35 using System.Data;
36 using NUnit.Framework;
37 using MonoTests.stand_alone.WebHarness;
38
39 namespace MonoTests.System.Web.UI.HtmlControls {
40
41         public class TestHtmlSelect : HtmlSelect {
42                 public TestHtmlSelect () 
43                 {
44                 }
45                 
46                 public StateBag GetViewState ()
47                 {
48                         return (ViewState);
49                 }
50                 
51                 public HtmlTextWriter GetWriter ()
52                 {
53                         StringWriter text = new StringWriter ();
54                         HtmlTextWriter writer = new HtmlTextWriter (text);
55                         base.RenderAttributes (writer);
56                         return (writer);
57                 }
58
59                 public int[] GetIndices ()
60                 {
61                         return (SelectedIndices);
62                 }
63
64                 public void Clear ()
65                 {
66                         ClearSelection ();
67                 }
68                 
69                 public void SetIndices (int[] indices)
70                 {
71                         Select (indices);
72                 }
73                 public string Render ()
74                 {
75                         StringWriter sw = new StringWriter ();
76                         sw.NewLine = "\n";
77                         HtmlTextWriter writer = new HtmlTextWriter (sw);
78                         base.Render (writer);
79                         return writer.InnerWriter.ToString ();
80                 }       
81         }
82
83         [TestFixture]
84         public class HtmlSelectTest {
85
86                 [Test]
87                 public void DefaultProperties ()
88                 {
89                         HtmlSelect sel = new HtmlSelect ();
90
91                         Assert.AreEqual (0, sel.Attributes.Count, "Attributes.Count");
92
93                         Assert.AreEqual (String.Empty, sel.DataMember, "DataMember");
94                         Assert.AreEqual (null, sel.DataSource, "DataSource");
95                         Assert.AreEqual (String.Empty, sel.DataTextField, "DataTextField");
96                         Assert.AreEqual (String.Empty, sel.DataValueField, "DataValueField");
97                         Assert.IsTrue (sel.Items.GetType() == typeof (ListItemCollection), "Items");
98                         Assert.AreEqual (false, sel.Multiple, "Multiple");
99                         Assert.AreEqual (0, sel.SelectedIndex, "SelectedIndex");
100                         Assert.AreEqual (-1, sel.Size, "Size");
101                         Assert.AreEqual (String.Empty, sel.Value, "Value");
102
103                         Assert.AreEqual ("select", sel.TagName, "TagName");
104                 }
105
106                 [Test]
107                 [ExpectedException (typeof (NotSupportedException))]
108                 public void InnerHtmlGet ()
109                 {
110                         HtmlSelect sel = new HtmlSelect ();
111                         Assert.IsNotNull (sel.InnerHtml);
112                 }
113                 
114
115                 [Test]
116                 [ExpectedException (typeof (NotSupportedException))]
117                 public void InnerTextGet ()
118                 {
119                         HtmlSelect sel = new HtmlSelect ();
120                         sel.InnerText = null;
121                 }
122
123                 [Test]
124                 [ExpectedException (typeof (NotSupportedException))]
125                 public void InnerHtmlSet ()
126                 {
127                         HtmlSelect sel = new HtmlSelect ();
128                         sel.InnerHtml = null;
129                 }
130
131                 [Test]
132                 [ExpectedException (typeof (NotSupportedException))]
133                 public void InnerTextSet ()
134                 {
135                         HtmlSelect sel = new HtmlSelect ();
136                         Assert.IsNotNull (sel.InnerText);
137                 }
138                 
139
140                 [Test]
141                 public void NullProperties ()
142                 {
143                         TestHtmlSelect sel = new TestHtmlSelect ();
144
145                         sel.DataMember = null;
146                         Assert.AreEqual (String.Empty, sel.DataMember, "DataMember");
147                         sel.DataSource = null;
148                         Assert.AreEqual (null, sel.DataSource, "DataSource");
149                         sel.DataTextField = null;
150                         Assert.AreEqual (String.Empty, sel.DataTextField, "DataTextField");
151                         sel.DataValueField = null;
152                         Assert.AreEqual (String.Empty, sel.DataValueField, "DataValueField");
153                         sel.Multiple = false;
154                         Assert.AreEqual (false, sel.Multiple, "Multiple");
155                         sel.SelectedIndex = -1;
156                         Assert.AreEqual (0, sel.SelectedIndex, "SelectedIndex");
157                         sel.Size = -1;
158                         Assert.AreEqual (-1, sel.Size, "Size");
159                         sel.Value = null;
160                         Assert.AreEqual (String.Empty, sel.Value, "Value");
161
162                         Assert.AreEqual (0, sel.Attributes.Count, "Attributes.Count");
163
164                         StateBag sb = sel.GetViewState ();
165                         Assert.AreEqual (0, sb.Count, "ViewState Count");
166                 }
167
168                 [Test]
169                 public void SourceType ()
170                 {
171                         HtmlSelect sel = new HtmlSelect ();
172                         int[] source = new int[] {1,2,3,4};
173
174                         sel.DataSource = source;
175                 }
176
177                 [Test]
178                 [ExpectedException (typeof (ArgumentException))]
179                 public void BadSourceType ()
180                 {
181                         HtmlSelect sel = new HtmlSelect ();
182                         object source = new object ();
183
184                         sel.DataSource = source;
185                 }
186                 
187                 [Test]
188                 public void ViewStateCount ()
189                 {
190                         TestHtmlSelect sel = new TestHtmlSelect ();
191                         int[] source = new int[] {1,2,3,4,5,6,7,8};
192                         
193                         sel.DataMember = "*1*";
194                         Assert.AreEqual ("*1*", sel.DataMember, "DataMember");
195                         sel.DataSource = source;
196                         Assert.AreEqual (source, sel.DataSource, "DataSource");
197                         sel.DataTextField = "*3*";
198                         Assert.AreEqual ("*3*", sel.DataTextField, "DataTextField");
199                         sel.DataValueField = "*4*";
200                         Assert.AreEqual ("*4*", sel.DataValueField, "DataValueField");
201                         sel.Multiple = true;
202                         Assert.AreEqual (true, sel.Multiple, "Multiple");
203                         sel.SelectedIndex = 6;
204                         /* This doesn't stick */
205                         Assert.AreEqual (-1, sel.SelectedIndex, "SelectedIndex");
206                         sel.Size = 7;
207                         Assert.AreEqual (7, sel.Size, "Size");
208                         sel.Value = "*8*";
209                         /* Neither does this */
210                         Assert.AreEqual (String.Empty, sel.Value, "Value");
211
212                         Assert.AreEqual (5, sel.Attributes.Count, "Attributes.Count");
213                         /*
214                         foreach (string key in sel.Attributes.Keys) {
215                                 Console.WriteLine ("attr key {0} is {1}", key, sel.Attributes[key]);
216                         }
217                         */
218                         
219                         StateBag sb = sel.GetViewState ();
220                         Assert.AreEqual (5, sb.Count, "ViewState Count");
221
222                         /*
223                         foreach (string key in sb.Keys) {
224                                 Console.WriteLine ("vs key {0} is {1}", key, sb[key]);
225                         }
226                         */
227                 }
228
229                 [Test]
230                 public void InternalDetails ()
231                 {
232                         /* Test the undocumented but visible
233                          * properties and methods SelectedIndices,
234                          * ClearSelection () and Select ()
235                          */
236                         TestHtmlSelect sel = new TestHtmlSelect ();
237                         ListItemCollection items;
238
239                         items = sel.Items;
240
241                         ListItem item1 = new ListItem ("text1", "value1");
242                         items.Add (item1);
243
244                         ListItem item2 = new ListItem ("text2", "value2");
245                         item2.Selected = true;
246                         items.Add (item2);
247
248                         ListItem item3 = new ListItem ("text3", "value3");
249                         items.Add (item3);
250
251                         ListItem item4 = new ListItem ("text4", "value4");
252                         item4.Selected = true;
253                         items.Add (item4);
254
255                         ListItem item5 = new ListItem ("text5", "value5");
256                         item5.Selected = true;
257                         items.Add (item5);
258
259                         ListItem item6 = new ListItem ("text6", "value6");
260                         items.Add (item6);
261
262                         int[] indices = sel.GetIndices ();
263
264                         Assert.AreEqual (1, sel.SelectedIndex, "SelectedIndex");
265                         Assert.AreEqual (3, indices.Length, "SelectIndices Length");
266                         Assert.AreEqual (1, indices[0], "SelectIndices 0");
267                         Assert.AreEqual (3, indices[1], "SelectIndices 1");
268                         Assert.AreEqual (4, indices[2], "SelectIndices 2");
269                         Assert.IsFalse (item1.Selected, "Item1");
270                         Assert.IsTrue (item2.Selected, "Item2");
271                         Assert.IsFalse (item3.Selected, "Item3");
272                         Assert.IsTrue (item4.Selected, "Item4");
273                         Assert.IsTrue (item5.Selected, "Item5");
274                         Assert.IsFalse (item6.Selected, "Item6");
275                         
276                         sel.Clear ();
277                         Assert.IsFalse (item1.Selected, "Item1 after clear but before SelectedIndices and SelectedIndex");
278
279                         indices = sel.GetIndices ();
280                         Assert.IsFalse (item1.Selected, "Item1 after clear but between SelectedIndices and SelectedIndex");
281                         Assert.AreEqual (0, sel.SelectedIndex, "SelectedIndex after clear");
282                         Assert.AreEqual (0, indices.Length, "SelectIndices Length after clear");
283
284                         /* NB: !multiple and size <= 1, therefore
285                          * there must be one selected after
286                          * SelectedIndex is called
287                          */
288                         Assert.IsTrue (item1.Selected, "Item1 after clear");
289                         Assert.IsFalse (item2.Selected, "Item2 after clear");
290                         Assert.IsFalse (item3.Selected, "Item3 after clear");
291                         Assert.IsFalse (item4.Selected, "Item4 after clear");
292                         Assert.IsFalse (item5.Selected, "Item5 after clear");
293                         Assert.IsFalse (item6.Selected, "Item6 after clear");
294
295                         int[] new_indices = new int[]{2, 4, 5};
296
297                         sel.SetIndices (new_indices);
298
299                         indices = sel.GetIndices ();
300
301                         Assert.AreEqual (2, sel.SelectedIndex, "SelectedIndex after set");
302                         Assert.AreEqual (3, indices.Length, "SelectIndices Length after set");
303                         Assert.AreEqual (2, indices[0], "SelectIndices 0 after set");
304                         Assert.AreEqual (4, indices[1], "SelectIndices 1 after set");
305                         Assert.AreEqual (5, indices[2], "SelectIndices 2 after set");
306                         Assert.IsFalse (item1.Selected, "Item1 after set");
307                         Assert.IsFalse (item2.Selected, "Item2 after set");
308                         Assert.IsTrue (item3.Selected, "Item3 after set");
309                         Assert.IsFalse (item4.Selected, "Item4 after set");
310                         Assert.IsTrue (item5.Selected, "Item5 after set");
311                         Assert.IsTrue (item6.Selected, "Item6 after set");
312
313                         new_indices = new int[]{2};
314
315                         sel.SetIndices (new_indices);
316
317                         indices = sel.GetIndices ();
318
319                         Assert.AreEqual (2, sel.SelectedIndex, "SelectedIndex after short set");
320                         Assert.AreEqual (1, indices.Length, "SelectIndices Length after short set");
321                         Assert.AreEqual (2, indices[0], "SelectIndices 0 after short set");
322                         Assert.IsFalse (item1.Selected, "Item1 after short set");
323                         Assert.IsFalse (item2.Selected, "Item2 after short set");
324                         Assert.IsTrue (item3.Selected, "Item3 after short set");
325                         Assert.IsFalse (item4.Selected, "Item4 after short set");
326                         Assert.IsFalse (item5.Selected, "Item5 after short set");
327                         Assert.IsFalse (item6.Selected, "Item6 after short set");
328
329                         new_indices = new int[]{-2, -1, 2, 4, 5, 6, 7, 8, 9, 10};
330
331                         sel.SetIndices (new_indices);
332
333                         indices = sel.GetIndices ();
334
335                         Assert.AreEqual (2, sel.SelectedIndex, "SelectedIndex after long set");
336                         Assert.AreEqual (3, indices.Length, "SelectIndices Length after long set");
337                         Assert.AreEqual (2, indices[0], "SelectIndices 0 after long set");
338                         Assert.AreEqual (4, indices[1], "SelectIndices 1 after long set");
339                         Assert.AreEqual (5, indices[2], "SelectIndices 2 after long set");
340                         Assert.IsFalse (item1.Selected, "Item1 after long set");
341                         Assert.IsFalse (item2.Selected, "Item2 after long set");
342                         Assert.IsTrue (item3.Selected, "Item3 after long set");
343                         Assert.IsFalse (item4.Selected, "Item4 after long set");
344                         Assert.IsTrue (item5.Selected, "Item5 after long set");
345                         Assert.IsTrue (item6.Selected, "Item6 after long set");
346                 }
347                 
348                 [Test]
349                 public void Multiple ()
350                 {
351                         HtmlSelect sel = new HtmlSelect ();
352
353                         sel.Multiple = true;
354                         Assert.AreEqual (-1, sel.SelectedIndex, "SelectedIndex");
355                 }
356                 
357                 [Test]
358                 public void Big ()
359                 {
360                         HtmlSelect sel = new HtmlSelect ();
361
362                         sel.Size = 5;
363                         Assert.AreEqual (-1, sel.SelectedIndex, "SelectedIndex");
364                 }
365                 
366                 [Test]
367                 public void OneRowIndividual ()
368                 {
369                         HtmlSelect sel = new HtmlSelect ();
370
371                         Assert.AreEqual (0, sel.SelectedIndex, "SelectedIndex");
372                 }
373                 
374                 [Test]
375                 public void RenderAttributes ()
376                 {
377                         TestHtmlSelect sel = new TestHtmlSelect ();
378                         object source = new object ();
379                         
380                         sel.DataMember = "*1*";
381                         //sel.DataSource = source;
382                         sel.DataTextField = "*3*";
383                         sel.DataValueField = "*4*";
384                         sel.Multiple = true;
385                         sel.Name = "*6*";
386                         sel.SelectedIndex = 7;
387                         sel.Size = 8;
388                         sel.Value = "*9*";
389                         
390                         Assert.AreEqual (5, sel.Attributes.Count, "Attributes.Count");
391
392                         HtmlTextWriter writer = sel.GetWriter ();
393                         Assert.AreEqual (" name multiple=\"multiple\" size=\"8\"", writer.InnerWriter.ToString ());
394                 }
395
396                 DataSet GetExampleData ()
397                 {
398                         DataSet ds = new DataSet ();
399                         ds.ReadXml (new StringReader (@"
400 <DataSet>
401         <Stocks Company='Novell Inc.'     Symbol='NOVL' Price='6.14'   />
402         <Stocks Company='Microsoft Corp.' Symbol='MSFT' Price='25.92'  />
403         <Stocks Company='Google'          Symbol='GOOG' Price='291.60' />
404 </DataSet>
405 "));
406                         return ds;
407                 }
408
409                 [Test]
410                 public void DataBind1 ()
411                 {
412                         TestHtmlSelect s = new TestHtmlSelect ();
413                         s.DataSource = GetExampleData ();
414                         s.DataTextField = "Symbol";
415                         s.DataBind ();
416                         string exp = @"<select name>
417         <option value=""NOVL"">NOVL</option>
418         <option value=""MSFT"">MSFT</option>
419         <option value=""GOOG"">GOOG</option>
420 </select>";
421                         HtmlDiff.AssertAreEqual (exp, s.Render (), "DataBind1");
422                 }
423
424                 DataSet GetExampleDataWithEmpty ()
425                 {
426                         DataSet ds = new DataSet ();
427                         ds.ReadXml (new StringReader (@"
428 <DataSet>
429         <Stocks Company='Novell Inc.'     Symbol='NOVL' Price='6.14'   />
430         <Stocks Company=''                Symbol='MSFT' Price='25.92'  />
431         <Stocks Company='Google'          Symbol='GOOG' Price='291.60' />
432 </DataSet>
433 "));
434                         return ds;
435                 }
436
437                 [Test]
438                 public void DataBind2 ()
439                 {
440                         TestHtmlSelect s = new TestHtmlSelect ();
441                         s.DataSource = GetExampleDataWithEmpty ();
442                         s.DataTextField = "Company";
443                         s.DataValueField = "Symbol";
444                         s.DataBind ();
445                         string exp = @"<select name>
446         <option value=""NOVL"">Novell Inc.</option>
447         <option value=""MSFT""></option>
448         <option value=""GOOG"">Google</option>
449 </select>";
450                         HtmlDiff.AssertAreEqual (exp, s.Render (), "DataBind2");
451                 }
452
453                 [Test]
454                 public void DataBind3 ()
455                 {
456                         TestHtmlSelect s = new TestHtmlSelect ();
457                         s.DataSource = new string [] { "A", "B", "C" };
458                         s.DataBind ();
459                         string exp = @"<select name>
460         <option value=""A"">A</option>
461         <option value=""B"">B</option>
462         <option value=""C"">C</option>
463 </select>";
464                         HtmlDiff.AssertAreEqual (exp, s.Render (), "DataBind3");
465                 }
466
467                 [Test]
468                 public void DataBindDoubleCall ()
469                 {
470                         TestHtmlSelect s = new TestHtmlSelect ();
471                         s.DataSource = new string [] { "A", "B", "C" };
472                         s.DataBind ();
473                         s.DataBind ();
474                         string exp = @"<select name>
475         <option value=""A"">A</option>
476         <option value=""B"">B</option>
477         <option value=""C"">C</option>
478 </select>";
479                         HtmlDiff.AssertAreEqual (exp, s.Render (), "DataBindDoubleCall");
480                 }
481                 
482         }
483 }