alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

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 NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun
 * Microsystems, Inc. All Rights Reserved.
 *//*
 * DataModelTest.java
 *
 * Created on May 27, 2003, 12:43 AM
 */

package org.netbeans.swing.tabcontrol;
import org.netbeans.swing.tabcontrol.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import junit.framework.*;


/** Some basic tests for DefaultTabDataModel, etc.  Can be fleshed out into proper
 *  unit tests later.
 *
 * @author  Tim Boudreau
 */
public class DataModelTest extends TestCase implements ComplexListDataListener {
    ComplexListDataEvent lastEvent = null;
    String lastListenerCall=null;
    

    public DataModelTest(String testName) {
        super(testName);
    }
    
    public static Test suite() {
        TestSuite suite = new TestSuite(DataModelTest.class);
        return suite;
    }
    
    TabDataModel mdl=null;
    Icon ic = new Icon () {
        public int getIconWidth() {
            return 16;
        }
        public int getIconHeight() {
            return 16;
        }
        public void paintIcon (Component c, Graphics g, int x, int y) {
            //do nothing
        }
    };
    
    Icon sameSizeIcon = new Icon () {
        public int getIconWidth() {
            return 16;
        }
        public int getIconHeight() {
            return 16;
        }
        public void paintIcon (Component c, Graphics g, int x, int y) {
            //do nothing
        }
    };
    
    Icon biggerIcon = new Icon () {
        public int getIconWidth() {
            return 22;
        }
        public int getIconHeight() {
            return 22;
        }
        public void paintIcon (Component c, Graphics g, int x, int y) {
            //do nothing
        }
    };
    
    public void setUp () {
        prepareModel();
        mdl.addComplexListDataListener(this);
    }
    
    /** Weird, but this class was adapted from a standalone test written
     * long ago and rescued from cvs history.  It didn't use JUnit, and 
     * the assertTrue argument order was reversed.  So in the interest of 
     * laziness... */
    private void assertPravda (boolean val, String msg) {
        assertTrue (msg, val);
    }
    
    private void assertText (String name, int index) {
        TabData td = mdl.getTab (index);
        assertPravda (td.getText().equals (name), "Text at " + index + " was not " + name + " it was " + td.getText());
    }
    
    private void assertData (int index, TabData data) {
        TabData other = mdl.getTab (index);
        assertPravda (data.equals(other), "TabData at " + index + " is not " + data + " it is " + other);
    }
    
    private void assertListenerCall (String call) {
        assertPravda (lastEvent != null, "Last listener call should be non-null");
        assertPravda (call.equals (lastListenerCall), "Last listener call should have been " + call + " but was " + lastListenerCall);
    }
    
    private void assertEventIndices (int indices[]) {
        assertPravda (lastEvent != null, "Last event should have been fired but is null");
        int[] ids = lastEvent.getIndices();
        Arrays.sort (indices);
        Arrays.sort (ids);
        assertPravda (ids.length == indices.length, "Indices length in last change should be " + indices.length + " but is " + ids.length + " expected indices: " + arrToStr (indices) + " actual indices " + arrToStr(ids));
        for (int i=0; i < ids.length; i++) {
            assertPravda (ids[i] == indices[i], "Event indices should be " + arrToStr(indices) + " but are " + arrToStr(ids));
        }
    }
    
    private void assertEventIndices (int start, int end) {
        assertPravda (lastEvent != null, "Last event should have been fired but is null");
        assertPravda (start == lastEvent.getIndex0(), "Event start index should be " + start + " but is " + lastEvent.getIndex0());
        assertPravda (end == lastEvent.getIndex1(), "Event end index should be " + end + " but is " + lastEvent.getIndex1());
    }
    
    private void assertWidthChanged () {
        assertPravda (lastEvent != null, "Last event should have been fired but is null");
        assertPravda (lastEvent.isTextChanged(), "Last event should have been a text change event but wasn't");
    }
    
    private void assertWidthNotChanged () {
        assertPravda (lastEvent != null, "Last event should have been fired but is null");
        assertPravda (!lastEvent.isTextChanged(), "Last event should not have been a text change event but was");
    }
    
    /**
     * Since this test was written in non-junit style, the order of the tests
     * is important, so we have one junit method for all of the actual tests. 
     */
    public void testEverything() {
        doTestContentsValid();
        doTestAdd();
        doTestRemove();
        doTestAddContiguous();
        doTestRemoveContiguous();
        doTestAddNonContiguous();
        doTestRemoveNonContiguous();
        doTestSetTab();
        doTestSetTextNonContiguous();
        doTestSetIconNonContiguous();
        doTestSetIconAndTextNonContiguous();
        System.err.println("All tests passed");
    }
    
    public void doTestContentsValid () {
        System.err.println("testContentsValid");
        _testContentsValid();
    }
    
    private void _testContentsValid () {
        int ct=0;
        for (char c='a'; c < 'z'; c++) {
            TabData td = mdl.getTab(ct);
            assertPravda (td.getText().charAt(0) == c, "Name at " + ct + " is not " + c + " it is " + td.getText());
            ct++;
        }
    }
    
    public void doTestAdd () {
        System.err.println("testAdd");
        TabData td = new TabData (new JLabel ("testAdd"), ic, "testAdd", "Tip:testAdd");
        mdl.addTabs(0, new TabData[] {td});
        assertData (0, td);
    }
    
    public void doTestRemove () {
        System.err.println("testRemove");
        mdl.removeTab(0);
        assertText ("a", 0);
    }
    
    public void doTestAddContiguous() {
        System.err.println("testAddContiguous");
        int formerSize = mdl.size();
        TabData[] td = new TabData[10];
        for (int i=0; i < 10; i++) {
            String name = Integer.toString (i);
            Component comp = new JLabel();
            td[i] = new TabData (comp, ic, name, "Tip:"+name);
        }
        mdl.addTabs(10, td);
        int expectedSize=formerSize+10;
        assertPravda (mdl.size() == expectedSize, "Model size should be " + expectedSize + " after adding 10 items, but is " + mdl.size());
        for (int i=10; i < 20; i++) {
            assertData (i, td[i-10]);
        }
    }
    
    public void doTestRemoveContiguous() {
        System.err.println("testRemoveContiguous");
        int formerSize = mdl.size();
        mdl.removeTabs (10, 20);
        int expectedSize=formerSize-10;
        assertPravda (mdl.size() == expectedSize, "Model size should be " + expectedSize + " after removing 10 items, but is " + mdl.size());
        try {
            _testContentsValid();
        } catch (RuntimeException e) {
            e.printStackTrace();
            fail("After removing 10 items, contents should be original contents, but are " + mdl.toString());
        }
    }
    
    TabData[] data=null;
    public void doTestAddNonContiguous () {
        System.err.println("testAddNonContiguous");
        int[] indices = new int[] {3, 1, 5};
        data = new TabData[3];
        for (int i=0; i < indices.length; i++) {
            String name = Integer.toString (indices[i]);
            data[i] = new TabData (new JLabel(), ic, name, "Tip:"+name);
        }
        mdl.addTabs(indices, data);
        assertData (3, data[0]);
        assertData (1, data[1]);
        assertData (5, data[2]);
        Arrays.sort (indices);
        assertEventIndices (indices);
        assertListenerCall ("indicesAdded");
    }
    
    public void doTestRemoveNonContiguous () {
        int[] indices = new int[] {5, 1, 3};
        mdl.removeTabs(indices);
        try {
            _testContentsValid();
        } catch (RuntimeException e) {
            System.err.println("After non-contiguous removal of " + arrToStr(indices) + ", contents should be original contents, but are " + mdl.toString());
            throw e;
        }
        Arrays.sort(indices);
        assertEventIndices (indices);
        assertListenerCall ("indicesRemoved");
    }
    
    public void doTestSetTab () {
        System.err.println("testSetTab");
        TabData former = mdl.getTab (22);
        TabData nue = new TabData (new JLabel(), ic, "foo", "Tip:foo");
        mdl.setTab (22, nue);
        assertData (22, nue);
        mdl.setTab (22, former);
        assertListenerCall ("contentsChanged");
        assertEventIndices (22, 22);
        //Make sure an event is not generated for changes that should not generate one
        noEvent = true;
        mdl.setTab (22, former);
        mdl.setText(22, former.getText());
        mdl.setIcon (22, ic);
        noEvent = false;
    }
    
    public void doTestSetTextNonContiguous() {
        System.err.println("testSetTextNonContiguous");
        String[] names = new String [5];
        int[] indices = new int[] {22,11,15,8,3};
        for (int i=0; i < names.length; i++) {
            names[i] = mdl.getTab(indices[i]).getText();
        }
        noEvent = true;
        //should produce no event since the names haven't changed
        mdl.setText(indices, names);
        noEvent = false;
        String[] s = new String[names.length];
        for (int i=0; i < s.length; i++) {
            s[i] = names[i] + "modified";
        }
        mdl.setText(indices, s);
        for (int i=0; i < s.length; i++) {
            assertText(s[i], indices[i]);
        }
        Arrays.sort (indices);
        assertEventIndices(indices);
        assertListenerCall("contentsChanged");
        assertWidthChanged();
        //restore the original text
        mdl.setText(indices, names);
    }
    
    public void doTestSetIcon () {
        System.err.println("testSetIcon");
        TabData td = mdl.getTab (20);
        noEvent = true;
        mdl.setIcon(20, td.getIcon());
        noEvent = false;
        
        mdl.setIcon(20, sameSizeIcon);
        assertEventIndices(20,20);
        assertListenerCall("contentsChanged");
        assertPravda (td.getIcon() == sameSizeIcon, "Icon was changed but same old still returned from TabData");
        assertWidthNotChanged();
        EventObject last = lastEvent;
        
        mdl.setIcon(20, biggerIcon);
        assertWidthChanged();
        assertPravda (last != lastEvent,  "Icon changed but no event fired");
        
        //restore the state
        mdl.setIcon(20,ic);
    }

    public void doTestSetIconNonContiguous() {
        System.err.println("testSetIconNonContiguous");
        Icon[] icons = new Icon[5];
        int[] indices = new int[] {22,11,15,8,3};
        for (int i=0; i < icons.length; i++) {
            icons[i] = mdl.getTab(indices[i]).getIcon();
        }
        noEvent = true;
        //should produce no event since the names haven't changed
        mdl.setIcon(indices, icons);
        noEvent = false;
        
        EventObject last = lastEvent;
        
        Arrays.fill (icons, sameSizeIcon);
        mdl.setIcon (indices, icons);
        assertPravda (last != lastEvent,  "Icons changed but no event fired");
        last = lastEvent;
        assertListenerCall("contentsChanged");
        assertWidthNotChanged();
        
        Arrays.fill (icons, biggerIcon);
        icons[2] = sameSizeIcon;
        int[] expectedIndices = new int[]{3,8,22,11};
        
        mdl.setIcon(indices, icons);
        assertPravda (last != lastEvent,  "Icons changed but no event fired");
        assertListenerCall("contentsChanged");
        assertWidthChanged();
        assertEventIndices(expectedIndices);
        
        Arrays.fill (icons, ic);
        //restore the original text
        mdl.setIcon(indices, icons);
    }
    
    public void doTestSetIconAndTextNonContiguous() {
        System.err.println("testSetIconAndTextNonContiguous");
        int indices[] = new int[] {3, 10, 5};
        Icon[] icons = new Icon[3];
        Arrays.fill (icons, ic);
        String[] sts = new String[3];
        for (int i=0; i < 3; i++) {
            sts[i] = mdl.getTab(i).getText();
        }
        //ensure expected results
        mdl.setIconsAndText (indices, sts, icons);
        
        noEvent = true;
        mdl.setIconsAndText(indices, sts, icons);
        noEvent = false;
        String[] realText = new String[sts.length];
        System.arraycopy(sts, 0, realText, 0, sts.length);
        EventObject last = lastEvent;
        
        icons[0] = sameSizeIcon;
        mdl.setIconsAndText(indices, sts, icons);
        assertPravda (last != lastEvent,  "Icons and text changed but no event fired");
        assertWidthNotChanged();
        assertEventIndices(new int[] {3});
        last = lastEvent;
        
        icons[0] = biggerIcon;
        sts[1] = "foobar";
        mdl.setIconsAndText(indices, sts, icons);
        assertPravda (last != lastEvent,  "Icons and text changed but no event fired");
        assertWidthChanged();
        assertEventIndices(new int[] {3, 10});
        last = lastEvent;
        
        //Also test the simpler firing code for when all changed icons have changed text
        icons[0] = ic;
        sts[1] = "boo";
        mdl.setIconsAndText(indices, sts, icons);
        assertPravda (last != lastEvent,  "Icons and text changed but no event fired");
        assertWidthChanged();
        assertEventIndices(new int[] {3, 10});
        
        //restore the state
        Arrays.fill (icons, ic);
        mdl.setIconsAndText (indices, realText, icons);
    }
    
    
    static String arrToStr (int[] ints) {
        if (ints == null) return "null";
        StringBuffer out = new StringBuffer (ints.length * 3);
        for (int i=0; i < ints.length; i++) {
            out.append (ints[i]);
            if (i != ints.length-1) {
                out.append (",");
            }
        }
        return out.toString();
    }
    
    static String arrToStr (Object[] o) {
        if (o == null) return "null";
        StringBuffer out = new StringBuffer (o.length * 3);
        for (int i=0; i < o.length; i++) {
            out.append (o[i]);
            if (i != o.length-1) {
                out.append (",");
            }
        }
        return out.toString();
    }
    
    private void prepareModel() {
        if (mdl != null) {
            mdl.removeComplexListDataListener(this);
        }
        TabData[] td = new TabData[25];
        int ct = 0;
        for (char c='a'; c < 'z'; c++) {
            String name = new String (new char[]{c});
            Component comp = new JLabel(name);
            comp.setName (name);
            td[ct] = new TabData (comp, ic, name, "tip:"+name);
            ct++;
        }
        mdl = new DefaultTabDataModel (td);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new DataModelTest("foo").run();
    }
    
    public void contentsChanged(javax.swing.event.ListDataEvent e) {
        lastListenerCall="contentsChanged";
        lastEvent = (ComplexListDataEvent)e;
        if (noEvent) {
            assertPravda (false, "No event expected but " + e + " receieved");
        }
    }
    
    public void indicesAdded(ComplexListDataEvent e) {
        lastListenerCall="indicesAdded";
        lastEvent = e;
        if (noEvent) {
            assertPravda (false, "No event expected but " + e + " receieved");
        }
    }
    
    public void indicesChanged(ComplexListDataEvent e) {
        lastListenerCall="indicesChanged";
        lastEvent = e;
        if (noEvent) {
            assertPravda (false, "No event expected but " + e + " receieved");
        }
    }
    
    public void indicesRemoved(ComplexListDataEvent e) {
        lastListenerCall="indicesRemoved";
        lastEvent = e;
        if (noEvent) {
            assertPravda (false, "No event expected but " + e + " receieved");
        }
    }
    
    public void intervalAdded(javax.swing.event.ListDataEvent e) {
        lastListenerCall="intervalAdded";
        assertPravda (e.getIndex0() <= e.getIndex1(), "Event start index > end index");

        lastEvent = (ComplexListDataEvent)e;
        if (noEvent) {
            assertPravda (false, "No event expected but " + e + " receieved");
        }
    }
    
    public void intervalRemoved(javax.swing.event.ListDataEvent e) {
        lastListenerCall="intervalRemoved";
        lastEvent = (ComplexListDataEvent)e;
        if (noEvent) {
            assertPravda (false, "No event expected but " + e + " receieved");
        }
    }
    
    boolean noEvent = false;
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 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.