1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19 //
20 // Copyright (c) 2007 Novell, Inc. (http://www.novell.com)
21 //
22 // Author:
23 //	Carlos Alberto Cortez <calberto.cortez@gmail.com>
24 //
25 
26 using System;
27 using System.Drawing;
28 using System.Windows.Forms;
29 using NUnit.Framework;
30 
31 namespace MonoTests.System.Windows.Forms
32 {
33 	[TestFixture]
34 	public class ColumnHeaderTest : TestHelper
35 	{
36 		[SetUp]
SetUp()37 		protected override void SetUp ()
38 		{
39 			columnReordered = 0;
40 			base.SetUp ();
41 		}
42 
43 		[Test]
DefaultValuesTest()44 		public void DefaultValuesTest ()
45 		{
46 			ColumnHeader col = new ColumnHeader ();
47 
48 			Assert.IsNull (col.ListView, "1");
49 			Assert.AreEqual (-1, col.Index, "2");
50 			Assert.AreEqual ("ColumnHeader", col.Text, "3");
51 			Assert.AreEqual (HorizontalAlignment.Left, col.TextAlign, "4");
52 			Assert.AreEqual (-1, col.DisplayIndex, "5");
53 			Assert.AreEqual (-1, col.ImageIndex, "6");
54 			Assert.AreEqual (String.Empty, col.ImageKey, "7");
55 			Assert.IsNull (col.ImageList, "8");
56 			Assert.AreEqual (String.Empty, col.Name, "9");
57 			Assert.IsNull (col.Tag, "10");
58 		}
59 
60 		[Test]
DisplayIndex_ListView_Created()61 		public void DisplayIndex_ListView_Created ()
62 		{
63 			ColumnHeader colA = new ColumnHeader ();
64 			ColumnHeader colB = new ColumnHeader ();
65 			ColumnHeader colC = new ColumnHeader ();
66 			ColumnHeader colD = new ColumnHeader ();
67 			colA.DisplayIndex = 2;
68 			colD.DisplayIndex = 0;
69 			colB.DisplayIndex = 3;
70 			colC.DisplayIndex = 1;
71 
72 			Form form = new Form ();
73 			form.ShowInTaskbar = false;
74 			ListView lv = new ListView ();
75 			lv.ColumnReordered += new ColumnReorderedEventHandler (ColumnReordered);
76 			lv.View = View.Details;
77 			lv.Columns.Add (colA);
78 			lv.Columns.Add (colB);
79 			lv.Columns.Add (colC);
80 			form.Controls.Add (lv);
81 			form.Show ();
82 
83 			Assert.AreEqual (0, colA.DisplayIndex, "#A1");
84 			Assert.AreEqual (1, colB.DisplayIndex, "#A2");
85 			Assert.AreEqual (2, colC.DisplayIndex, "#A3");
86 			Assert.AreEqual (0, colD.DisplayIndex, "#A4");
87 			Assert.AreEqual (0, columnReordered, "#A5");
88 
89 			colC.DisplayIndex = 0;
90 			Assert.AreEqual (1, colA.DisplayIndex, "#B1");
91 			Assert.AreEqual (2, colB.DisplayIndex, "#B2");
92 			Assert.AreEqual (0, colC.DisplayIndex, "#B3");
93 			Assert.AreEqual (0, colD.DisplayIndex, "#B4");
94 			Assert.AreEqual (0, columnReordered, "#B5");
95 
96 			colC.DisplayIndex = 2;
97 			Assert.AreEqual (0, colA.DisplayIndex, "#C1");
98 			Assert.AreEqual (1, colB.DisplayIndex, "#C2");
99 			Assert.AreEqual (2, colC.DisplayIndex, "#C3");
100 			Assert.AreEqual (0, colD.DisplayIndex, "#C4");
101 			Assert.AreEqual (0, columnReordered, "#C5");
102 
103 			colB.DisplayIndex = 2;
104 			Assert.AreEqual (0, colA.DisplayIndex, "#D1");
105 			Assert.AreEqual (2, colB.DisplayIndex, "#D2");
106 			Assert.AreEqual (1, colC.DisplayIndex, "#D3");
107 			Assert.AreEqual (0, colD.DisplayIndex, "#D4");
108 			Assert.AreEqual (0, columnReordered, "#D5");
109 
110 			colD.DisplayIndex = 1;
111 			lv.Columns.Add (colD);
112 
113 			Assert.AreEqual (0, colA.DisplayIndex, "#E1");
114 			Assert.AreEqual (2, colB.DisplayIndex, "#E2");
115 			Assert.AreEqual (1, colC.DisplayIndex, "#E3");
116 			Assert.AreEqual (3, colD.DisplayIndex, "#E4");
117 			Assert.AreEqual (0, columnReordered, "#E5");
118 
119 			form.Close ();
120 		}
121 
122 		[Test]
DisplayIndex_ListView_Disposed()123 		public void DisplayIndex_ListView_Disposed ()
124 		{
125 			ListView lv = new ListView ();
126 			lv.View = View.Details;
127 			ColumnHeader colA = new ColumnHeader ();
128 			lv.Columns.Add (colA);
129 			ColumnHeader colB = new ColumnHeader ();
130 			lv.Columns.Add (colB);
131 			ColumnHeader colC = new ColumnHeader ();
132 			lv.Columns.Add (colC);
133 			Assert.AreEqual (0, colA.DisplayIndex, "#A1");
134 			Assert.AreEqual (1, colB.DisplayIndex, "#A2");
135 			Assert.AreEqual (2, colC.DisplayIndex, "#A3");
136 			colA.DisplayIndex = 2;
137 			lv.Columns.Remove (colB);
138 			lv.Dispose ();
139 			Assert.AreEqual (1, colA.DisplayIndex, "#B1");
140 			Assert.AreEqual (-1, colB.DisplayIndex, "#B2");
141 			Assert.AreEqual (0, colC.DisplayIndex, "#B3");
142 			colA.DisplayIndex = 255;
143 			Assert.AreEqual (255, colA.DisplayIndex, "#C1");
144 			Assert.AreEqual (-1, colB.DisplayIndex, "#C2");
145 			Assert.AreEqual (0, colC.DisplayIndex, "#C3");
146 		}
147 
148 		[Test]
DisplayIndex_ListView_NotCreated()149 		public void DisplayIndex_ListView_NotCreated ()
150 		{
151 			ColumnHeader colA = new ColumnHeader ();
152 			colA.DisplayIndex = -66;
153 			Assert.AreEqual (-66, colA.DisplayIndex, "#A1");
154 			colA.DisplayIndex = 66;
155 			Assert.AreEqual (66, colA.DisplayIndex, "#A2");
156 
157 			ColumnHeader colB = new ColumnHeader ();
158 			colB.DisplayIndex = 0;
159 			Assert.AreEqual (0, colB.DisplayIndex, "#A3");
160 
161 			ColumnHeader colC = new ColumnHeader ();
162 			colC.DisplayIndex = 1;
163 			Assert.AreEqual (1, colC.DisplayIndex, "#A4");
164 
165 			ListView lv = new ListView ();
166 			lv.ColumnReordered += new ColumnReorderedEventHandler (ColumnReordered);
167 			lv.View = View.Details;
168 			lv.Columns.Add (colA);
169 			lv.Columns.Add (colB);
170 			lv.Columns.Add (colC);
171 
172 			try {
173 				colA.DisplayIndex = -1;
174 				Assert.Fail ("#B1");
175 			} catch (ArgumentOutOfRangeException ex) {
176 				Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
177 				Assert.IsNull (ex.InnerException, "#B3");
178 				Assert.IsNotNull (ex.Message, "#B4");
179 				Assert.IsNotNull (ex.ParamName, "#B5");
180 				Assert.AreEqual ("DisplayIndex", ex.ParamName, "#B6");
181 			}
182 
183 			try {
184 				colA.DisplayIndex = lv.Columns.Count;
185 				Assert.Fail ("#C1");
186 			} catch (ArgumentOutOfRangeException ex) {
187 				Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#C2");
188 				Assert.IsNull (ex.InnerException, "#C3");
189 				Assert.IsNotNull (ex.Message, "#C4");
190 				Assert.IsNotNull (ex.ParamName, "#C5");
191 				Assert.AreEqual ("DisplayIndex", ex.ParamName, "#C6");
192 			}
193 
194 			Assert.AreEqual (0, colA.DisplayIndex, "#D1");
195 			Assert.AreEqual (1, colB.DisplayIndex, "#D2");
196 			Assert.AreEqual (2, colC.DisplayIndex, "#D3");
197 			Assert.AreEqual (0, columnReordered, "#D4");
198 		}
199 
200 		[Test]
ImageIndex_Invalid()201 		public void ImageIndex_Invalid ()
202 		{
203 			ColumnHeader col = new ColumnHeader ();
204 			col.ImageIndex = 2;
205 			try {
206 				col.ImageIndex = -2;
207 				Assert.Fail ("#1");
208 			} catch (ArgumentOutOfRangeException ex) {
209 				Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
210 				Assert.IsNotNull (ex.Message, "#3");
211 				Assert.IsNotNull (ex.ParamName, "#4");
212 				Assert.AreEqual ("ImageIndex", ex.ParamName, "#5");
213 				Assert.IsNull (ex.InnerException, "#6");
214 			}
215 			Assert.AreEqual (2, col.ImageIndex, "#7");
216 		}
217 
218 		[Test]
ImageKey()219 		public void ImageKey ()
220 		{
221 			ColumnHeader col = new ColumnHeader ();
222 			Assert.AreEqual (string.Empty, col.ImageKey, "#1");
223 			col.ImageKey = "test";
224 			Assert.AreEqual ("test", col.ImageKey, "#2");
225 			col.ImageKey = null;
226 			Assert.AreEqual (string.Empty, col.ImageKey, "#3");
227 		}
228 
229 		[Test]
ImageKeyAndImageIndexInteraction()230 		public void ImageKeyAndImageIndexInteraction ()
231 		{
232 			ColumnHeader col = new ColumnHeader ();
233 			col.ImageIndex = 1;
234 			Assert.AreEqual (1, col.ImageIndex, "#A1");
235 			Assert.AreEqual (string.Empty, col.ImageKey, "#A2");
236 			col.ImageKey = "test";
237 			Assert.AreEqual (-1, col.ImageIndex, "#B1");
238 			Assert.AreEqual ("test", col.ImageKey, "#B2");
239 			col.ImageIndex = 2;
240 			Assert.AreEqual (2, col.ImageIndex, "#C1");
241 			Assert.AreEqual (string.Empty, col.ImageKey, "#C2");
242 			col.ImageKey = null;
243 			Assert.AreEqual (-1, col.ImageIndex, "#D1");
244 			Assert.AreEqual (string.Empty, col.ImageKey, "#D2");
245 		}
246 
247 		[Test]
ImageList()248 		public void ImageList ()
249 		{
250 			ColumnHeader col = new ColumnHeader ();
251 			Assert.IsNull (col.ImageList, "#1");
252 
253 			ListView lv = new ListView ();
254 			lv.View = View.Details;
255 			ImageList small = new ImageList ();
256 			lv.SmallImageList = small;
257 			ImageList large = new ImageList ();
258 			lv.LargeImageList = large;
259 			lv.Columns.Add (col);
260 			Assert.IsNotNull (col.ImageList, "#2");
261 			Assert.AreSame (small, col.ImageList, "#3");
262 		}
263 
264 		[Test]
ImageList_ListView_Disposed()265 		public void ImageList_ListView_Disposed ()
266 		{
267 			ListView lv = new ListView ();
268 			lv.View = View.Details;
269 			ImageList small = new ImageList ();
270 			lv.SmallImageList = small;
271 			ImageList large = new ImageList ();
272 			lv.LargeImageList = large;
273 			ColumnHeader col = new ColumnHeader ();
274 			lv.Columns.Add (col);
275 			lv.Dispose ();
276 			Assert.IsNull (col.ImageList);
277 		}
278 
279 		[Test]
Index_ListView_Disposed()280 		public void Index_ListView_Disposed ()
281 		{
282 			ListView lv = new ListView ();
283 			lv.View = View.Details;
284 			ColumnHeader colA = new ColumnHeader ();
285 			lv.Columns.Add (colA);
286 			ColumnHeader colB = new ColumnHeader ();
287 			lv.Columns.Add (colB);
288 			lv.Dispose ();
289 			Assert.AreEqual (-1, colA.Index, "#1");
290 			Assert.AreEqual (-1, colB.Index, "#2");
291 		}
292 
293 		[Test]
Name()294 		public void Name ()
295 		{
296 			ColumnHeader col = new ColumnHeader ();
297 			Assert.AreEqual (string.Empty, col.Name, "#1");
298 			col.Name = "Address";
299 			Assert.AreEqual ("Address", col.Name, "#2");
300 			col.Name = null;
301 			Assert.AreEqual (string.Empty, col.Name, "#3");
302 		}
303 
304 		[Test]
Tag()305 		public void Tag ()
306 		{
307 			ColumnHeader col = new ColumnHeader ();
308 			Assert.IsNull (col.Tag, "#1");
309 			col.Tag = "whatever";
310 			Assert.AreEqual ("whatever", col.Tag, "#2");
311 			col.Tag = null;
312 			Assert.IsNull (col.Tag, "#3");
313 		}
314 
315 		[Test]
Text_ListView_Disposed()316 		public void Text_ListView_Disposed ()
317 		{
318 			ListView lv = new ListView ();
319 			lv.View = View.Details;
320 			ColumnHeader col = new ColumnHeader ();
321 			lv.Columns.Add (col);
322 			lv.Dispose ();
323 			col.Text = "whatever";
324 			Assert.AreEqual ("whatever", col.Text);
325 		}
326 
327 		[Test]
TextAlign_ListView_Disposed()328 		public void TextAlign_ListView_Disposed ()
329 		{
330 			ListView lv = new ListView ();
331 			lv.View = View.Details;
332 			ColumnHeader col = new ColumnHeader ();
333 			lv.Columns.Add (col);
334 			lv.Dispose ();
335 			col.TextAlign = HorizontalAlignment.Right;
336 			Assert.AreEqual (HorizontalAlignment.Right, col.TextAlign);
337 		}
338 
339 		[Test]
ToStringTest()340 		public void ToStringTest ()
341 		{
342 			ListView lv = new ListView ();
343 			lv.SmallImageList = new ImageList ();
344 			ColumnHeader col = new ColumnHeader ();
345 			col.DisplayIndex = 3;
346 			col.ImageIndex = 2;
347 			col.Name = "address_col";
348 			col.Tag = DateTime.Now;
349 			col.Text = "Address";
350 			col.TextAlign = HorizontalAlignment.Right;
351 			col.Width = 30;
352 			lv.Columns.Add (col);
353 			Assert.AreEqual ("ColumnHeader: Text: Address", col.ToString ());
354 		}
355 
356 		[Test]
357 		[Category ("NotWorking")]
WidthDefault()358 		public void WidthDefault ()
359 		{
360 			ColumnHeader col = new ColumnHeader ();
361 			Assert.AreEqual (60, col.Width);
362 		}
363 
364 		[Test]
WidthTest()365 		public void WidthTest ()
366 		{
367 			ColumnHeader col = new ColumnHeader ();
368 			col.Text = "Column text";
369 
370 			ListView lv = new ListView ();
371 			lv.Items.Add ("Item text");
372 			lv.View = View.Details;
373 			lv.Columns.Add (col);
374 			lv.CreateControl ();
375 
376 			col.Width = -1;
377 			Assert.IsTrue (col.Width > 0, "#1");
378 
379 			col.Width = -2;
380 			Assert.IsTrue (col.Width > 0, "#2");
381 
382 			bool eventRaised = false;
383 			lv.ColumnWidthChanged += delegate (object sender, ColumnWidthChangedEventArgs e) {
384 				Assert.AreEqual (e.ColumnIndex, 0, "#3");
385 				eventRaised = true;
386 			};
387 			col.Width = 100;
388 			Assert.IsTrue (eventRaised, "#4");
389 		}
390 
391 		[Test]
Width_ListView_Disposed()392 		public void Width_ListView_Disposed ()
393 		{
394 			ListView lv = new ListView ();
395 			lv.View = View.Details;
396 			ColumnHeader col = new ColumnHeader ();
397 			lv.Columns.Add (col);
398 			lv.Dispose ();
399 			col.Width = 10;
400 			Assert.AreEqual (10, col.Width);
401 		}
402 
403 		// Ensure the last column is using all the free space to the right
404 		[Test]
Width_AutoResize_Expand()405 		public void Width_AutoResize_Expand ()
406 		{
407 			ListView lv = new ListView ();
408 			lv.BeginUpdate ();
409 			lv.View = View.Details;
410 			ColumnHeader col1 = new ColumnHeader ("One");
411 			ColumnHeader col2 = new ColumnHeader ("Two");
412 			lv.Columns.AddRange (new ColumnHeader [] { col1, col2 });
413 			lv.EndUpdate ();
414 
415 			col1.Width = 10;
416 			col2.Width = 10;
417 			Assert.AreEqual (10, col1.Width, "#A1");
418 			Assert.AreEqual (10, col2.Width, "#A2");
419 
420 			// Need to create the handle in order to actually use the auto size feature
421 			lv.CreateControl ();
422 
423 			col2.Width = -2;
424 			Assert.AreEqual (true, col2.Width == lv.ClientRectangle.Width - col1.Width, "#B1");
425 		}
426 
ColumnReordered(object sender, ColumnReorderedEventArgs e)427 		public void ColumnReordered (object sender, ColumnReorderedEventArgs  e)
428 		{
429 			columnReordered++;
430 		}
431 
432 		private int columnReordered;
433 	}
434 }
435