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