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) 2005 Novell, Inc. (http://www.novell.com) 21 // 22 // Author: 23 // Jordi Mas i Hernandez <jordi@ximian.com> 24 // 25 // 26 27 using System; 28 using System.Collections; 29 using System.ComponentModel; 30 using System.Data; 31 using System.Drawing; 32 using System.Globalization; 33 using System.Threading; 34 using System.Windows.Forms; 35 using System.Xml; 36 using NUnit.Framework; 37 38 // resolve the ambiguity between System.ComponentModel and NUnit.Framework 39 using CategoryAttribute = NUnit.Framework.CategoryAttribute; 40 41 namespace MonoTests.System.Windows.Forms 42 { 43 [TestFixture] 44 public class DataGridTextBoxColumnTest : TestHelper 45 { 46 private bool eventhandled; 47 //private object Element; 48 //private CollectionChangeAction Action; 49 50 [Test] TestDefaultValues()51 public void TestDefaultValues () 52 { 53 DataGridTextBoxColumn col = new DataGridTextBoxColumn (); 54 55 Assert.AreEqual (HorizontalAlignment.Left, col.Alignment, "HorizontalAlignment property"); 56 Assert.AreEqual ("", col.HeaderText, "HeaderText property"); 57 Assert.AreEqual ("", col.MappingName, "MappingName property"); 58 Assert.AreEqual ("(null)", col.NullText, "NullText property"); 59 Assert.AreEqual (false, col.ReadOnly, "ReadOnly property"); 60 Assert.AreEqual (-1, col.Width, "Width property"); 61 Assert.AreEqual ("", col.Format, "Format property"); 62 Assert.AreEqual (null, col.FormatInfo, "FormatInfo property"); 63 } 64 65 [Test] TestMappingNameChangedEvent()66 public void TestMappingNameChangedEvent () 67 { 68 DataGridTextBoxColumn col = new DataGridTextBoxColumn (); 69 eventhandled = false; 70 col.MappingNameChanged += new EventHandler (OnEventHandler); 71 col.MappingName = "name1"; 72 Assert.AreEqual (true, eventhandled, "A1"); 73 } 74 75 [Test] TestAlignmentChangedEvent()76 public void TestAlignmentChangedEvent () 77 { 78 DataGridTextBoxColumn col = new DataGridTextBoxColumn (); 79 eventhandled = false; 80 col.AlignmentChanged += new EventHandler (OnEventHandler); 81 col.Alignment = HorizontalAlignment.Center; 82 Assert.AreEqual (true, eventhandled, "A1"); 83 } 84 85 [Test] TestHeaderTextChangedEvent()86 public void TestHeaderTextChangedEvent () 87 { 88 DataGridTextBoxColumn col = new DataGridTextBoxColumn (); 89 eventhandled = false; 90 col.HeaderTextChanged += new EventHandler (OnEventHandler); 91 col.HeaderText = "Header"; 92 Assert.AreEqual (true, eventhandled, "A1"); 93 } 94 95 [Test] TestNullTextChangedEvent()96 public void TestNullTextChangedEvent () 97 { 98 DataGridTextBoxColumn col = new DataGridTextBoxColumn (); 99 eventhandled = false; 100 col.NullTextChanged += new EventHandler (OnEventHandler); 101 col.NullText = "Null"; 102 Assert.AreEqual (true, eventhandled, "A1"); 103 } 104 OnEventHandler(object sender, EventArgs e)105 private void OnEventHandler (object sender, EventArgs e) 106 { 107 eventhandled = true; 108 } 109 110 DataTable table; 111 DataView view; 112 DataGridTableStyle tableStyle; 113 ColumnPoker nameColumnStyle; 114 ColumnPoker companyColumnStyle; 115 MakeTable(bool readonly_name)116 public void MakeTable (bool readonly_name) 117 { 118 table = new DataTable (); 119 view = table.DefaultView; 120 table.Columns.Add (new DataColumn ("who")); 121 table.Columns.Add (new DataColumn ("where")); 122 DataRow row = table.NewRow (); 123 row ["who"] = "Miguel"; 124 row ["where"] = null; 125 table.Rows.Add (row); 126 127 row = table.NewRow (); 128 row ["who"] = "Toshok"; 129 row ["where"] = "Novell"; 130 table.Rows.Add (row); 131 132 tableStyle = new DataGridTableStyle (); 133 nameColumnStyle = new ColumnPoker (); 134 nameColumnStyle.MappingName = "who"; 135 nameColumnStyle.ReadOnly = readonly_name; 136 tableStyle.GridColumnStyles.Add (nameColumnStyle); 137 companyColumnStyle = new ColumnPoker (); 138 companyColumnStyle.HeaderText = "Company"; 139 companyColumnStyle.MappingName = "where"; 140 companyColumnStyle.NullText = "(not set)"; 141 tableStyle.GridColumnStyles.Add (companyColumnStyle); 142 } 143 144 class ColumnPoker : DataGridTextBoxColumn 145 { ColumnPoker()146 public ColumnPoker () 147 { 148 } 149 ColumnPoker(PropertyDescriptor prop)150 public ColumnPoker (PropertyDescriptor prop) : base (prop) 151 { 152 } 153 DoAbort(int rowNum)154 public void DoAbort (int rowNum) 155 { 156 base.Abort (rowNum); 157 } 158 DoCommit(CurrencyManager dataSource, int rowNum)159 public bool DoCommit (CurrencyManager dataSource, int rowNum) 160 { 161 return base.Commit (dataSource, rowNum); 162 } 163 DoConcedeFocus()164 public void DoConcedeFocus () 165 { 166 base.ConcedeFocus (); 167 } 168 DoEdit(CurrencyManager source, int rowNum, Rectangle bounds, bool _ro, string instantText, bool cellIsVisible)169 public void DoEdit (CurrencyManager source, int rowNum, Rectangle bounds, bool _ro, string instantText, bool cellIsVisible) 170 { 171 base.Edit (source, rowNum, bounds, _ro, instantText, cellIsVisible); 172 } 173 DoEndEdit()174 public void DoEndEdit () 175 { 176 base.EndEdit (); 177 } 178 DoEnterNullValue()179 public void DoEnterNullValue () 180 { 181 base.EnterNullValue (); 182 } 183 DoHideEditBox()184 public void DoHideEditBox () 185 { 186 base.HideEditBox (); 187 } 188 DoReleaseHostedControl()189 public void DoReleaseHostedControl () 190 { 191 base.ReleaseHostedControl (); 192 } 193 DoSetDataGridInColumn(DataGrid value)194 public void DoSetDataGridInColumn (DataGrid value) 195 { 196 base.SetDataGridInColumn (value); 197 } 198 DoUpdateUI(CurrencyManager source, int rowNum, string instantText)199 public void DoUpdateUI (CurrencyManager source, int rowNum, string instantText) 200 { 201 base.UpdateUI (source, rowNum, instantText); 202 } 203 } 204 205 [Test] TestDoEdit()206 public void TestDoEdit () 207 { 208 MakeTable (true); 209 210 BindingContext bc = new BindingContext (); 211 DataGrid dg = new DataGrid (); 212 dg.BindingContext = bc; 213 dg.TableStyles.Add (tableStyle); 214 dg.DataSource = table; 215 216 CurrencyManager cm = (CurrencyManager)bc[view]; 217 ColumnPoker column = nameColumnStyle; 218 TextBox tb = nameColumnStyle.TextBox; 219 220 Assert.IsNotNull (tb, "1"); 221 Assert.AreEqual (typeof (DataGridTextBox), tb.GetType(), "2"); 222 Assert.IsTrue (tb.Enabled, "3"); 223 Assert.IsFalse (tb.Visible, "4"); 224 Assert.AreEqual ("", tb.Text, "5"); 225 Assert.IsFalse (tb.ReadOnly, "6"); 226 227 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 228 Assert.IsTrue (tb.ReadOnly, "7"); 229 230 // since it's readonly 231 Assert.AreEqual ("Miguel", tb.Text, "8"); 232 } 233 234 [Test] TestDoEdit_NullInstantTest()235 public void TestDoEdit_NullInstantTest () 236 { 237 MakeTable (false); 238 239 BindingContext bc = new BindingContext (); 240 DataGrid dg = new DataGrid (); 241 dg.BindingContext = bc; 242 dg.TableStyles.Add (tableStyle); 243 dg.DataSource = table; 244 245 CurrencyManager cm = (CurrencyManager)bc[view]; 246 ColumnPoker column = nameColumnStyle; 247 TextBox tb = nameColumnStyle.TextBox; 248 249 Assert.IsNotNull (tb, "1"); 250 Assert.AreEqual (typeof (DataGridTextBox), tb.GetType(), "2"); 251 Assert.IsTrue (tb.Enabled, "3"); 252 Assert.IsFalse (tb.Visible, "4"); 253 Assert.AreEqual ("", tb.Text, "5"); 254 Assert.IsFalse (tb.ReadOnly, "6"); 255 256 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 257 Assert.IsFalse (tb.ReadOnly, "7"); 258 259 // since it's readonly 260 Assert.AreEqual ("Miguel", tb.Text, "8"); 261 } 262 263 [Test] TestEndEdit()264 public void TestEndEdit () 265 { 266 MakeTable (false); 267 268 BindingContext bc = new BindingContext (); 269 DataGrid dg = new DataGrid (); 270 dg.BindingContext = bc; 271 dg.TableStyles.Add (tableStyle); 272 dg.DataSource = table; 273 274 CurrencyManager cm = (CurrencyManager)bc[view]; 275 ColumnPoker column = nameColumnStyle; 276 TextBox tb = column.TextBox; 277 278 Assert.AreEqual ("", tb.Text, "1"); 279 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 280 Assert.AreEqual ("hi there", tb.Text, "2"); 281 282 tb.Text = "yo"; 283 284 column.DoEndEdit (); 285 286 DataRowView v = (DataRowView)cm.Current; 287 288 Assert.AreEqual ("Miguel", v[0], "3"); 289 } 290 291 [Test] TestCommit()292 public void TestCommit () 293 { 294 MakeTable (false); 295 296 BindingContext bc = new BindingContext (); 297 DataGrid dg = new DataGrid (); 298 dg.BindingContext = bc; 299 dg.TableStyles.Add (tableStyle); 300 dg.DataSource = table; 301 302 CurrencyManager cm = (CurrencyManager)bc[view]; 303 ColumnPoker column = nameColumnStyle; 304 DataGridTextBox tb = (DataGridTextBox)column.TextBox; 305 306 Assert.AreEqual ("", tb.Text, "1"); 307 Assert.IsTrue (tb.IsInEditOrNavigateMode, "1.5"); 308 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 309 Assert.AreEqual ("hi there", tb.Text, "2"); 310 Assert.AreEqual (new Rectangle (new Point (2,2), new Size (97,97)), tb.Bounds, "3"); 311 Assert.IsFalse (tb.ReadOnly, "4"); 312 Assert.IsFalse (tb.IsInEditOrNavigateMode, "5"); 313 314 bool rv; 315 rv = column.DoCommit (cm, cm.Position); 316 column.DoEndEdit (); 317 318 Assert.IsTrue (tb.IsInEditOrNavigateMode, "6"); 319 Assert.IsTrue (rv, "7"); 320 DataRowView v = (DataRowView)cm.Current; 321 Assert.AreEqual ("hi there", v[0], "8"); 322 } 323 324 [Test] TestCommit2()325 public void TestCommit2 () 326 { 327 MakeTable (false); 328 329 BindingContext bc = new BindingContext (); 330 DataGrid dg = new DataGrid (); 331 dg.BindingContext = bc; 332 dg.TableStyles.Add (tableStyle); 333 dg.DataSource = table; 334 335 CurrencyManager cm = (CurrencyManager)bc[view]; 336 ColumnPoker column = nameColumnStyle; 337 DataGridTextBox tb = (DataGridTextBox)column.TextBox; 338 339 Assert.AreEqual ("", tb.Text, "1"); 340 Assert.IsTrue (tb.IsInEditOrNavigateMode, "1.5"); 341 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 342 Assert.AreEqual ("hi there", tb.Text, "2"); 343 Assert.AreEqual (new Rectangle (new Point (2,2), new Size (97,97)), tb.Bounds, "3"); 344 Assert.IsFalse (tb.ReadOnly, "4"); 345 Assert.IsFalse (tb.IsInEditOrNavigateMode, "5"); 346 347 tb.Text = "yo"; 348 349 column.DoEndEdit (); 350 351 Assert.IsTrue (tb.IsInEditOrNavigateMode, "5.5"); 352 353 bool rv = column.DoCommit (cm, cm.Position); 354 Assert.IsTrue (rv, "6"); 355 DataRowView v = (DataRowView)cm.Current; 356 Assert.AreEqual ("Miguel", v[0], "7"); 357 358 /* try it again with the DoCommit before the DoEndEdit */ 359 cm.Position = 0; 360 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100,100)), false, "hi there", true); 361 Assert.AreEqual ("hi there", tb.Text, "8"); 362 Assert.AreEqual (new Rectangle (new Point (2,2), new Size (97,97)), tb.Bounds, "9"); 363 Assert.IsFalse (tb.ReadOnly, "10"); 364 Assert.IsFalse (tb.IsInEditOrNavigateMode, "11"); 365 tb.Text = "yo"; 366 367 rv = column.DoCommit (cm, cm.Position); 368 column.DoEndEdit (); 369 Assert.IsTrue (rv, "12"); 370 v = (DataRowView)cm.Current; 371 Assert.AreEqual ("yo", v[0], "13"); 372 } 373 374 [Test] TestAbort()375 public void TestAbort () 376 { 377 MakeTable (false); 378 379 BindingContext bc = new BindingContext (); 380 DataGrid dg = new DataGrid (); 381 dg.BindingContext = bc; 382 dg.TableStyles.Add (tableStyle); 383 dg.DataSource = table; 384 385 CurrencyManager cm = (CurrencyManager)bc[view]; 386 ColumnPoker column = nameColumnStyle; 387 DataGridTextBox tb = (DataGridTextBox)column.TextBox; 388 389 Assert.AreEqual ("", tb.Text, "1"); 390 Assert.IsTrue (tb.IsInEditOrNavigateMode, "1.5"); 391 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 392 Assert.AreEqual ("hi there", tb.Text, "2"); 393 Assert.AreEqual (new Rectangle (new Point (2,2), new Size (97,97)), tb.Bounds, "3"); 394 Assert.IsFalse (tb.ReadOnly, "4"); 395 Assert.IsFalse (tb.IsInEditOrNavigateMode, "5"); 396 397 tb.Text = "yo"; 398 399 column.DoAbort (0); 400 401 Assert.IsTrue (tb.IsInEditOrNavigateMode, "6"); 402 DataRowView v = (DataRowView)cm.Current; 403 Assert.AreEqual ("Miguel", v[0], "7"); 404 } 405 406 [Test] TestAbort_DifferentRow()407 public void TestAbort_DifferentRow () 408 { 409 MakeTable (false); 410 411 BindingContext bc = new BindingContext (); 412 DataGrid dg = new DataGrid (); 413 dg.BindingContext = bc; 414 dg.TableStyles.Add (tableStyle); 415 dg.DataSource = table; 416 417 CurrencyManager cm = (CurrencyManager)bc[view]; 418 ColumnPoker column = nameColumnStyle; 419 DataGridTextBox tb = (DataGridTextBox)column.TextBox; 420 421 Assert.AreEqual ("", tb.Text, "1"); 422 Assert.IsTrue (tb.IsInEditOrNavigateMode, "1.5"); 423 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 424 Assert.AreEqual ("hi there", tb.Text, "2"); 425 Assert.AreEqual (new Rectangle (new Point (2,2), new Size (97,97)), tb.Bounds, "3"); 426 Assert.IsFalse (tb.ReadOnly, "4"); 427 Assert.IsFalse (tb.IsInEditOrNavigateMode, "5"); 428 429 tb.Text = "yo"; 430 431 column.DoAbort (1); 432 433 Assert.IsTrue (tb.IsInEditOrNavigateMode, "6"); 434 DataRowView v = (DataRowView)cm.Current; 435 Assert.AreEqual ("Miguel", v[0], "7"); 436 } 437 438 [Test] 439 [Category ("NotWorking")] TestUpdateUI()440 public void TestUpdateUI () 441 { 442 MakeTable (false); 443 444 BindingContext bc = new BindingContext (); 445 DataGrid dg = new DataGrid (); 446 dg.BindingContext = bc; 447 dg.TableStyles.Add (tableStyle); 448 dg.DataSource = table; 449 450 CurrencyManager cm = (CurrencyManager)bc[view]; 451 ColumnPoker column = nameColumnStyle; 452 DataGridTextBox tb = (DataGridTextBox)column.TextBox; 453 454 Assert.AreEqual ("", tb.Text, "1"); 455 Assert.IsTrue (tb.IsInEditOrNavigateMode, "2"); 456 457 Assert.AreEqual (Point.Empty, tb.Location, "3"); 458 459 column.DoUpdateUI (cm, 0, "hi there"); 460 461 Assert.AreEqual (Point.Empty, tb.Location, "4"); 462 463 Assert.AreEqual ("hi there", tb.Text, "5"); 464 Assert.IsFalse (tb.ReadOnly, "6"); 465 Assert.IsTrue (tb.IsInEditOrNavigateMode, "7"); 466 467 DataRowView v = (DataRowView)cm.Current; 468 Assert.AreEqual ("Miguel", v[0], "8"); 469 } 470 471 [Test] TestReadOnly_InEditCall()472 public void TestReadOnly_InEditCall () 473 { 474 MakeTable (false); 475 476 BindingContext bc = new BindingContext (); 477 DataGrid dg = new DataGrid (); 478 dg.BindingContext = bc; 479 dg.TableStyles.Add (tableStyle); 480 dg.DataSource = table; 481 482 CurrencyManager cm = (CurrencyManager)bc[view]; 483 ColumnPoker column = nameColumnStyle; 484 TextBox tb = nameColumnStyle.TextBox; 485 486 Assert.IsNotNull (tb, "1"); 487 Assert.AreEqual (typeof (DataGridTextBox), tb.GetType(), "2"); 488 Assert.IsTrue (tb.Enabled, "3"); 489 Assert.IsFalse (tb.Visible, "4"); 490 Assert.AreEqual ("", tb.Text, "5"); 491 Assert.IsFalse (tb.ReadOnly, "6"); 492 493 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), true, "hi there", true); 494 495 Assert.IsTrue (tb.ReadOnly, "7"); 496 497 // since it's readonly 498 Assert.AreEqual ("Miguel", tb.Text, "8"); 499 } 500 501 [Test] TestReadOnly_AfterEditCall()502 public void TestReadOnly_AfterEditCall () 503 { 504 MakeTable (false); 505 506 BindingContext bc = new BindingContext (); 507 DataGrid dg = new DataGrid (); 508 dg.BindingContext = bc; 509 dg.TableStyles.Add (tableStyle); 510 dg.DataSource = table; 511 512 CurrencyManager cm = (CurrencyManager)bc[view]; 513 ColumnPoker column = nameColumnStyle; 514 TextBox tb = nameColumnStyle.TextBox; 515 516 Assert.IsNotNull (tb, "1"); 517 Assert.AreEqual (typeof (DataGridTextBox), tb.GetType(), "2"); 518 Assert.IsTrue (tb.Enabled, "3"); 519 Assert.IsFalse (tb.Visible, "4"); 520 Assert.AreEqual ("", tb.Text, "5"); 521 Assert.IsFalse (tb.ReadOnly, "6"); 522 523 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 524 column.ReadOnly = true; 525 526 Assert.IsFalse (tb.ReadOnly, "7"); 527 528 Assert.AreEqual ("hi there", tb.Text, "8"); 529 530 bool rv; 531 532 rv = column.DoCommit (cm, cm.Position); 533 column.DoEndEdit (); 534 Assert.IsTrue (rv, "9"); 535 DataRowView v = (DataRowView)cm.Current; 536 Assert.AreEqual ("hi there", v[0], "10"); 537 } 538 539 [Test] TestReadOnly_DataGrid()540 public void TestReadOnly_DataGrid () 541 { 542 MakeTable (false); 543 544 BindingContext bc = new BindingContext (); 545 DataGrid dg = new DataGrid (); 546 dg.BindingContext = bc; 547 dg.TableStyles.Add (tableStyle); 548 dg.DataSource = table; 549 dg.ReadOnly = true; 550 551 CurrencyManager cm = (CurrencyManager)bc[view]; 552 ColumnPoker column = nameColumnStyle; 553 TextBox tb = nameColumnStyle.TextBox; 554 555 Assert.IsNotNull (tb, "1"); 556 Assert.AreEqual (typeof (DataGridTextBox), tb.GetType(), "2"); 557 Assert.IsTrue (tb.Enabled, "3"); 558 Assert.IsFalse (tb.Visible, "4"); 559 Assert.AreEqual ("", tb.Text, "5"); 560 Assert.IsFalse (tb.ReadOnly, "6"); 561 562 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 563 564 Assert.IsFalse (tb.ReadOnly, "7"); 565 566 Assert.AreEqual ("hi there", tb.Text, "8"); 567 568 bool rv; 569 570 rv = column.DoCommit (cm, cm.Position); 571 column.DoEndEdit (); 572 Assert.IsTrue (rv, "9"); 573 DataRowView v = (DataRowView)cm.Current; 574 Assert.AreEqual ("hi there", v[0], "10"); 575 } 576 577 [Test] TestReadOnly_TableStyle()578 public void TestReadOnly_TableStyle () 579 { 580 MakeTable (false); 581 582 BindingContext bc = new BindingContext (); 583 DataGrid dg = new DataGrid (); 584 dg.BindingContext = bc; 585 dg.TableStyles.Add (tableStyle); 586 dg.DataSource = table; 587 588 tableStyle.ReadOnly = true; 589 590 CurrencyManager cm = (CurrencyManager)bc[view]; 591 ColumnPoker column = nameColumnStyle; 592 TextBox tb = nameColumnStyle.TextBox; 593 594 Assert.IsNotNull (tb, "1"); 595 Assert.AreEqual (typeof (DataGridTextBox), tb.GetType(), "2"); 596 Assert.IsTrue (tb.Enabled, "3"); 597 Assert.IsFalse (tb.Visible, "4"); 598 Assert.AreEqual ("", tb.Text, "5"); 599 Assert.IsFalse (tb.ReadOnly, "6"); 600 601 column.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "hi there", true); 602 603 Assert.IsTrue (tb.ReadOnly, "7"); 604 605 Assert.AreEqual ("Miguel", tb.Text, "8"); 606 } 607 608 [Test] IFormattable()609 public void IFormattable () 610 { 611 CultureInfo originalCulture = CultureInfo.CurrentCulture; 612 613 try { 614 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-GB"); 615 616 table = new DataTable (); 617 view = table.DefaultView; 618 table.Columns.Add (new DataColumn ("Amount", typeof (MockNumeric))); 619 620 DataRow row = table.NewRow (); 621 row ["Amount"] = new MockNumericFormattable (1); 622 table.Rows.Add (row); 623 624 row = table.NewRow (); 625 row ["Amount"] = new MockNumericFormattable (2); 626 table.Rows.Add (row); 627 628 row = table.NewRow (); 629 row ["Amount"] = new MockNumeric (3); 630 table.Rows.Add (row); 631 632 tableStyle = new DataGridTableStyle (); 633 ColumnPoker amountColumnStyle = new ColumnPoker (); 634 amountColumnStyle.MappingName = "Amount"; 635 tableStyle.GridColumnStyles.Add (amountColumnStyle); 636 637 BindingContext bc = new BindingContext (); 638 DataGrid dg = new DataGrid (); 639 dg.BindingContext = bc; 640 dg.TableStyles.Add (tableStyle); 641 dg.DataSource = table; 642 643 CurrencyManager cm = (CurrencyManager) bc [view]; 644 TextBox tb = amountColumnStyle.TextBox; 645 646 Assert.IsNotNull (tb, "#A1"); 647 Assert.AreEqual (string.Empty, tb.Text, "#A2"); 648 649 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 650 Assert.AreEqual ("uno", tb.Text, "#B1"); 651 Assert.AreEqual (new MockNumericFormattable (1), table.Rows [0] ["Amount"], "#B2"); 652 653 amountColumnStyle.DoEdit (cm, 1, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 654 Assert.AreEqual ("dos", tb.Text, "#C1"); 655 Assert.AreEqual (new MockNumericFormattable (2), table.Rows [1] ["Amount"], "#C2"); 656 657 amountColumnStyle.DoEdit (cm, 2, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 658 Assert.AreEqual ("tres", tb.Text, "#D1"); 659 Assert.AreEqual (new MockNumeric (3), table.Rows [2] ["Amount"], "#D2"); 660 661 amountColumnStyle.Format = string.Empty; 662 663 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 664 Assert.AreEqual ("uno", tb.Text, "#E1"); 665 Assert.AreEqual (new MockNumericFormattable (1), table.Rows [0] ["Amount"], "#E2"); 666 667 amountColumnStyle.Format = "currency"; 668 669 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 670 Assert.AreEqual ("#£1.00", tb.Text, "#F1"); 671 Assert.AreEqual (new MockNumericFormattable (1), table.Rows [0] ["Amount"], "#F2"); 672 673 amountColumnStyle.DoEdit (cm, 2, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 674 Assert.AreEqual ("tres", tb.Text, "#G1"); 675 Assert.AreEqual (new MockNumeric (3), table.Rows [2] ["Amount"], "#G2"); 676 677 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "#£5.00", true); 678 Assert.AreEqual ("#£5.00", tb.Text, "#H1"); 679 Assert.AreEqual (new MockNumericFormattable (1), table.Rows [0] ["Amount"], "#H2"); 680 681 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "INVALID", true); 682 Assert.IsFalse (amountColumnStyle.DoCommit (cm, 0), "#I1"); 683 Assert.AreEqual ("INVALID", tb.Text, "#I2"); 684 //Assert.AreEqual ("INVALID", table.Rows [0] ["Amount"], "#I3"); 685 686 amountColumnStyle.FormatInfo = new CultureInfo ("en-US"); 687 688 amountColumnStyle.DoEdit (cm, 1, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 689 Assert.AreEqual ("#$2.00", tb.Text, "#J1"); 690 Assert.AreEqual (new MockNumericFormattable (2), table.Rows [1] ["Amount"], "#J2"); 691 } finally { 692 Thread.CurrentThread.CurrentCulture = originalCulture; 693 } 694 } 695 696 [Test] 697 [Category ("NotWorking")] IFormattable_DateTime()698 public void IFormattable_DateTime () 699 { 700 CultureInfo originalCulture = CultureInfo.CurrentCulture; 701 702 try { 703 Thread.CurrentThread.CurrentCulture = new CultureInfo ("nl-BE"); 704 DateTime today = DateTime.Today; 705 DateTime now = DateTime.Now; 706 707 table = new DataTable (); 708 view = table.DefaultView; 709 table.Columns.Add (new DataColumn ("Date", typeof (DateTime))); 710 711 DataRow row = table.NewRow (); 712 row ["Date"] = today; 713 table.Rows.Add (row); 714 715 row = table.NewRow (); 716 row ["Date"] = now; 717 table.Rows.Add (row); 718 719 tableStyle = new DataGridTableStyle (); 720 ColumnPoker dateColumnStyle = new ColumnPoker (); 721 dateColumnStyle.MappingName = "Date"; 722 tableStyle.GridColumnStyles.Add (dateColumnStyle); 723 724 BindingContext bc = new BindingContext (); 725 DataGrid dg = new DataGrid (); 726 dg.BindingContext = bc; 727 dg.TableStyles.Add (tableStyle); 728 dg.DataSource = table; 729 730 CurrencyManager cm = (CurrencyManager) bc [view]; 731 TextBox tb = dateColumnStyle.TextBox; 732 DateTimeConverter converter = new DateTimeConverter (); 733 734 Assert.IsNotNull (tb, "#A1"); 735 Assert.AreEqual (string.Empty, tb.Text, "#A2"); 736 737 dateColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 738 Assert.AreEqual (converter.ConvertTo (null, CultureInfo.CurrentCulture, 739 today, typeof (string)), tb.Text, "#B1"); 740 Assert.AreEqual (today, table.Rows [0] ["Date"], "#B2"); 741 742 dateColumnStyle.DoEdit (cm, 1, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 743 Assert.AreEqual (converter.ConvertTo (null, CultureInfo.CurrentCulture, 744 now, typeof (string)), tb.Text, "#C1"); 745 Assert.AreEqual (now, table.Rows [1] ["Date"], "#C2"); 746 747 dateColumnStyle.Format = "MM"; 748 749 dateColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 750 Assert.AreEqual (today.ToString ("MM", CultureInfo.CurrentCulture), tb.Text, "#D1"); 751 Assert.AreEqual (today, table.Rows [0] ["Date"], "#D2"); 752 753 dateColumnStyle.DoEdit (cm, 1, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 754 Assert.AreEqual (now.ToString ("MM", CultureInfo.CurrentCulture), tb.Text, "#E1"); 755 Assert.AreEqual (now, table.Rows [1] ["Date"], "#E2"); 756 757 dateColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "INVALID", true); 758 Assert.IsFalse (dateColumnStyle.DoCommit (cm, 0), "#F1"); 759 Assert.AreEqual ("INVALID", tb.Text, "#F2"); 760 Assert.AreEqual (today, table.Rows [0] ["Date"], "#F3"); 761 762 dateColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "12", true); 763 Assert.IsFalse (dateColumnStyle.DoCommit (cm, 0), "#G1"); 764 Assert.AreEqual ("12", tb.Text, "#G2"); 765 Assert.AreEqual (today, table.Rows [0] ["Date"], "#G3"); 766 767 dateColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "07/09/2007", true); 768 Assert.IsTrue (dateColumnStyle.DoCommit (cm, 0), "#H1"); 769 Assert.AreEqual (converter.ConvertTo (null, CultureInfo.CurrentCulture, 770 new DateTime (2007, 9, 7), typeof (string)), tb.Text, "#H2"); 771 Assert.AreEqual (new DateTime (2007, 9, 7), table.Rows [0] ["Date"], "#H3"); 772 773 dateColumnStyle.FormatInfo = CultureInfo.CurrentCulture; 774 775 dateColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "08/06/2005", true); 776 Assert.IsTrue (dateColumnStyle.DoCommit (cm, 0), "#I1"); 777 Assert.AreEqual ("06", tb.Text, "#I2"); 778 Assert.AreEqual (new DateTime (2005, 6, 8), table.Rows [0] ["Date"], "#I3"); 779 } finally { 780 Thread.CurrentThread.CurrentCulture = originalCulture; 781 } 782 } 783 784 [Test] StringConverterTest()785 public void StringConverterTest () 786 { 787 CultureInfo originalCulture = CultureInfo.CurrentCulture; 788 789 try { 790 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-GB"); 791 792 table = new DataTable (); 793 view = table.DefaultView; 794 table.Columns.Add (new DataColumn ("Amount", typeof (MockNumericStringConvertable))); 795 796 DataRow row = table.NewRow (); 797 row ["Amount"] = new MockNumericStringConvertable (1); 798 table.Rows.Add (row); 799 800 row = table.NewRow (); 801 row ["Amount"] = new MockNumericStringConvertable (2); 802 table.Rows.Add (row); 803 804 tableStyle = new DataGridTableStyle (); 805 ColumnPoker amountColumnStyle = new ColumnPoker (); 806 amountColumnStyle.MappingName = "Amount"; 807 tableStyle.GridColumnStyles.Add (amountColumnStyle); 808 809 BindingContext bc = new BindingContext (); 810 DataGrid dg = new DataGrid (); 811 dg.BindingContext = bc; 812 dg.TableStyles.Add (tableStyle); 813 dg.DataSource = table; 814 815 CurrencyManager cm = (CurrencyManager) bc [view]; 816 DataGridTextBox tb = (DataGridTextBox) amountColumnStyle.TextBox; 817 818 Assert.IsNotNull (tb, "#A1"); 819 Assert.AreEqual (string.Empty, tb.Text, "#A2"); 820 Assert.IsTrue (tb.IsInEditOrNavigateMode, "#A3"); 821 822 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 823 Assert.AreEqual ("£1.00", tb.Text, "#B1"); 824 Assert.AreEqual (new MockNumericStringConvertable (1), table.Rows [0] ["Amount"], "#B2"); 825 Assert.IsTrue (tb.IsInEditOrNavigateMode, "#B3"); 826 827 amountColumnStyle.DoEdit (cm, 1, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 828 Assert.AreEqual ("£2.00", tb.Text, "#C1"); 829 Assert.AreEqual (new MockNumericStringConvertable (2), table.Rows [1] ["Amount"], "#C2"); 830 Assert.IsTrue (tb.IsInEditOrNavigateMode, "#C3"); 831 832 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "£3.00", true); 833 Assert.AreEqual ("£3.00", tb.Text, "#D1"); 834 Assert.AreEqual (new MockNumericStringConvertable (1), table.Rows [0] ["Amount"], "#D2"); 835 Assert.IsFalse (tb.IsInEditOrNavigateMode, "#D3"); 836 837 Assert.IsTrue (amountColumnStyle.DoCommit (cm, cm.Position), "#E1"); 838 Assert.AreEqual ("£3.00", tb.Text, "#E2"); 839 Assert.AreEqual (new MockNumericStringConvertable (3), table.Rows [0] ["Amount"], "#E3"); 840 Assert.IsTrue (tb.IsInEditOrNavigateMode, "#E4"); 841 842 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, "INVALID", true); 843 Assert.IsFalse (amountColumnStyle.DoCommit (cm, cm.Position), "#F1"); 844 Assert.AreEqual ("INVALID", tb.Text, "#F2"); 845 Assert.AreEqual (new MockNumericStringConvertable (3), table.Rows [0] ["Amount"], "#F3"); 846 Assert.IsFalse (tb.IsInEditOrNavigateMode, "#F4"); 847 848 amountColumnStyle.Format = "whatever"; 849 amountColumnStyle.FormatInfo = new CultureInfo ("en-US"); 850 851 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0,0), new Size (100, 100)), false, null, true); 852 Assert.AreEqual ("£3.00", tb.Text, "#G1"); 853 Assert.AreEqual (new MockNumericStringConvertable (3), table.Rows [0] ["Amount"], "#G2"); 854 Assert.IsFalse (tb.IsInEditOrNavigateMode, "#G3"); 855 856 tb.Text = "5"; 857 Assert.IsTrue (amountColumnStyle.DoCommit (cm, cm.Position), "#H1"); 858 Assert.AreEqual ("£5.00", tb.Text, "#H2"); 859 Assert.AreEqual (new MockNumericStringConvertable (5), table.Rows [0] ["Amount"], "#H3"); 860 } finally { 861 Thread.CurrentThread.CurrentCulture = originalCulture; 862 } 863 } 864 865 [Test] NonStringConverterTest()866 public void NonStringConverterTest () 867 { 868 CultureInfo originalCulture = CultureInfo.CurrentCulture; 869 870 try { 871 Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-GB"); 872 873 table = new DataTable (); 874 view = table.DefaultView; 875 table.Columns.Add (new DataColumn ("Amount", typeof (MockNumericNonStringConvertable))); 876 877 DataRow row = table.NewRow (); 878 row ["Amount"] = new MockNumericNonStringConvertable (1); 879 table.Rows.Add (row); 880 881 row = table.NewRow (); 882 row ["Amount"] = new MockNumericNonStringConvertable (2); 883 table.Rows.Add (row); 884 885 tableStyle = new DataGridTableStyle (); 886 ColumnPoker amountColumnStyle = new ColumnPoker (); 887 amountColumnStyle.MappingName = "Amount"; 888 tableStyle.GridColumnStyles.Add (amountColumnStyle); 889 890 BindingContext bc = new BindingContext (); 891 DataGrid dg = new DataGrid (); 892 dg.BindingContext = bc; 893 dg.TableStyles.Add (tableStyle); 894 dg.DataSource = table; 895 896 CurrencyManager cm = (CurrencyManager) bc [view]; 897 TextBox tb = amountColumnStyle.TextBox; 898 899 Assert.IsNotNull (tb, "#A1"); 900 Assert.AreEqual (string.Empty, tb.Text, "#A2"); 901 902 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0, 0), new Size (100, 100)), false, null, true); 903 Assert.AreEqual ("uno", tb.Text, "#B1"); 904 Assert.AreEqual (new MockNumericStringConvertable (1), table.Rows [0] ["Amount"], "#B2"); 905 906 amountColumnStyle.DoEdit (cm, 1, new Rectangle (new Point (0, 0), new Size (100, 100)), false, null, true); 907 Assert.AreEqual ("dos", tb.Text, "#C1"); 908 Assert.AreEqual (new MockNumericStringConvertable (2), table.Rows [1] ["Amount"], "#C2"); 909 910 amountColumnStyle.DoEdit (cm, 0, new Rectangle (new Point (0, 0), new Size (100, 100)), false, "£3.00", true); 911 Assert.AreEqual ("£3.00", tb.Text, "#D1"); 912 Assert.AreEqual (new MockNumericStringConvertable (1), table.Rows [0] ["Amount"], "#D2"); 913 914 Assert.IsFalse (amountColumnStyle.DoCommit (cm, cm.Position), "#E1"); 915 Assert.AreEqual ("£3.00", tb.Text, "#E2"); 916 //Assert.AreEqual ("£3.00", table.Rows [0] ["Amount"], "#E3"); 917 } finally { 918 Thread.CurrentThread.CurrentCulture = originalCulture; 919 } 920 } 921 922 class MockNumeric 923 { MockNumeric(int number)924 public MockNumeric (int number) 925 { 926 this.number = number; 927 } 928 929 public int Number { 930 get { return number; } 931 set { number = value; } 932 } 933 Equals(object obj)934 public override bool Equals (object obj) 935 { 936 if (obj == null) 937 return false; 938 939 MockNumeric numeric = obj as MockNumeric; 940 return (numeric != null && numeric.Number == Number); 941 } 942 GetHashCode()943 public override int GetHashCode () 944 { 945 return number.GetHashCode (); 946 } 947 ToString()948 public override string ToString () 949 { 950 switch (Number) { 951 case 1: 952 return "uno"; 953 case 2: 954 return "dos"; 955 case 3: 956 return "tres"; 957 default: 958 return "bad"; 959 } 960 } 961 962 private int number; 963 } 964 965 class MockNumericFormattable : MockNumeric, IFormattable 966 { MockNumericFormattable(int number)967 public MockNumericFormattable (int number) : base (number) 968 { 969 } 970 IFormattable.ToString(string format, IFormatProvider formatProvider)971 string IFormattable.ToString (string format, IFormatProvider formatProvider) 972 { 973 if (format == "currency") { 974 return "#" + Number.ToString ("c", formatProvider); 975 } else { 976 return "#" + Number.ToString (formatProvider); 977 } 978 } 979 } 980 981 [TypeConverter (typeof (MockNumericStringConverter))] 982 class MockNumericStringConvertable : MockNumeric 983 { MockNumericStringConvertable(int number)984 public MockNumericStringConvertable (int number) : base (number) 985 { 986 } 987 } 988 989 [TypeConverter (typeof (MockNumericNonStringConverter))] 990 class MockNumericNonStringConvertable : MockNumeric 991 { MockNumericNonStringConvertable(int number)992 public MockNumericNonStringConvertable (int number) : base (number) 993 { 994 } 995 } 996 997 class MockNumericStringConverter : TypeConverter 998 { CanConvertFrom(ITypeDescriptorContext context, Type sourceType)999 public override bool CanConvertFrom (ITypeDescriptorContext context, Type sourceType) 1000 { 1001 if (sourceType == typeof (string)) 1002 return true; 1003 return false; 1004 } 1005 CanConvertTo(ITypeDescriptorContext context, Type destinationType)1006 public override bool CanConvertTo (ITypeDescriptorContext context, Type destinationType) 1007 { 1008 if (destinationType == typeof (string)) 1009 return true; 1010 return false; 1011 } 1012 ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)1013 public override object ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) 1014 { 1015 if (value == null) 1016 return value; 1017 1018 string val = value as string; 1019 if (val != null) { 1020 int number = int.Parse (val, NumberStyles.Currency, culture); 1021 return new MockNumericStringConvertable (number); 1022 } 1023 1024 return base.ConvertFrom (context, culture, value); 1025 } 1026 ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)1027 public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 1028 { 1029 if (value == null) 1030 return value; 1031 1032 if (destinationType == typeof (string)) { 1033 MockNumeric val = value as MockNumeric; 1034 return val.Number.ToString ("C", culture); 1035 } 1036 1037 return base.ConvertTo (context, culture, value, destinationType); 1038 } 1039 } 1040 1041 class MockNumericNonStringConverter : TypeConverter 1042 { CanConvertFrom(ITypeDescriptorContext context, Type sourceType)1043 public override bool CanConvertFrom (ITypeDescriptorContext context, Type sourceType) 1044 { 1045 return false; 1046 } 1047 CanConvertTo(ITypeDescriptorContext context, Type destinationType)1048 public override bool CanConvertTo (ITypeDescriptorContext context, Type destinationType) 1049 { 1050 return false; 1051 } 1052 ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)1053 public override object ConvertFrom (ITypeDescriptorContext context, CultureInfo culture, object value) 1054 { 1055 throw new NotSupportedException (); 1056 } 1057 ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)1058 public override object ConvertTo (ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 1059 { 1060 throw new NotSupportedException (); 1061 } 1062 } 1063 } 1064 } 1065