1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.harmony.beans.tests.java.beans; 19 20 import java.beans.IndexedPropertyChangeEvent; 21 import java.beans.PropertyChangeEvent; 22 import java.beans.PropertyChangeListener; 23 import java.beans.PropertyChangeListenerProxy; 24 import java.beans.PropertyChangeSupport; 25 import java.io.File; 26 import java.io.FileInputStream; 27 import java.io.FileOutputStream; 28 import java.io.IOException; 29 import java.io.ObjectInputStream; 30 import java.io.ObjectOutputStream; 31 import java.io.Serializable; 32 33 import junit.framework.TestCase; 34 35 import org.apache.harmony.beans.tests.support.NonSerializablePropertyChangeListener; 36 import org.apache.harmony.beans.tests.support.SerializablePropertyChangeListener; 37 import org.apache.harmony.testframework.serialization.SerializationTest; 38 import org.apache.harmony.testframework.serialization.SerializationTest.SerializableAssert; 39 40 import tests.util.SerializationTester; 41 42 /** 43 * Test class PropertyChangeSupport. 44 */ 45 public class PropertyChangeSupportTest extends TestCase { 46 47 private File tempFile; 48 49 @Override 50 protected void setUp() throws Exception { 51 tempFile = File.createTempFile("beans", ".ser"); 52 } 53 54 @Override 55 protected void tearDown() throws Exception { 56 tempFile.delete(); 57 tempFile = null; 58 } 59 /* 60 * Test the constructor with a normal parameter. 61 */ 62 public void testConstructor_Normal() { 63 Object src = new Object(); 64 new PropertyChangeSupport(src); 65 } 66 67 /* 68 * Test the method addPropertyChangeListener(PropertyChangeListener) with a 69 * normal listener parameter. 70 */ 71 public void testAddPropertyChangeListener_PropertyChangeListener_Normal() { 72 Object src = new Object(); 73 PropertyChangeSupport sup = new PropertyChangeSupport(src); 74 PropertyChangeListener l1 = new MockPropertyChangeListener(); 75 PropertyChangeListener l2 = new MockPropertyChangeListener(); 76 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 77 l2); 78 PropertyChangeListener l4 = new PropertyChangeListenerProxy("myProp", 79 l3); 80 81 sup.addPropertyChangeListener(l1); 82 83 assertEquals(1, sup.getPropertyChangeListeners().length); 84 assertSame(l1, sup.getPropertyChangeListeners()[0]); 85 86 sup.removePropertyChangeListener(l1); 87 sup.addPropertyChangeListener(l3); 88 assertEquals(1, sup.getPropertyChangeListeners().length); 89 assertSame(l2, ((PropertyChangeListenerProxy) sup 90 .getPropertyChangeListeners()[0]).getListener()); 91 assertNotSame(l3, sup.getPropertyChangeListeners()[0]); 92 93 sup.removePropertyChangeListener(sup.getPropertyChangeListeners()[0]); 94 assertEquals(0, sup.getPropertyChangeListeners().length); 95 sup.addPropertyChangeListener(l4); 96 //RI asserts to true here, really strange behavior 97 assertNotSame(l3, ((PropertyChangeListenerProxy) sup 98 .getPropertyChangeListeners()[0]).getListener()); 99 assertNotSame(l4, sup.getPropertyChangeListeners()[0]); 100 assertSame( 101 l2, 102 ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) sup 103 .getPropertyChangeListeners()[0]).getListener()) 104 .getListener()); 105 } 106 107 /* 108 * Test the method addPropertyChangeListener(PropertyChangeListener) with a 109 * null listener parameter. 110 */ 111 public void testAddPropertyChangeListener_PropertyChangeListener_Null() { 112 Object src = new Object(); 113 PropertyChangeSupport sup = new PropertyChangeSupport(src); 114 115 sup.addPropertyChangeListener(null); 116 PropertyChangeListener[] listeners = sup.getPropertyChangeListeners(); 117 assertEquals(0, listeners.length); 118 } 119 120 /* 121 * Test the method addPropertyChangeListener(PropertyChangeListener) with a 122 * listener parameter that has already been registered. 123 */ 124 public void testAddPropertyChangeListener_PropertyChangeListener_Duplicate() { 125 Object src = new Object(); 126 PropertyChangeSupport sup = new PropertyChangeSupport(src); 127 PropertyChangeListener l1 = new MockPropertyChangeListener(); 128 129 sup.addPropertyChangeListener(l1); 130 sup.addPropertyChangeListener(l1); 131 132 PropertyChangeListener[] listeners = sup.getPropertyChangeListeners(); 133 assertEquals(2, listeners.length); 134 assertSame(l1, listeners[0]); 135 assertSame(l1, listeners[1]); 136 } 137 138 /* 139 * Test the method addPropertyChangeListener(PropertyChangeListener, 140 * String) with a normal listener parameter and property name parameter. 141 */ 142 public void testAddPropertyChangeListener_PropertyChangeListener_String_Normal() { 143 Object src = new Object(); 144 PropertyChangeSupport sup = new PropertyChangeSupport(src); 145 PropertyChangeListener l1 = new MockPropertyChangeListener(); 146 PropertyChangeListener l2 = new MockPropertyChangeListener(); 147 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 148 l2); 149 PropertyChangeListener[] listeners; 150 151 sup.addPropertyChangeListener("myProp2", l1); 152 153 listeners = sup.getPropertyChangeListeners(); 154 assertEquals(1, listeners.length); 155 assertSame(l1, ((PropertyChangeListenerProxy) listeners[0]) 156 .getListener()); 157 158 sup.removePropertyChangeListener(listeners[0]); 159 sup.addPropertyChangeListener("myProp3", l3); 160 listeners = sup.getPropertyChangeListeners(); 161 assertEquals(1, listeners.length); 162 // pay attention to this recursive proxy 163 assertNotSame(l3, ((PropertyChangeListenerProxy) listeners[0]) 164 .getListener()); 165 assertNotSame(l3, listeners[0]); 166 assertSame( 167 l2, 168 ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) listeners[0]) 169 .getListener()).getListener()); 170 171 listeners = sup.getPropertyChangeListeners("myProp"); 172 assertEquals(0, listeners.length); 173 174 listeners = sup.getPropertyChangeListeners("myProp3"); 175 assertEquals(1, listeners.length); 176 // pay attention to this recursive proxy 177 assertNotSame(l3, ((PropertyChangeListenerProxy) listeners[0]) 178 .getListener()); 179 assertNotSame(l3, listeners[0]); 180 assertSame(l2, ((PropertyChangeListenerProxy) listeners[0]) 181 .getListener()); 182 183 } 184 185 /* 186 * Test the method addPropertyChangeListener(PropertyChangeListener, 187 * String) with a null listener parameter and a normal property name 188 * parameter. 189 */ 190 public void testAddPropertyChangeListener_PropertyChangeListener_String_NullListener() { 191 Object src = new Object(); 192 PropertyChangeSupport sup = new PropertyChangeSupport(src); 193 194 sup.addPropertyChangeListener("myProp", null); 195 196 PropertyChangeListener[] listeners = sup.getPropertyChangeListeners(); 197 assertEquals(0, listeners.length); 198 199 new PropertyChangeListenerProxy("myProp", null); 200 assertEquals(0, listeners.length); 201 } 202 203 /* 204 * Test the method addPropertyChangeListener(PropertyChangeListener, 205 * String) with a normal listener parameter and a null property name 206 * parameter. 207 */ 208 public void testAddPropertyChangeListener_PropertyChangeListener_String_NullProperty() { 209 Object src = new Object(); 210 PropertyChangeSupport sup = new PropertyChangeSupport(src); 211 PropertyChangeListener l1 = new MockPropertyChangeListener(); 212 PropertyChangeListener l2 = new MockPropertyChangeListener(); 213 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 214 l2); 215 216 sup.addPropertyChangeListener(null, l1); 217 sup.addPropertyChangeListener(null, l3); 218 l3 = new PropertyChangeListenerProxy(null, l2); 219 sup.addPropertyChangeListener(l3); 220 } 221 222 /* 223 * Test the method addPropertyChangeListener(PropertyChangeListener, 224 * String) with a listener parameter that has already been registered for 225 * the named property. 226 */ 227 public void testAddPropertyChangeListener_PropertyChangeListener_String_Duplicate() { 228 Object src = new Object(); 229 PropertyChangeSupport sup = new PropertyChangeSupport(src); 230 PropertyChangeListener l1 = new MockPropertyChangeListener(); 231 PropertyChangeListener l2 = new MockPropertyChangeListener(); 232 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 233 l2); 234 235 sup.addPropertyChangeListener("myProp2", l1); 236 sup.addPropertyChangeListener("myProp2", l1); 237 238 PropertyChangeListener[] listeners = sup.getPropertyChangeListeners(); 239 assertEquals(2, listeners.length); 240 assertSame(l1, ((PropertyChangeListenerProxy) listeners[0]) 241 .getListener()); 242 assertSame(l1, ((PropertyChangeListenerProxy) listeners[1]) 243 .getListener()); 244 245 sup.removePropertyChangeListener(listeners[0]); 246 sup.removePropertyChangeListener(listeners[1]); 247 sup.addPropertyChangeListener("myProp3", l3); 248 sup.addPropertyChangeListener("myProp3", l3); 249 listeners = sup.getPropertyChangeListeners(); 250 assertEquals(2, listeners.length); 251 assertSame( 252 l2, 253 ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) listeners[0]) 254 .getListener()).getListener()); 255 assertSame( 256 l2, 257 ((PropertyChangeListenerProxy) ((PropertyChangeListenerProxy) listeners[1]) 258 .getListener()).getListener()); 259 } 260 261 /* 262 * Test the method removePropertyChangeListener(PropertyChangeListener) 263 * with a normal listener parameter. 264 */ 265 public void testRemovePropertyChangeListener_PropertyChangeListener_Normal() { 266 Object src = new Object(); 267 PropertyChangeSupport sup = new PropertyChangeSupport(src); 268 PropertyChangeListener l1 = new MockPropertyChangeListener(); 269 PropertyChangeListener l2 = new MockPropertyChangeListener(); 270 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 271 l2); 272 273 sup.addPropertyChangeListener(l1); 274 275 PropertyChangeListener[] listeners = sup.getPropertyChangeListeners(); 276 assertEquals(1, listeners.length); 277 sup.removePropertyChangeListener(l1); 278 listeners = sup.getPropertyChangeListeners(); 279 assertEquals(0, listeners.length); 280 sup.addPropertyChangeListener(l3); 281 listeners = sup.getPropertyChangeListeners(); 282 assertEquals(1, listeners.length); 283 sup.removePropertyChangeListener(l3); 284 listeners = sup.getPropertyChangeListeners(); 285 assertEquals(0, listeners.length); 286 sup.addPropertyChangeListener("myProp3", l2); 287 listeners = sup.getPropertyChangeListeners(); 288 assertEquals(1, listeners.length); 289 sup.removePropertyChangeListener(l2); 290 listeners = sup.getPropertyChangeListeners(); 291 assertEquals(1, listeners.length); 292 sup.removePropertyChangeListener(listeners[0]); 293 listeners = sup.getPropertyChangeListeners(); 294 assertEquals(0, listeners.length); 295 } 296 297 /* 298 * Test the method removePropertyChangeListener(PropertyChangeListener) 299 * with a null listener parameter. 300 */ 301 public void testRemovePropertyChangeListener_PropertyChangeListener_Null() { 302 Object src = new Object(); 303 PropertyChangeSupport sup = new PropertyChangeSupport(src); 304 305 sup.removePropertyChangeListener(null); 306 assertEquals(0, sup.getPropertyChangeListeners().length); 307 sup.addPropertyChangeListener(null); 308 assertEquals(0, sup.getPropertyChangeListeners().length); 309 sup.removePropertyChangeListener(null); 310 assertEquals(0, sup.getPropertyChangeListeners().length); 311 } 312 313 /* 314 * Test the method removePropertyChangeListener(PropertyChangeListener) 315 * with a non-registered listener parameter. 316 */ 317 public void testRemovePropertyChangeListener_PropertyChangeListener_NonRegistered() { 318 Object src = new Object(); 319 PropertyChangeSupport sup = new PropertyChangeSupport(src); 320 sup.removePropertyChangeListener(new MockPropertyChangeListener()); 321 assertEquals(0, sup.getPropertyChangeListeners().length); 322 } 323 324 /* 325 * Test the method removePropertyChangeListener(PropertyChangeListener, 326 * String) when a listener for all properties has been registered. 327 */ 328 public void testRemovePropertyChangeListener_PropertyChangeListener_String_AllRegistered() { 329 Object src = new Object(); 330 PropertyChangeSupport sup = new PropertyChangeSupport(src); 331 Object newValue = new Object(); 332 Object oldValue = new Object(); 333 334 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 335 "myProp", oldValue, newValue); 336 337 sup.addPropertyChangeListener(l1); 338 339 sup.removePropertyChangeListener("myProp", l1); 340 assertEquals(1, sup.getPropertyChangeListeners().length); 341 assertEquals(0, sup.getPropertyChangeListeners("myProp").length); 342 sup.firePropertyChange("myProp", oldValue, newValue); 343 l1.assertCalled(); 344 } 345 346 /* 347 * Test the method removePropertyChangeListener(PropertyChangeListener, 348 * String) when a listener for the named property has been registered. 349 */ 350 public void testRemovePropertyChangeListener_PropertyChangeListener_String_PropertyRegistered() { 351 Object src = new Object(); 352 PropertyChangeSupport sup = new PropertyChangeSupport(src); 353 PropertyChangeListener l1 = new MockPropertyChangeListener(); 354 sup.addPropertyChangeListener("myProp", l1); 355 assertEquals(1, sup.getPropertyChangeListeners().length); 356 357 sup.removePropertyChangeListener("myProp", l1); 358 assertEquals(0, sup.getPropertyChangeListeners().length); 359 assertEquals(0, sup.getPropertyChangeListeners("myProp").length); 360 361 PropertyChangeListener l2 = new MockPropertyChangeListener(); 362 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 363 l2); 364 sup.addPropertyChangeListener(l3); 365 assertEquals(1, sup.getPropertyChangeListeners().length); 366 sup.removePropertyChangeListener("myProp", l2); 367 assertEquals(0, sup.getPropertyChangeListeners().length); 368 assertEquals(0, sup.getPropertyChangeListeners("myProp").length); 369 } 370 371 /* 372 * Test the method removePropertyChangeListener(PropertyChangeListener, 373 * String) with a non-registered listener parameter. 374 */ 375 public void testRemovePropertyChangeListener_PropertyChangeListener_String_NonRegistered() { 376 Object src = new Object(); 377 PropertyChangeSupport sup = new PropertyChangeSupport(src); 378 sup.removePropertyChangeListener("myProp", 379 new MockPropertyChangeListener()); 380 assertEquals(0, sup.getPropertyChangeListeners().length); 381 } 382 383 /* 384 * Test the method removePropertyChangeListener(PropertyChangeListener, 385 * String) with a null listener parameter. 386 */ 387 public void testRemovePropertyChangeListener_PropertyChangeListener_String_NullListener() { 388 Object src = new Object(); 389 PropertyChangeSupport sup = new PropertyChangeSupport(src); 390 391 sup.removePropertyChangeListener("myProp", null); 392 assertEquals(0, sup.getPropertyChangeListeners().length); 393 sup.addPropertyChangeListener("myProp", null); 394 assertEquals(0, sup.getPropertyChangeListeners().length); 395 sup.removePropertyChangeListener("myProp", null); 396 assertEquals(0, sup.getPropertyChangeListeners().length); 397 } 398 399 /* 400 * Test the method removePropertyChangeListener(PropertyChangeListener, 401 * String) with a null property name parameter. 402 */ 403 public void testRemovePropertyChangeListener_PropertyChangeListener_String_NullProperty() { 404 Object src = new Object(); 405 PropertyChangeSupport sup = new PropertyChangeSupport(src); 406 407 sup.removePropertyChangeListener(null, 408 new MockPropertyChangeListener()); 409 sup.addPropertyChangeListener("myProp", 410 new MockPropertyChangeListener()); 411 sup.removePropertyChangeListener(null, 412 new MockPropertyChangeListener()); 413 } 414 415 /* 416 * Test the method getPropertyChangeListeners() when there is one listener 417 * for all properties and one for a named property. 418 */ 419 public void testGetPropertyChangeListener_Normal() { 420 Object src = new Object(); 421 PropertyChangeSupport sup = new PropertyChangeSupport(src); 422 PropertyChangeListener l1 = new MockPropertyChangeListener(); 423 PropertyChangeListener l2 = new MockPropertyChangeListener(); 424 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 425 l2); 426 PropertyChangeListener l4 = new MockPropertyChangeListener(); 427 428 sup.addPropertyChangeListener(l1); 429 sup.addPropertyChangeListener(l3); 430 sup.addPropertyChangeListener("myProp2", l4); 431 432 assertEquals(3, sup.getPropertyChangeListeners().length); 433 } 434 435 /* 436 * Test the method getPropertyChangeListeners() when there is no listeners. 437 */ 438 public void testGetPropertyChangeListener_Empty() { 439 Object src = new Object(); 440 PropertyChangeSupport sup = new PropertyChangeSupport(src); 441 assertEquals(0, sup.getPropertyChangeListeners().length); 442 } 443 444 /* 445 * Test the method getPropertyChangeListeners(String) when there is one 446 * listener for all properties and one for the named property and a third 447 * for another named property. 448 */ 449 public void testGetPropertyChangeListener_String_Normal() { 450 Object src = new Object(); 451 PropertyChangeSupport sup = new PropertyChangeSupport(src); 452 PropertyChangeListener l1 = new MockPropertyChangeListener(); 453 PropertyChangeListener l2 = new MockPropertyChangeListener(); 454 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 455 l2); 456 PropertyChangeListener l4 = new MockPropertyChangeListener(); 457 458 sup.addPropertyChangeListener(l1); 459 sup.addPropertyChangeListener(l3); 460 sup.addPropertyChangeListener("myProp2", l4); 461 462 assertEquals(1, sup.getPropertyChangeListeners("myProp").length); 463 assertSame(l2, sup.getPropertyChangeListeners("myProp")[0]); 464 sup.addPropertyChangeListener("myProp", 465 new MockPropertyChangeListener()); 466 assertEquals(2, sup.getPropertyChangeListeners("myProp").length); 467 } 468 469 /* 470 * Test the method getPropertyChangeListeners(String) when there is no 471 * listener for the named property but there is one for another named 472 * property. 473 */ 474 public void testGetPropertyChangeListener_String_None() { 475 Object src = new Object(); 476 PropertyChangeSupport sup = new PropertyChangeSupport(src); 477 PropertyChangeListener l1 = new MockPropertyChangeListener(); 478 PropertyChangeListener l2 = new MockPropertyChangeListener(); 479 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp2", 480 l2); 481 PropertyChangeListener l4 = new MockPropertyChangeListener(); 482 483 sup.addPropertyChangeListener(l1); 484 sup.addPropertyChangeListener(l3); 485 sup.addPropertyChangeListener("myProp3", l4); 486 487 assertEquals(0, sup.getPropertyChangeListeners("myProp").length); 488 } 489 490 /* 491 * Test the method getPropertyChangeListeners(String) with a null parameter. 492 */ 493 public void testGetPropertyChangeListener_String_Null() { 494 Object src = new Object(); 495 PropertyChangeSupport sup = new PropertyChangeSupport(src); 496 497 sup.getPropertyChangeListeners(null); 498 sup.addPropertyChangeListener("myProp", 499 new MockPropertyChangeListener()); 500 sup.getPropertyChangeListeners(null); 501 } 502 503 /* 504 * Test the method hasListeners(String) when there is one listener for all 505 * properties. 506 */ 507 public void testHasListener_AllRegistered() { 508 Object src = new Object(); 509 PropertyChangeSupport sup = new PropertyChangeSupport(src); 510 PropertyChangeListener l1 = new MockPropertyChangeListener(); 511 PropertyChangeListener l2 = new MockPropertyChangeListener(); 512 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 513 l2); 514 515 assertFalse(sup.hasListeners("myProp")); 516 sup.addPropertyChangeListener(l1); 517 assertTrue(sup.hasListeners("myProp")); 518 sup.removePropertyChangeListener(l1); 519 assertFalse(sup.hasListeners("myProp")); 520 sup.addPropertyChangeListener(l3); 521 assertTrue(sup.hasListeners("myProp")); 522 } 523 524 /* 525 * Test the method hasListeners(String) when there is one listener for the 526 * named property. 527 */ 528 public void testHasListener_PropertyRegistered() { 529 Object src = new Object(); 530 PropertyChangeSupport sup = new PropertyChangeSupport(src); 531 PropertyChangeListener l1 = new MockPropertyChangeListener(); 532 PropertyChangeListener l2 = new MockPropertyChangeListener(); 533 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 534 l2); 535 536 assertFalse(sup.hasListeners("myProp")); 537 sup.addPropertyChangeListener("myProP", l1); 538 assertFalse(sup.hasListeners("myProp")); 539 sup.addPropertyChangeListener("myProp", l2); 540 assertTrue(sup.hasListeners("myProp")); 541 sup.removePropertyChangeListener("myProp", l2); 542 assertFalse(sup.hasListeners("myProp")); 543 // The following assertion fails on RI. See HARMONY-2526 544 sup.addPropertyChangeListener("myProp", l3); 545 assertTrue(sup.hasListeners("myProp")); 546 } 547 548 /* 549 * Test the method hasListeners(String) when there is no listeners. 550 */ 551 public void testHasListener_None() { 552 Object src = new Object(); 553 PropertyChangeSupport sup = new PropertyChangeSupport(src); 554 assertFalse(sup.hasListeners("myProp")); 555 } 556 557 /* 558 * Test the method hasListeners(String) with a null parameter. 559 */ 560 public void testHasListener_Null() { 561 Object src = new Object(); 562 PropertyChangeSupport sup = new PropertyChangeSupport(src); 563 PropertyChangeListener l1 = new MockPropertyChangeListener(); 564 565 assertFalse(sup.hasListeners(null)); 566 567 sup.addPropertyChangeListener("myProP", l1); 568 sup.hasListeners(null); 569 } 570 571 public void testFireIndexedPropertyChange() { 572 final Object src = new Object(); 573 PropertyChangeSupport pcs = new PropertyChangeSupport(src); 574 pcs.addPropertyChangeListener(new PropertyChangeListener() { 575 public void propertyChange(PropertyChangeEvent evt) { 576 assertEquals(src, evt.getSource()); 577 assertEquals(0, ((IndexedPropertyChangeEvent)evt).getIndex()); 578 assertEquals("one", evt.getOldValue()); 579 assertEquals("two", evt.getNewValue()); 580 } 581 }); 582 583 pcs.fireIndexedPropertyChange("foo", 0, "one", "two"); 584 } 585 586 /* 587 * Test the method firePropertyChange(String, Object, Object) with normal 588 * parameters, when there is no listeners. 589 */ 590 public void testFirePropertyChange_Object_NoListeners() { 591 Object src = new Object(); 592 PropertyChangeSupport sup = new PropertyChangeSupport(src); 593 sup.firePropertyChange("myProp", new Object(), new Object()); 594 } 595 596 /* 597 * Test the method firePropertyChange(String, Object, Object) with normal 598 * parameters, when there is a listener for all properties and another for 599 * the named property. 600 */ 601 public void testFirePropertyChange_Object_Normal() { 602 Object src = new Object(); 603 PropertyChangeSupport sup = new PropertyChangeSupport(src); 604 Object newValue = new Object(); 605 Object oldValue = new Object(); 606 607 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 608 "myProp", oldValue, newValue); 609 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 610 "myProp", oldValue, newValue); 611 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 612 l2); 613 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 614 "myProp", oldValue, newValue); 615 sup.addPropertyChangeListener(l1); 616 sup.addPropertyChangeListener(l3); 617 sup.addPropertyChangeListener("myProp", l4); 618 619 sup.firePropertyChange("myProp", oldValue, newValue); 620 l1.assertCalled(); 621 l2.assertCalled(); 622 l4.assertCalled(); 623 } 624 625 /* 626 * Test the method firePropertyChange(String, Object, Object) with equal old 627 * and new non-null values, when there is a listener for all properties and 628 * another for the named property. 629 */ 630 public void testFirePropertyChange_Object_EqualValues() { 631 Object src = new Object(); 632 PropertyChangeSupport sup = new PropertyChangeSupport(src); 633 Object newValue = new Object(); 634 Object oldValue = newValue; 635 636 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 637 "myProp", oldValue, newValue); 638 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 639 "myProp", oldValue, newValue); 640 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 641 l2); 642 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 643 "myProp", oldValue, newValue); 644 sup.addPropertyChangeListener(l1); 645 sup.addPropertyChangeListener(l3); 646 sup.addPropertyChangeListener("myProp", l4); 647 648 sup.firePropertyChange("myProp", oldValue, newValue); 649 l1.assertNotCalled(); 650 l2.assertNotCalled(); 651 l4.assertNotCalled(); 652 } 653 654 /* 655 * Test the method firePropertyChange(String, Object, Object) with null old 656 * and new values, when there is a listener for all properties and another 657 * for the named property. 658 */ 659 public void testFirePropertyChange_Object_NullValues() { 660 Object src = new Object(); 661 PropertyChangeSupport sup = new PropertyChangeSupport(src); 662 Object newValue = null; 663 Object oldValue = null; 664 665 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 666 "myProp", oldValue, newValue); 667 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 668 "myProp", oldValue, newValue); 669 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 670 l2); 671 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 672 "myProp", oldValue, newValue); 673 sup.addPropertyChangeListener(l1); 674 sup.addPropertyChangeListener(l3); 675 sup.addPropertyChangeListener("myProp", l4); 676 677 sup.firePropertyChange("myProp", oldValue, newValue); 678 l1.assertCalled(); 679 l2.assertCalled(); 680 l4.assertCalled(); 681 } 682 683 /* 684 * Test the method firePropertyChange(String, Object, Object) with a 685 * non-null old value and a null new value, when there is a listener for all 686 * properties and another for the named property. 687 */ 688 public void testFirePropertyChange_Object_NullNewValue() { 689 Object src = new Object(); 690 PropertyChangeSupport sup = new PropertyChangeSupport(src); 691 Object newValue = null; 692 Object oldValue = new Object(); 693 694 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 695 "myProp", oldValue, newValue); 696 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 697 "myProp", oldValue, newValue); 698 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 699 l2); 700 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 701 "myProp", oldValue, newValue); 702 sup.addPropertyChangeListener(l1); 703 sup.addPropertyChangeListener(l3); 704 sup.addPropertyChangeListener("myProp", l4); 705 706 sup.firePropertyChange("myProp", oldValue, newValue); 707 l1.assertCalled(); 708 l2.assertCalled(); 709 l4.assertCalled(); 710 } 711 712 /* 713 * Test the method firePropertyChange(String, Object, Object) with a null 714 * old value and a non-null new value, when there is a listener for all 715 * properties and another for the named property. 716 */ 717 public void testFirePropertyChange_Object_NullOldValue() { 718 Object src = new Object(); 719 PropertyChangeSupport sup = new PropertyChangeSupport(src); 720 Object newValue = new Object(); 721 Object oldValue = null; 722 723 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 724 "myProp", oldValue, newValue); 725 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 726 "myProp", oldValue, newValue); 727 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 728 l2); 729 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 730 "myProp", oldValue, newValue); 731 sup.addPropertyChangeListener(l1); 732 sup.addPropertyChangeListener(l3); 733 sup.addPropertyChangeListener("myProp", l4); 734 735 sup.firePropertyChange("myProp", oldValue, newValue); 736 l1.assertCalled(); 737 l2.assertCalled(); 738 l4.assertCalled(); 739 } 740 741 /* 742 * Test the method firePropertyChange(String, Object, Object) with a null 743 * property name parameter. 744 */ 745 public void testFirePropertyChange_Object_NullProperty() { 746 Object src = new Object(); 747 PropertyChangeSupport sup = new PropertyChangeSupport(src); 748 Object newValue = new Object(); 749 Object oldValue = new Object(); 750 751 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 752 null, oldValue, newValue); 753 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 754 null, oldValue, newValue); 755 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 756 l2); 757 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 758 null, oldValue, newValue); 759 sup.addPropertyChangeListener(l1); 760 sup.addPropertyChangeListener(l3); 761 sup.addPropertyChangeListener("myProp", l4); 762 763 sup.firePropertyChange(null, oldValue, newValue); 764 l1.assertCalled(); 765 l2.assertNotCalled(); 766 l4.assertNotCalled(); 767 } 768 769 /* 770 * Test the method firePropertyChange(String, Object, Object) when a null 771 * listener has been registered. 772 */ 773 public void testFirePropertyChange_Object_NullListener() { 774 Object src = new Object(); 775 PropertyChangeSupport sup = new PropertyChangeSupport(src); 776 Object newValue = new Object(); 777 Object oldValue = new Object(); 778 779 sup.addPropertyChangeListener(null); 780 sup.firePropertyChange("myProp", oldValue, newValue); 781 } 782 783 /* 784 * Test the method firePropertyChange(PropertyChangeEvent) with normal 785 * parameters, when there is a listener for all properties and another for 786 * the named property. 787 */ 788 public void testFirePropertyChange_PropertyChangeEvent_Normal() { 789 Object src = new Object(); 790 PropertyChangeSupport sup = new PropertyChangeSupport(src); 791 Object newValue = new Object(); 792 Object oldValue = new Object(); 793 Object src2 = new Object(); 794 PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp", 795 oldValue, newValue); 796 797 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2, 798 "myProp", oldValue, newValue); 799 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2, 800 "myProp", oldValue, newValue); 801 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 802 l2); 803 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2, 804 "myProp", oldValue, newValue); 805 sup.addPropertyChangeListener(l1); 806 sup.addPropertyChangeListener(l3); 807 sup.addPropertyChangeListener("myProp", l4); 808 809 sup.firePropertyChange(event); 810 l1.assertCalled(); 811 l2.assertCalled(); 812 l4.assertCalled(); 813 } 814 815 /* 816 * Test the method firePropertyChange(PropertyChangeEvent) with equal old 817 * and new non-null values, when there is a listener for all properties and 818 * another for the named property. 819 */ 820 public void testFirePropertyChange_PropertyChangeEvent_EqualValues() { 821 Object src = new Object(); 822 PropertyChangeSupport sup = new PropertyChangeSupport(src); 823 Object newValue = new Object(); 824 Object oldValue = newValue; 825 Object src2 = new Object(); 826 PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp", 827 oldValue, newValue); 828 829 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2, 830 "myProp", oldValue, newValue); 831 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2, 832 "myProp", oldValue, newValue); 833 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 834 l2); 835 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2, 836 "myProp", oldValue, newValue); 837 sup.addPropertyChangeListener(l1); 838 sup.addPropertyChangeListener(l3); 839 sup.addPropertyChangeListener("myProp", l4); 840 841 sup.firePropertyChange(event); 842 l1.assertNotCalled(); 843 l2.assertNotCalled(); 844 l4.assertNotCalled(); 845 } 846 847 /* 848 * Test the method firePropertyChange(PropertyChangeEvent) with null old and 849 * new values, when there is a listener for all properties and another for 850 * the named property. 851 */ 852 public void testFirePropertyChange_PropertyChangeEvent_NullValues() { 853 Object src = new Object(); 854 PropertyChangeSupport sup = new PropertyChangeSupport(src); 855 Object newValue = null; 856 Object oldValue = null; 857 Object src2 = new Object(); 858 PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp", 859 oldValue, newValue); 860 861 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2, 862 "myProp", oldValue, newValue); 863 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2, 864 "myProp", oldValue, newValue); 865 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 866 l2); 867 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2, 868 "myProp", oldValue, newValue); 869 sup.addPropertyChangeListener(l1); 870 sup.addPropertyChangeListener(l3); 871 sup.addPropertyChangeListener("myProp", l4); 872 873 sup.firePropertyChange(event); 874 l1.assertCalled(); 875 l2.assertCalled(); 876 l4.assertCalled(); 877 } 878 879 /* 880 * Test the method firePropertyChange(PropertyChangeEvent) with a non-null 881 * old value and a null new value, when there is a listener for all 882 * properties and another for the named property. 883 */ 884 public void testFirePropertyChange_PropertyChangeEvent_NullNewValue() { 885 Object src = new Object(); 886 PropertyChangeSupport sup = new PropertyChangeSupport(src); 887 Object newValue = null; 888 Object oldValue = new Object(); 889 Object src2 = new Object(); 890 PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp", 891 oldValue, newValue); 892 893 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2, 894 "myProp", oldValue, newValue); 895 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2, 896 "myProp", oldValue, newValue); 897 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 898 l2); 899 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2, 900 "myProp", oldValue, newValue); 901 sup.addPropertyChangeListener(l1); 902 sup.addPropertyChangeListener(l3); 903 sup.addPropertyChangeListener("myProp", l4); 904 905 sup.firePropertyChange(event); 906 l1.assertCalled(); 907 l2.assertCalled(); 908 l4.assertCalled(); 909 } 910 911 /* 912 * Test the method firePropertyChange(PropertyChangeEvent) with a null old 913 * value and a non-null new value, when there is a listener for all 914 * properties and another for the named property. 915 */ 916 public void testFirePropertyChange_PropertyChangeEvent_NullOldValue() { 917 Object src = new Object(); 918 PropertyChangeSupport sup = new PropertyChangeSupport(src); 919 Object newValue = new Object(); 920 Object oldValue = null; 921 Object src2 = new Object(); 922 PropertyChangeEvent event = new PropertyChangeEvent(src2, "myProp", 923 oldValue, newValue); 924 925 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2, 926 "myProp", oldValue, newValue); 927 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2, 928 "myProp", oldValue, newValue); 929 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 930 l2); 931 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2, 932 "myProp", oldValue, newValue); 933 sup.addPropertyChangeListener(l1); 934 sup.addPropertyChangeListener(l3); 935 sup.addPropertyChangeListener("myProp", l4); 936 937 sup.firePropertyChange(event); 938 l1.assertCalled(); 939 l2.assertCalled(); 940 l4.assertCalled(); 941 } 942 943 /* 944 * Test the method firePropertyChange(PropertyChangeEvent) with a null 945 * property name parameter. 946 */ 947 public void testFirePropertyChange_PropertyChangeEvent_NullProperty() { 948 Object src = new Object(); 949 PropertyChangeSupport sup = new PropertyChangeSupport(src); 950 Object newValue = new Object(); 951 Object oldValue = new Object(); 952 Object src2 = new Object(); 953 PropertyChangeEvent event = new PropertyChangeEvent(src2, null, 954 oldValue, newValue); 955 956 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src2, 957 null, oldValue, newValue); 958 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src2, 959 null, oldValue, newValue); 960 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 961 l2); 962 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src2, 963 null, oldValue, newValue); 964 sup.addPropertyChangeListener(l1); 965 sup.addPropertyChangeListener(l3); 966 sup.addPropertyChangeListener("myProp", l4); 967 968 sup.firePropertyChange(event); 969 l1.assertCalled(); 970 l2.assertNotCalled(); 971 l4.assertNotCalled(); 972 } 973 974 /* 975 * Test the method firePropertyChange(PropertyChangeEvent) when null. 976 */ 977 public void testFirePropertyChange_PropertyChangeEvent_Null() { 978 Object src = new Object(); 979 PropertyChangeSupport sup = new PropertyChangeSupport(src); 980 981 try { 982 sup.firePropertyChange(null); 983 fail("Should throw NullPointerException!"); 984 } catch (NullPointerException ex) { 985 // expected 986 } 987 } 988 989 /* 990 * Test the method firePropertyChange(PropertyChangeEvent) when a null 991 * listener has been registered. 992 */ 993 public void testFirePropertyChange_PropertyChangeEvent_NullListener() { 994 PropertyChangeSupport sup = new PropertyChangeSupport(new Object()); 995 PropertyChangeEvent event = new PropertyChangeEvent(new Object(), 996 "myProp", new Object(), new Object()); 997 998 sup.addPropertyChangeListener(null); 999 sup.firePropertyChange(event); 1000 } 1001 1002 /* 1003 * Test the method firePropertyChange(String, boolean, boolean) with normal 1004 * parameters, when there is a listener for all properties and another for 1005 * the named property. 1006 */ 1007 public void testFirePropertyChange_Boolean_Normal() { 1008 Object src = new Object(); 1009 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1010 Object newValue = Boolean.TRUE; 1011 Object oldValue = Boolean.FALSE; 1012 1013 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1014 "myProp", oldValue, newValue); 1015 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 1016 "myProp", oldValue, newValue); 1017 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 1018 l2); 1019 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 1020 "myProp", oldValue, newValue); 1021 sup.addPropertyChangeListener(l1); 1022 sup.addPropertyChangeListener(l3); 1023 sup.addPropertyChangeListener("myProp", l4); 1024 1025 sup.firePropertyChange("myProp", false, true); 1026 l1.assertCalled(); 1027 l2.assertCalled(); 1028 l4.assertCalled(); 1029 } 1030 1031 /* 1032 * Test the method firePropertyChange(String, boolean, boolean) with equal 1033 * old and new non-null values, when there is a listener for all properties 1034 * and another for the named property. 1035 */ 1036 public void testFirePropertyChange_Boolean_EqualValues() { 1037 Object src = new Object(); 1038 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1039 Object newValue = Boolean.TRUE; 1040 Object oldValue = newValue; 1041 1042 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1043 "myProp", oldValue, newValue); 1044 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 1045 "myProp", oldValue, newValue); 1046 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 1047 l2); 1048 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 1049 "myProp", oldValue, newValue); 1050 sup.addPropertyChangeListener(l1); 1051 sup.addPropertyChangeListener(l3); 1052 sup.addPropertyChangeListener("myProp", l4); 1053 1054 sup.firePropertyChange("myProp", true, true); 1055 l1.assertNotCalled(); 1056 l2.assertNotCalled(); 1057 l4.assertNotCalled(); 1058 } 1059 1060 /* 1061 * Test the method firePropertyChange(String, boolean, boolean) with a null 1062 * property name parameter. 1063 */ 1064 public void testFirePropertyChange_Boolean_NullProperty() { 1065 Object src = new Object(); 1066 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1067 Object newValue = Boolean.TRUE; 1068 Object oldValue = Boolean.FALSE; 1069 1070 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1071 null, oldValue, newValue); 1072 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 1073 null, oldValue, newValue); 1074 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 1075 l2); 1076 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 1077 null, oldValue, newValue); 1078 sup.addPropertyChangeListener(l1); 1079 sup.addPropertyChangeListener(l3); 1080 sup.addPropertyChangeListener("myProp", l4); 1081 1082 sup.firePropertyChange(null, false, true); 1083 l1.assertCalled(); 1084 l2.assertNotCalled(); 1085 l4.assertNotCalled(); 1086 } 1087 1088 /* 1089 * Test the method firePropertyChange(String, boolean, boolean) when a null 1090 * listener has been registered. 1091 */ 1092 public void testFirePropertyChange_Boolean_NullListener() { 1093 PropertyChangeSupport sup = new PropertyChangeSupport(new Object()); 1094 1095 sup.addPropertyChangeListener(null); 1096 sup.firePropertyChange("myProp", true, false); 1097 } 1098 1099 /* 1100 * Test the method firePropertyChange(String, int, int) with normal 1101 * parameters, when there is a listener for all properties and another for 1102 * the named property. 1103 */ 1104 public void testFirePropertyChange_Int_Normal() { 1105 Object src = new Object(); 1106 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1107 int newValue = 1; 1108 int oldValue = 2; 1109 1110 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1111 "myProp", oldValue, newValue); 1112 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 1113 "myProp", oldValue, newValue); 1114 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 1115 l2); 1116 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 1117 "myProp", oldValue, newValue); 1118 sup.addPropertyChangeListener(l1); 1119 sup.addPropertyChangeListener(l3); 1120 sup.addPropertyChangeListener("myProp", l4); 1121 1122 sup.firePropertyChange("myProp", oldValue, newValue); 1123 l1.assertCalled(); 1124 l2.assertCalled(); 1125 l4.assertCalled(); 1126 } 1127 1128 /* 1129 * Test the method firePropertyChange(String, int, int) with equal old and 1130 * new non-null values, when there is a listener for all properties and 1131 * another for the named property. 1132 */ 1133 public void testFirePropertyChange_Int_EqualValues() { 1134 Object src = new Object(); 1135 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1136 Integer newValue = new Integer(1); 1137 Integer oldValue = newValue; 1138 1139 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1140 "myProp", oldValue, newValue); 1141 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 1142 "myProp", oldValue, newValue); 1143 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 1144 l2); 1145 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 1146 "myProp", oldValue, newValue); 1147 sup.addPropertyChangeListener(l1); 1148 sup.addPropertyChangeListener(l3); 1149 sup.addPropertyChangeListener("myProp", l4); 1150 1151 sup.firePropertyChange("myProp", oldValue.intValue(), newValue 1152 .intValue()); 1153 l1.assertNotCalled(); 1154 l2.assertNotCalled(); 1155 l4.assertNotCalled(); 1156 } 1157 1158 /* 1159 * Test the method firePropertyChange(String, int, int) with a null property 1160 * name parameter. 1161 */ 1162 public void testFirePropertyChange_Int_NullProperty() { 1163 Object src = new Object(); 1164 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1165 Integer newValue = new Integer(1); 1166 Integer oldValue = new Integer(2); 1167 1168 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1169 null, oldValue, newValue); 1170 MockPropertyChangeListener l2 = new MockPropertyChangeListener(src, 1171 null, oldValue, newValue); 1172 PropertyChangeListener l3 = new PropertyChangeListenerProxy("myProp", 1173 l2); 1174 MockPropertyChangeListener l4 = new MockPropertyChangeListener(src, 1175 null, oldValue, newValue); 1176 sup.addPropertyChangeListener(l1); 1177 sup.addPropertyChangeListener(l3); 1178 sup.addPropertyChangeListener("myProp", l4); 1179 1180 sup.firePropertyChange(null, oldValue.intValue(), newValue.intValue()); 1181 l1.assertCalled(); 1182 l2.assertNotCalled(); 1183 l4.assertNotCalled(); 1184 } 1185 1186 /* 1187 * Test the method firePropertyChange(String, int, int) when a null listener 1188 * has been registered. 1189 */ 1190 public void testFirePropertyChange_Int_NullListener() { 1191 Object src = new Object(); 1192 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1193 1194 sup.addPropertyChangeListener(null); 1195 sup.firePropertyChange("myProp", 1, 2); 1196 } 1197 1198 /* 1199 * Test serialization/deserialization. 1200 */ 1201 public void testSerialization() throws Exception { 1202 Object src = "PropertyChangeSupportSerializationTest"; 1203 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1204 PropertyChangeSupport sup2 = new PropertyChangeSupport(src); 1205 Integer newValue = new Integer(1); 1206 Integer oldValue = new Integer(2); 1207 1208 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1209 "myProp", oldValue, newValue); 1210 MockPropertyChangeListener2 l2 = new MockPropertyChangeListener2(); 1211 1212 sup.addPropertyChangeListener(l1); 1213 sup.addPropertyChangeListener("myProp", l1); 1214 sup.addPropertyChangeListener("myProp", l2); 1215 sup2.addPropertyChangeListener(l1); 1216 sup2.addPropertyChangeListener("myProp", l1); 1217 1218 PropertyChangeSupport deSup = (PropertyChangeSupport) SerializationTester 1219 .getDeserilizedObject(sup); 1220 assertEquals(sup2.getPropertyChangeListeners()[0], deSup 1221 .getPropertyChangeListeners()[0]); 1222 assertEquals(((PropertyChangeListenerProxy) sup2 1223 .getPropertyChangeListeners()[1]).getListener(), 1224 ((PropertyChangeListenerProxy) deSup 1225 .getPropertyChangeListeners()[1]).getListener()); 1226 } 1227 1228 /* 1229 * Test serialization/deserialization compatibility 1230 */ 1231 1232 public void testSerializationCompatibility() throws Exception { 1233 Object src = "PropertyChangeSupportSerializationTest"; 1234 PropertyChangeSupport sup = new PropertyChangeSupport(src); 1235 PropertyChangeSupport sup2 = new PropertyChangeSupport(src); 1236 Integer newValue = new Integer(1); 1237 Integer oldValue = new Integer(2); 1238 1239 MockPropertyChangeListener l1 = new MockPropertyChangeListener(src, 1240 "myProp", oldValue, newValue); 1241 MockPropertyChangeListener2 l2 = new MockPropertyChangeListener2(); 1242 1243 sup.addPropertyChangeListener(l1); 1244 sup.addPropertyChangeListener("myProp", l1); 1245 sup.addPropertyChangeListener("myProp", l2); 1246 sup2.addPropertyChangeListener(l1); 1247 sup2.addPropertyChangeListener("myProp", l1); 1248 SerializationTest.verifyGolden(this, sup2, new SerializableAssert() { 1249 public void assertDeserialized(Serializable initial, 1250 Serializable deserialized) { 1251 PropertyChangeSupport sup2 = (PropertyChangeSupport) initial; 1252 PropertyChangeSupport deSup = (PropertyChangeSupport) deserialized; 1253 assertEquals(sup2.getPropertyChangeListeners()[0], deSup 1254 .getPropertyChangeListeners()[0]); 1255 assertEquals(((PropertyChangeListenerProxy) sup2 1256 .getPropertyChangeListeners()[1]).getListener(), 1257 ((PropertyChangeListenerProxy) deSup 1258 .getPropertyChangeListeners()[1]).getListener()); 1259 } 1260 }); 1261 } 1262 1263 /* 1264 * Mock PropertyChangeListener. 1265 */ 1266 static class MockPropertyChangeListener implements PropertyChangeListener, 1267 Serializable { 1268 1269 private static final long serialVersionUID = 161877638385579731L; 1270 1271 private transient Object expSrc; 1272 1273 private String expPropName; 1274 1275 private transient Object expOldValue; 1276 1277 private transient Object expNewValue; 1278 1279 private transient PropertyChangeEvent event; 1280 1281 private final transient boolean called = false; 1282 1283 public MockPropertyChangeListener() { 1284 } 1285 1286 public MockPropertyChangeListener(Object src, String propName, 1287 Object oldValue, Object newValue) { 1288 this.expSrc = src; 1289 this.expPropName = propName; 1290 this.expOldValue = oldValue; 1291 this.expNewValue = newValue; 1292 } 1293 1294 public void setAll(Object src, String propName, Object oldValue, 1295 Object newValue) { 1296 this.expSrc = src; 1297 this.expPropName = propName; 1298 this.expOldValue = oldValue; 1299 this.expNewValue = newValue; 1300 } 1301 1302 public void propertyChange(PropertyChangeEvent event) { 1303 this.event = event; 1304 } 1305 1306 public void assertCalled() { 1307 assertSame(expSrc, event.getSource()); 1308 assertEquals(expPropName, event.getPropertyName()); 1309 assertEquals(expOldValue, event.getOldValue()); 1310 assertEquals(expNewValue, event.getNewValue()); 1311 assertNull(event.getPropagationId()); 1312 } 1313 1314 public void assertNotCalled() { 1315 assertNull(event); 1316 assertFalse(called); 1317 } 1318 1319 @Override 1320 public boolean equals(Object obj) { 1321 if (obj instanceof MockPropertyChangeListener) { 1322 MockPropertyChangeListener l = (MockPropertyChangeListener) obj; 1323 return null == this.expPropName ? null == l.expPropName 1324 : this.expPropName.equals(l.expPropName); 1325 } 1326 return false; 1327 } 1328 } 1329 1330 /* 1331 * Mock PropertyChangeListener which is not serializable. 1332 */ 1333 static class MockPropertyChangeListener2 implements PropertyChangeListener { 1334 1335 public void propertyChange(PropertyChangeEvent event) { 1336 } 1337 } 1338 1339 /* 1340 * Mock PropertyChangeListener that modifies the listener set on 1341 * notification. 1342 */ 1343 static class MockPropertyChangeListener3 implements PropertyChangeListener { 1344 1345 PropertyChangeSupport changeSupport; 1346 1347 public MockPropertyChangeListener3(PropertyChangeSupport changeSupport) { 1348 super(); 1349 this.changeSupport = changeSupport; 1350 } 1351 1352 /* On property changed event modify the listener set */ 1353 public void propertyChange(PropertyChangeEvent event) { 1354 changeSupport 1355 .addPropertyChangeListener(new PropertyChangeListener() { 1356 public void propertyChange(PropertyChangeEvent event) { 1357 // Empty 1358 } 1359 }); 1360 } 1361 } 1362 1363 /** 1364 * Regression test for concurrent modification of listener set 1365 */ 1366 @SuppressWarnings("unused") 1367 public void testConcurrentModification() { 1368 PropertyChangeSupport changeSupport = new PropertyChangeSupport("bogus"); 1369 MockPropertyChangeListener3 changeListener = new MockPropertyChangeListener3( 1370 changeSupport); 1371 changeSupport.firePropertyChange("bogus property", "previous", "newer"); 1372 } 1373 1374 /** 1375 * @tests java.beans.PropertyChangeSupport#PropertyChangeSupport( 1376 * java.lang.Object) 1377 */ 1378 public void testConstructor_Null() { 1379 // Regression for HARMONY-227 1380 try { 1381 new PropertyChangeSupport(null); 1382 fail("Should throw NullPointerException!"); 1383 } catch (NullPointerException ex) { 1384 // expected 1385 } 1386 } 1387 1388 /** 1389 * @tests java.beans.PropertyChangeSupport#addPropertyChangeSupport 1390 * 1391 */ 1392 public void test_addPropertyChangeListenerNullNull() throws Exception { 1393 // Regression for HARMONY-441 1394 new PropertyChangeSupport("bean1") 1395 .addPropertyChangeListener(null, null); 1396 } 1397 1398 /** 1399 * @tests java.beans.PropertyChangeSupport#removePropertyChangeListener( 1400 * java.lang.String, java.beans.PropertyChangeListener) 1401 */ 1402 public void testRemovePropertyChangeListener() { 1403 // Regression for HARMONY-386 1404 PropertyChangeSupport prop = new PropertyChangeSupport(new Object()); 1405 1406 PropertyChangeListener lis1 = new PropertyChangeListener() { 1407 1408 public void propertyChange(PropertyChangeEvent event) { 1409 } 1410 }; 1411 1412 PropertyChangeListener lis2 = new PropertyChangeListenerProxy("name", 1413 lis1); 1414 1415 assertEquals(0, prop.getPropertyChangeListeners().length); 1416 1417 prop.addPropertyChangeListener(lis2); 1418 assertEquals(1, prop.getPropertyChangeListeners().length); 1419 1420 prop.removePropertyChangeListener("name", lis1); 1421 assertEquals(0, prop.getPropertyChangeListeners().length); 1422 } 1423 1424 /** 1425 * @tests java.beans.PropertyChangeSupport#removePropertyChangeListener( 1426 * java.lang.String, java.beans.PropertyChangeListener) 1427 */ 1428 public void testRemovePropertyChangeListener2() { 1429 // Regression for HARMONY-320 1430 PropertyChangeListener listener = new PropertyChangeListener() { 1431 1432 public void propertyChange(PropertyChangeEvent arg0) { 1433 } 1434 }; 1435 1436 PropertyChangeSupport pcs = new PropertyChangeSupport(this); 1437 1438 pcs.addPropertyChangeListener("property", listener); 1439 PropertyChangeListener[] listeners = pcs.getPropertyChangeListeners(); 1440 assertEquals(1, listeners.length); 1441 1442 pcs.removePropertyChangeListener(listeners[0]); 1443 listeners = pcs.getPropertyChangeListeners(); 1444 assertEquals(0, listeners.length); 1445 } 1446 1447 /** 1448 * The test checks the serialization for listeners supporting serialization 1449 */ 1450 public void testSerializableListener() throws Exception { 1451 writePropertyChangeListeners(new PropertyChangeListener[] { new SerializablePropertyChangeListener() }); 1452 readPropertyChangeListeners(); 1453 } 1454 1455 /** 1456 * The test checks the serialization for listeners not supporting 1457 * serialization 1458 */ 1459 public void testNonSerializableListener() throws Exception { 1460 writePropertyChangeListeners(new PropertyChangeListener[] { new NonSerializablePropertyChangeListener() }); 1461 readPropertyChangeListeners(); 1462 } 1463 1464 private void writePropertyChangeListeners(PropertyChangeListener[] array) { 1465 ObjectOutputStream oos = null; 1466 try { 1467 oos = new ObjectOutputStream(new FileOutputStream(tempFile)); 1468 PropertyChangeSupport pcs = new PropertyChangeSupport("bean"); 1469 if (array != null && array.length > 0) { 1470 for (PropertyChangeListener element : array) { 1471 pcs.addPropertyChangeListener(element); 1472 } 1473 } 1474 oos.writeObject(pcs); 1475 oos.flush(); 1476 } catch (Exception e) { 1477 System.out.println(e.getClass() + ": " + e.getMessage()); 1478 fail("Exception is thrown in testNonSerializableListener"); 1479 } finally { 1480 if (oos != null) { 1481 try { 1482 oos.close(); 1483 } catch (IOException ioe) { 1484 fail("Exception while closing ObjectOutputStream"); 1485 } 1486 } 1487 } 1488 } 1489 1490 private PropertyChangeListener[] readPropertyChangeListeners() 1491 throws Exception { 1492 ObjectInputStream ois = null; 1493 PropertyChangeSupport pcs = null; 1494 try { 1495 ois = new ObjectInputStream(new FileInputStream(tempFile)); 1496 pcs = (PropertyChangeSupport) ois.readObject(); 1497 } finally { 1498 if (ois != null) { 1499 ois.close(); 1500 } 1501 } 1502 return pcs.getPropertyChangeListeners(); 1503 } 1504 } 1505