samples/gc/test/org/apidesign/gc/WeakListenersTest.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:54:38 +0200
changeset 113 f2b6057a3376
child 263 7e8e995065c5
permissions -rw-r--r--
Memory tests
     1 package org.apidesign.gc;
     2 
     3 import java.awt.Color;
     4 import java.beans.PropertyChangeEvent;
     5 import java.beans.PropertyChangeListener;
     6 import java.lang.ref.WeakReference;
     7 import javax.swing.JPanel;
     8 import org.junit.After;
     9 import org.junit.AfterClass;
    10 import org.junit.Before;
    11 import org.junit.BeforeClass;
    12 import org.junit.Test;
    13 import org.netbeans.junit.NbTestCase;
    14 import static org.junit.Assert.*;
    15 
    16 public class WeakListenersTest {
    17 
    18     private static JPanel longLivingBean;
    19     
    20     public WeakListenersTest() {
    21     }
    22 
    23     @BeforeClass
    24     public static void setUpClass() throws Exception {
    25         longLivingBean = new JPanel();
    26     }
    27     
    28     @Before
    29     public void setUp() {
    30         longLivingBean.setBackground(Color.BLACK);
    31     }
    32 
    33     @Test
    34     public void listenWithoutWeakReference() {
    35         PropL listener = new PropL();
    36         longLivingBean.addPropertyChangeListener(listener);
    37         longLivingBean.setBackground(Color.WHITE);
    38         assertEquals("background property change notified", "background", listener.propName);
    39         WeakReference<Object> ref = new WeakReference<Object>(listener);
    40         listener = null;
    41         try {
    42             NbTestCase.assertGC(
    43                 "Of course, this listener cannot disappear, because it is held from long living JavaBean", 
    44                 ref
    45             );
    46         } catch (Exception ex) {
    47             ex.printStackTrace();
    48             // of course it cannot
    49             return;
    50         }
    51         fail("The listener cannot be GCed as it is held from long living JavaBean");
    52     }
    53 
    54     @Test
    55     public void listenViaWeakListener() {
    56         PropL listener = new PropL();
    57         
    58         PropertyChangeListener weakL = WeakListeners.create(PropertyChangeListener.class, listener, longLivingBean);
    59         longLivingBean.addPropertyChangeListener(weakL);
    60         longLivingBean.setBackground(Color.WHITE);
    61         assertEquals("background property change notified", "background", listener.propName);
    62         // BEGIN: gc.assertGC
    63         WeakReference<Object> ref = new WeakReference<Object>(listener);
    64         listener = null;
    65         NbTestCase.assertGC("This listener can disappear", ref);
    66         // END: gc.assertGC
    67     }
    68 
    69     
    70     private static class PropL implements PropertyChangeListener {
    71         String propName;
    72         public void propertyChange(PropertyChangeEvent evt) {
    73             propName = evt.getPropertyName();
    74         }
    75     }
    76 }