Merge pull request #217 from QuickJack/master
[mono.git] / mcs / class / Managed.Windows.Forms / Test / System.Windows.Forms / DataGridTextBoxTest.cs
1 //
2 // Copyright (c) 2007 Novell, Inc.
3 //
4 //
5
6 using System;
7 using System.Data;
8 using System.Drawing;
9 using System.Windows.Forms;
10
11 using NUnit.Framework;
12
13 namespace MonoTests.System.Windows.Forms
14 {
15
16         [TestFixture]
17         public class DataGridTextBoxTest  : TestHelper {
18                 class DataGridMock : DataGrid {
19                         protected override void ColumnStartedEditing (Rectangle bounds)
20                         {
21                                 // don't do anything here.
22                         }
23
24                         protected override void GridVScrolled (object sender, ScrollEventArgs se)
25                         {
26                                 Console.WriteLine (Environment.StackTrace);
27                         }
28
29                         protected override void WndProc (ref Message m)
30                         {
31                                 Console.WriteLine (Environment.StackTrace);
32                                 base.WndProc (ref m);
33                         }
34                 }
35
36                 class TextBoxPoker : DataGridTextBox {
37                         public bool ProcessKeyPreviewCalled = false;
38                         public bool ProcessKeyPreviewReturnValue;
39
40                         public bool ProcessKeyEventArgsCalled = false;
41                         public bool ProcessKeyEventArgsReturnValue;
42
43                         public TextBoxPoker ()
44                         {
45                                 CreateHandle ();
46                         }
47
48                         public void DoOnKeyPress (KeyPressEventArgs e)
49                         {
50                                 base.OnKeyPress (e);
51                         }
52
53                         public void DoOnMouseWheel (MouseEventArgs e)
54                         {
55                                 base.OnMouseWheel (e);
56                         }
57
58                         public bool DoProcessKeyMessage (ref Message m)
59                         {
60                                 return base.ProcessKeyMessage (ref m);
61                         }
62
63                         public void DoWndProc (ref Message m)
64                         {
65                                 base.WndProc (ref m);
66                         }
67
68                         protected override bool ProcessKeyEventArgs (ref Message msg)
69                         {
70                                 bool rv = base.ProcessKeyEventArgs (ref msg);
71                                 ProcessKeyEventArgsCalled = true;
72                                 ProcessKeyEventArgsReturnValue = rv;
73                                 return base.ProcessKeyEventArgs (ref msg);
74                         }
75
76                         protected override bool ProcessKeyPreview(ref Message msg)
77                         {
78                                 bool rv = base.ProcessKeyPreview (ref msg);
79                                 ProcessKeyPreviewCalled = true;
80                                 ProcessKeyPreviewReturnValue = rv;
81                                 return rv;
82                         }
83                 }
84
85                 [Test]
86                 [Category ("NotWorking")]
87                 public void TestDefaults ()
88                 {
89                         TextBoxPoker tb = new TextBoxPoker ();
90                         Assert.AreEqual (SystemColors.Window, tb.BackColor, "1");
91                         Assert.IsFalse (tb.AcceptsTab, "2");
92                 }
93
94                 [Test]
95                 [ExpectedException (typeof (NullReferenceException))]
96                 public void TestKeyPress_NoGrid ()
97                 {
98                         TextBoxPoker tb = new TextBoxPoker ();
99                         tb.DoOnKeyPress (new KeyPressEventArgs ('a'));
100                 }
101
102                 [Test]
103                 [ExpectedException (typeof (IndexOutOfRangeException))]
104                 public void TestKeyPress_GridButNoColumns ()
105                 {
106                         TextBoxPoker tb = new TextBoxPoker ();
107                         DataGrid dg = new DataGrid ();
108                         tb.SetDataGrid (dg);
109                         tb.DoOnKeyPress (new KeyPressEventArgs ('a'));
110                 }
111
112                 [Test]
113                 public void TestKeyPress ()
114                 {
115                         TextBoxPoker tb = new TextBoxPoker ();
116                         DataGridMock dg = new DataGridMock ();
117
118                         tb.SetDataGrid (dg);
119                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "1");
120
121                         tb.DoOnKeyPress (new KeyPressEventArgs ('a'));
122                         Assert.IsFalse (tb.IsInEditOrNavigateMode, "2");
123                         Assert.AreEqual ("", tb.Text, "3");
124
125                         tb.ReadOnly = true;
126                         tb.IsInEditOrNavigateMode = true;
127                         tb.DoOnKeyPress (new KeyPressEventArgs ('a'));
128                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "4");
129                         Assert.AreEqual ("", tb.Text, "5");
130                 }
131
132                 [Test]
133                 [ExpectedException (typeof (NullReferenceException))]
134                 [Category ("NotWorking")]
135                 public void TestMouseWheel_NoGrid ()
136                 {
137                         TextBoxPoker tb = new TextBoxPoker ();
138
139                         tb.DoOnMouseWheel (new MouseEventArgs (MouseButtons.None, 0, 0, 0, 10));
140                 }
141
142                 bool mouse_wheel_raised;
143                 bool mouse_down_raised;
144
145                 void mouse_wheel_handler (object sender, MouseEventArgs e)
146                 {
147                         mouse_wheel_raised = true;
148                 }
149
150                 void mouse_down_handler (object sender, MouseEventArgs e)
151                 {
152                         mouse_down_raised = true;
153                 }
154
155                 [Test]
156                 [Category ("NotWorking")]
157                 public void TestMouseWheel ()
158                 {
159                         TextBoxPoker tb = new TextBoxPoker ();
160                         DataGridMock dg = new DataGridMock ();
161
162                         tb.MouseWheel += new MouseEventHandler (mouse_wheel_handler);
163
164                         tb.SetDataGrid (dg);
165
166                         mouse_wheel_raised = false;
167                         tb.DoOnMouseWheel (new MouseEventArgs (MouseButtons.None, 0, 0, 0, 10));
168                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "1");
169                         Assert.IsFalse (mouse_wheel_raised, "2");
170
171                         tb.IsInEditOrNavigateMode = false;
172                         tb.DoOnMouseWheel (new MouseEventArgs (MouseButtons.None, 0, 0, 0, 10));
173                         Assert.IsFalse (tb.IsInEditOrNavigateMode, "3");
174                         Assert.IsFalse (mouse_wheel_raised, "4");
175                 }
176
177                 [Test]
178                 [Category ("NotWorking")]
179                 public void TestProcessKeyMessage_WM_CHAR ()
180                 {
181                         TextBoxPoker tb = new TextBoxPoker ();
182                         DataGridMock dg = new DataGridMock ();
183                         Message m;
184
185                         dg.Controls.Add (tb);
186
187                         tb.SetDataGrid (dg);
188
189                         tb.IsInEditOrNavigateMode = true;
190
191                         /* test Enter key behavior */
192                         m = new Message ();
193                         m.Msg = 0x0102 /* WM_CHAR */;
194                         m.WParam = (IntPtr)Keys.Enter;
195
196                         bool rv = tb.DoProcessKeyMessage (ref m);
197                         Assert.AreEqual (0x0102, m.Msg, "1");
198                         Assert.AreEqual (Keys.Enter, (Keys)m.WParam.ToInt32(), "2");
199                         Assert.IsTrue  (rv, "3");
200                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "4");
201                 }
202
203                 [Test]
204                 [Category ("NotWorking")]
205                 public void TestProcessKeyMessage_WM_KEYDOWN ()
206                 {
207                         TextBoxPoker tb = new TextBoxPoker ();
208                         DataGridMock dg = new DataGridMock ();
209                         Message m;
210                         bool rv;
211
212                         dg.Controls.Add (tb);
213                         tb.SetDataGrid (dg);
214
215                         /* test F2 key behavior */
216                         tb.IsInEditOrNavigateMode = false;
217                         tb.Text = "hello world";
218                         tb.SelectionStart = 0;
219                         tb.SelectionLength = 5;
220
221                         m = new Message ();
222                         m.Msg = 0x0100 /* WM_KEYDOWN */;
223                         m.WParam = (IntPtr)Keys.F2;
224
225                         rv = tb.DoProcessKeyMessage (ref m);
226                         Assert.AreEqual (0x0100, m.Msg, "1");
227                         Assert.AreEqual (Keys.F2, (Keys)m.WParam.ToInt32(), "2");
228                         Assert.IsTrue  (rv, "3");
229                         Assert.IsFalse (tb.IsInEditOrNavigateMode, "4");
230
231                         Assert.AreEqual (0, tb.SelectionLength, "5");
232                         Assert.AreEqual (tb.Text.Length, tb.SelectionStart, "6");
233                         Assert.IsFalse (tb.ProcessKeyPreviewCalled, "7");
234                         Assert.IsFalse (tb.ProcessKeyEventArgsCalled, "8");
235                         tb.ProcessKeyPreviewCalled = false;
236                         tb.ProcessKeyEventArgsCalled = false;
237
238                         /* test enter behavior */
239                         tb.IsInEditOrNavigateMode = true;
240                         m = new Message ();
241                         m.Msg = 0x0100 /* WM_KEYDOWN */;
242                         m.WParam = (IntPtr)Keys.Enter;
243
244                         rv = tb.DoProcessKeyMessage (ref m);
245                         Assert.AreEqual (0x0100, m.Msg, "9");
246                         Assert.AreEqual (Keys.Enter, (Keys)m.WParam.ToInt32(), "10");
247                         Assert.IsFalse  (rv, "11");
248                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "12");
249                         Assert.IsTrue (tb.ProcessKeyPreviewCalled, "13");
250                         Assert.IsFalse (tb.ProcessKeyPreviewReturnValue, "14");
251                         Assert.IsFalse (tb.ProcessKeyEventArgsCalled, "15");
252                         tb.ProcessKeyPreviewCalled = false;
253                         tb.ProcessKeyEventArgsCalled = false;
254
255                         /* test left behavior (within the string) */
256                         tb.IsInEditOrNavigateMode = true;
257                         tb.Text = "hello world";
258                         tb.SelectionStart = 5;
259                         tb.SelectionLength = 0;
260
261                         m = new Message ();
262                         m.Msg = 0x0100 /* WM_KEYDOWN */;
263                         m.WParam = (IntPtr)Keys.Left;
264
265                         rv = tb.DoProcessKeyMessage (ref m);
266                         Assert.AreEqual (0x0100, m.Msg, "16");
267                         Assert.AreEqual (Keys.Left, (Keys)m.WParam.ToInt32(), "17");
268                         Assert.IsFalse  (rv, "18");
269                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "19");
270                         Assert.IsFalse (tb.ProcessKeyPreviewCalled, "20");
271                         Assert.IsTrue (tb.ProcessKeyEventArgsCalled, "21");
272                         Assert.IsFalse (tb.ProcessKeyEventArgsReturnValue, "21.5");
273                         tb.ProcessKeyPreviewCalled = false;
274                         tb.ProcessKeyEventArgsCalled = false;
275
276                         /* test left behavior (at the left-most position) */
277                         tb.IsInEditOrNavigateMode = true;
278                         tb.Text = "hello world";
279                         tb.SelectionStart = 0;
280                         tb.SelectionLength = 0;
281
282                         m = new Message ();
283                         m.Msg = 0x0100 /* WM_KEYDOWN */;
284                         m.WParam = (IntPtr)Keys.Left;
285
286                         rv = tb.DoProcessKeyMessage (ref m);
287                         Assert.AreEqual (0x0100, m.Msg, "22");
288                         Assert.AreEqual (Keys.Left, (Keys)m.WParam.ToInt32(), "23");
289                         Assert.IsFalse  (rv, "24");
290                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "25");
291                         Assert.IsTrue (tb.ProcessKeyPreviewCalled, "26");
292                         Assert.IsFalse (tb.ProcessKeyPreviewReturnValue, "26");
293                         Assert.IsFalse (tb.ProcessKeyEventArgsCalled, "27");
294                         tb.ProcessKeyPreviewCalled = false;
295                         tb.ProcessKeyEventArgsCalled = false;
296
297                         /* test right behavior (within the string) */
298                         tb.IsInEditOrNavigateMode = true;
299                         tb.Text = "hello world";
300                         tb.SelectionStart = 5;
301                         tb.SelectionLength = 0;
302
303                         m = new Message ();
304                         m.Msg = 0x0100 /* WM_KEYDOWN */;
305                         m.WParam = (IntPtr)Keys.Right;
306
307                         rv = tb.DoProcessKeyMessage (ref m);
308                         Assert.AreEqual (0x0100, m.Msg, "28");
309                         Assert.AreEqual (Keys.Right, (Keys)m.WParam.ToInt32(), "29");
310                         Assert.IsFalse  (rv, "30");
311                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "31");
312                         Assert.IsFalse (tb.ProcessKeyPreviewCalled, "32");
313                         Assert.IsTrue (tb.ProcessKeyEventArgsCalled, "33");
314                         Assert.IsFalse (tb.ProcessKeyEventArgsReturnValue, "33.5");
315                         tb.ProcessKeyPreviewCalled = false;
316                         tb.ProcessKeyEventArgsCalled = false;
317
318                         /* test right behavior (at the left-most position) */
319                         tb.IsInEditOrNavigateMode = true;
320                         tb.Text = "hello world";
321                         tb.SelectionStart = tb.Text.Length;
322                         tb.SelectionLength = 0;
323
324                         m = new Message ();
325                         m.Msg = 0x0100 /* WM_KEYDOWN */;
326                         m.WParam = (IntPtr)Keys.Right;
327
328                         rv = tb.DoProcessKeyMessage (ref m);
329                         Assert.AreEqual (0x0100, m.Msg, "34");
330                         Assert.AreEqual (Keys.Right, (Keys)m.WParam.ToInt32(), "35");
331                         Assert.IsFalse  (rv, "36");
332                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "37");
333                         Assert.IsTrue (tb.ProcessKeyPreviewCalled, "38");
334                         Assert.IsFalse (tb.ProcessKeyPreviewReturnValue, "39");
335                         Assert.IsFalse (tb.ProcessKeyEventArgsCalled, "40");
336                         tb.ProcessKeyPreviewCalled = false;
337                         tb.ProcessKeyEventArgsCalled = false;
338
339                         /* test Tab behavior */
340                         tb.IsInEditOrNavigateMode = false;
341                         m = new Message ();
342                         m.Msg = 0x0100 /* WM_KEYDOWN */;
343                         m.WParam = (IntPtr)Keys.Tab;
344
345                         rv = tb.DoProcessKeyMessage (ref m);
346                         Assert.AreEqual (0x0100, m.Msg, "41");
347                         Assert.AreEqual (Keys.Tab, (Keys)m.WParam.ToInt32(), "42");
348                         Assert.IsFalse  (rv, "43");
349                         Assert.IsFalse (tb.IsInEditOrNavigateMode, "44");
350                         Assert.IsFalse (tb.ProcessKeyPreviewCalled, "45");
351                         Assert.IsTrue (tb.ProcessKeyEventArgsCalled, "46");
352                         Assert.IsFalse (tb.ProcessKeyEventArgsReturnValue, "46.5");
353                         tb.ProcessKeyPreviewCalled = false;
354                         tb.ProcessKeyEventArgsCalled = false;
355
356                         /* test Up behavior */
357                         tb.IsInEditOrNavigateMode = false;
358                         m = new Message ();
359                         m.Msg = 0x0100 /* WM_KEYDOWN */;
360                         m.WParam = (IntPtr)Keys.Up;
361
362                         rv = tb.DoProcessKeyMessage (ref m);
363                         Assert.AreEqual (0x0100, m.Msg, "47");
364                         Assert.AreEqual (Keys.Up, (Keys)m.WParam.ToInt32(), "48");
365                         Assert.IsFalse  (rv, "49");
366                         Assert.IsFalse (tb.IsInEditOrNavigateMode, "50");
367                         Assert.IsTrue (tb.ProcessKeyPreviewCalled, "51");
368                         Assert.IsFalse (tb.ProcessKeyPreviewReturnValue, "52");
369                         Assert.IsFalse (tb.ProcessKeyEventArgsCalled, "53");
370                         tb.ProcessKeyPreviewCalled = false;
371                         tb.ProcessKeyEventArgsCalled = false;
372
373                         /* test Down behavior */
374                         tb.IsInEditOrNavigateMode = false;
375                         m = new Message ();
376                         m.Msg = 0x0100 /* WM_KEYDOWN */;
377                         m.WParam = (IntPtr)Keys.Down;
378
379                         rv = tb.DoProcessKeyMessage (ref m);
380                         Assert.AreEqual (0x0100, m.Msg, "54");
381                         Assert.AreEqual (Keys.Down, (Keys)m.WParam.ToInt32(), "55");
382                         Assert.IsFalse  (rv, "56");
383                         Assert.IsFalse (tb.IsInEditOrNavigateMode, "57");
384                         Assert.IsTrue (tb.ProcessKeyPreviewCalled, "58");
385                         Assert.IsFalse (tb.ProcessKeyPreviewReturnValue, "59");
386                         Assert.IsFalse (tb.ProcessKeyEventArgsCalled, "60");
387                         tb.ProcessKeyPreviewCalled = false;
388                         tb.ProcessKeyEventArgsCalled = false;
389                 }
390
391                 [Test]
392                 [Category ("NotWorking")]
393                 public void TestWndProc_WM_LBUTTONDOWN ()
394                 {
395                         TextBoxPoker tb = new TextBoxPoker ();
396                         DataGridMock dg = new DataGridMock ();
397                         Message m;
398
399                         tb.SetDataGrid (dg);
400
401                         tb.MouseDown += new MouseEventHandler (mouse_down_handler);
402
403                         tb.IsInEditOrNavigateMode = true;
404
405                         m = new Message ();
406                         m.Msg = 0x0201 /* WM_LBUTTONDOWN */;
407                         m.LParam=(IntPtr) (10 << 16 | 10);
408
409                         tb.DoWndProc (ref m);
410
411                         Assert.IsTrue (tb.IsInEditOrNavigateMode, "1");
412                         Assert.IsTrue (mouse_down_raised, "2");
413
414                         tb.IsInEditOrNavigateMode = false;
415
416                         m = new Message ();
417                         m.Msg = 0x0201 /* WM_LBUTTONDOWN */;
418                         m.LParam=(IntPtr) (10 << 16 | 10);
419
420                         tb.DoWndProc (ref m);
421
422                         Assert.IsFalse (tb.IsInEditOrNavigateMode, "3");
423                         Assert.IsTrue (mouse_down_raised, "4");
424                 }
425         }
426 }