samples/gc/test/org/apidesign/gc/WeakListenersTest.java
changeset 113 f2b6057a3376
child 263 7e8e995065c5
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/samples/gc/test/org/apidesign/gc/WeakListenersTest.java	Sat Jun 14 09:54:38 2008 +0200
     1.3 @@ -0,0 +1,76 @@
     1.4 +package org.apidesign.gc;
     1.5 +
     1.6 +import java.awt.Color;
     1.7 +import java.beans.PropertyChangeEvent;
     1.8 +import java.beans.PropertyChangeListener;
     1.9 +import java.lang.ref.WeakReference;
    1.10 +import javax.swing.JPanel;
    1.11 +import org.junit.After;
    1.12 +import org.junit.AfterClass;
    1.13 +import org.junit.Before;
    1.14 +import org.junit.BeforeClass;
    1.15 +import org.junit.Test;
    1.16 +import org.netbeans.junit.NbTestCase;
    1.17 +import static org.junit.Assert.*;
    1.18 +
    1.19 +public class WeakListenersTest {
    1.20 +
    1.21 +    private static JPanel longLivingBean;
    1.22 +    
    1.23 +    public WeakListenersTest() {
    1.24 +    }
    1.25 +
    1.26 +    @BeforeClass
    1.27 +    public static void setUpClass() throws Exception {
    1.28 +        longLivingBean = new JPanel();
    1.29 +    }
    1.30 +    
    1.31 +    @Before
    1.32 +    public void setUp() {
    1.33 +        longLivingBean.setBackground(Color.BLACK);
    1.34 +    }
    1.35 +
    1.36 +    @Test
    1.37 +    public void listenWithoutWeakReference() {
    1.38 +        PropL listener = new PropL();
    1.39 +        longLivingBean.addPropertyChangeListener(listener);
    1.40 +        longLivingBean.setBackground(Color.WHITE);
    1.41 +        assertEquals("background property change notified", "background", listener.propName);
    1.42 +        WeakReference<Object> ref = new WeakReference<Object>(listener);
    1.43 +        listener = null;
    1.44 +        try {
    1.45 +            NbTestCase.assertGC(
    1.46 +                "Of course, this listener cannot disappear, because it is held from long living JavaBean", 
    1.47 +                ref
    1.48 +            );
    1.49 +        } catch (Exception ex) {
    1.50 +            ex.printStackTrace();
    1.51 +            // of course it cannot
    1.52 +            return;
    1.53 +        }
    1.54 +        fail("The listener cannot be GCed as it is held from long living JavaBean");
    1.55 +    }
    1.56 +
    1.57 +    @Test
    1.58 +    public void listenViaWeakListener() {
    1.59 +        PropL listener = new PropL();
    1.60 +        
    1.61 +        PropertyChangeListener weakL = WeakListeners.create(PropertyChangeListener.class, listener, longLivingBean);
    1.62 +        longLivingBean.addPropertyChangeListener(weakL);
    1.63 +        longLivingBean.setBackground(Color.WHITE);
    1.64 +        assertEquals("background property change notified", "background", listener.propName);
    1.65 +        // BEGIN: gc.assertGC
    1.66 +        WeakReference<Object> ref = new WeakReference<Object>(listener);
    1.67 +        listener = null;
    1.68 +        NbTestCase.assertGC("This listener can disappear", ref);
    1.69 +        // END: gc.assertGC
    1.70 +    }
    1.71 +
    1.72 +    
    1.73 +    private static class PropL implements PropertyChangeListener {
    1.74 +        String propName;
    1.75 +        public void propertyChange(PropertyChangeEvent evt) {
    1.76 +            propName = evt.getPropertyName();
    1.77 +        }
    1.78 +    }
    1.79 +}
    1.80 \ No newline at end of file