|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.spi.looks; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import java.lang.reflect.*; import java.util.*; import org.netbeans.api.nodes2looks.Nodes; import org.netbeans.api.nodes2looks.TestUtil; import org.netbeans.spi.looks.*; import org.netbeans.junit.*; import org.netbeans.modules.looks.LookListener; import org.openide.nodes.Node; import org.openide.nodes.NodeListener; /** Tests the event delivery from looks. * * @author Petr Hrebejk */ public class EventDeliveryTest extends NbTestCase { // Methods of testCase ----------------------------------------------------- public EventDeliveryTest(String testName) { super(testName); } public static void main( String[] args ) { junit.textui.TestRunner.run(suite()); } public static NbTest suite() { NbTestSuite suite = new NbTestSuite(EventDeliveryTest.class); return suite; } protected void setUp() throws Exception { super.setUp(); TestUtil.setUpRegistryToDefault(); } protected void tearDown() throws Exception { super.tearDown(); } // Test methods ------------------------------------------------------------ /** Tests that the event delivery works well for multiple views */ public void testMultipleViewsDetach() { BadGuyLook look = new BadGuyLook( "BAD_GUY_LOOK" ); BadGuy ro = new BadGuy( "First name", new HashSet() ); doTest( look, ro ); } /** Tests that the event delivery works well for multiple views */ public void testMultipleViewsEventsCount() { BadGuyLook look = new BadGuyLook( "BAD_GUY_LOOK" ); BadGuy ro = new BadGuy( "First name", new ArrayList() ); doTest( look, ro ); } private void doTest( BadGuyLook look, BadGuy ro ) { // These nodes represent the two views Node n1 = Nodes.node( ro, look ); Node n2 = Nodes.node( ro, look ); BadGuyNodeListener bgnl1 = new BadGuyNodeListener(); BadGuyNodeListener bgnl2 = new BadGuyNodeListener(); n1.addNodeListener( bgnl1 ); n2.addNodeListener( bgnl2 ); ro.setName( "Second name" ); assertEquals( "There should be one prop change", 1, bgnl1.names.size() ); assertEquals( "There should be one prop change", 1, bgnl2.names.size() ); assertEquals( "Attach should be called once", 1, look.attachTo ); WeakReference ref = new WeakReference ( n1 ); n1 = null; // Lets forget the node assertGC ("The node must disapear", ref); ro.setName( "Third name" ); assertEquals( "There should be one prop change", 1, bgnl1.names.size() ); assertEquals( "There should be one prop change", 2, bgnl2.names.size() ); } /** Tests that detached look won't fire any events */ public void testEventAfterDetach() { BadGuyLook look = new BadGuyLook( "BAD_GUY_LOOK" ); BadGuy ro = new BadGuy( "First name", new ArrayList() ); BadGuyLookListener ll = new BadGuyLookListener(); org.netbeans.modules.looks.Accessor.DEFAULT.addLookListener( look, ro, ll ); ro.setName( "Second name" ); assertEquals( "There should be one name change", 1, ll.names.size() ); org.netbeans.modules.looks.Accessor.DEFAULT.removeLookListener( look, ro, ll ); ro.setName( "Third name" ); assertEquals( "There should be still only one name change", 1, ll.names.size() ); } // Innerclasses ------------------------------------------------------------ /** This is a bad represented object allows for using different * collections for listener list. */ public static class BadGuy { private Collection listeners; private String name; public BadGuy( String name, Collection listeners ) { this.name = name; this.listeners = listeners; } public String getName() { return name; } public void setName( String name ) { String oldName = this.name; this.name = name; for( Iterator it = listeners.iterator(); it.hasNext(); ) { ((PropertyChangeListener)it.next()).propertyChange( new PropertyChangeEvent( this, "NAME", oldName, name ) ); } } public void addPropertyChangeListener( PropertyChangeListener listener ) { listeners.add( listener ); } public void removePropertyChangeListener( PropertyChangeListener listener ) { listeners.remove( listener ); } } public static class BadGuyLook extends Look implements PropertyChangeListener { private int attachTo; private int detachFrom; private Class exClass; public BadGuyLook( String name ) { super( name ); } public void attachTo( Object representedObject ) { ((BadGuy)representedObject).addPropertyChangeListener( this ); attachTo++; } public void detachFrom( Object representedObject ) { ((BadGuy)representedObject).removePropertyChangeListener( this ); detachFrom++; } public int getAttachToCount() { return attachTo; } public int getDetachFromCount() { return detachFrom; } public void propertyChange( PropertyChangeEvent evt ) { fireChange( evt.getSource(), Look.GET_NAME ); } } public static class BadGuyNodeListener implements NodeListener { private List names = new ArrayList(); public void propertyChange(PropertyChangeEvent evt) { names.add( evt.getNewValue() ); } public void childrenAdded(org.openide.nodes.NodeMemberEvent ev) { } public void childrenRemoved(org.openide.nodes.NodeMemberEvent ev) { } public void childrenReordered(org.openide.nodes.NodeReorderEvent ev) { } public void nodeDestroyed(org.openide.nodes.NodeEvent ev) { } } public static class BadGuyLookListener implements LookListener { private List names = new ArrayList(); public void change(org.netbeans.modules.looks.LookEvent evt) { long mask = evt.getMask(); if ( ( mask & Look.GET_NAME ) > 0 ) { names.add( new Object() ); } } public void propertyChange(org.netbeans.modules.looks.LookEvent evt) { } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.