org.metawidget.integrationtest.swing.allwidgets.SwingAllWidgetsTest.java Source code

Java tutorial

Introduction

Here is the source code for org.metawidget.integrationtest.swing.allwidgets.SwingAllWidgetsTest.java

Source

// Metawidget (licensed under LGPL)
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

package org.metawidget.integrationtest.swing.allwidgets;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

import junit.framework.TestCase;

import org.apache.commons.beanutils.ConvertUtils;
import org.metawidget.iface.MetawidgetException;
import org.metawidget.integrationtest.shared.allwidgets.model.AllWidgets;
import org.metawidget.integrationtest.shared.allwidgets.model.AllWidgets.NestedWidgets;
import org.metawidget.integrationtest.shared.allwidgets.proxy.AllWidgetsProxy.AllWidgets$$EnhancerByCGLIB$$1234;
import org.metawidget.swing.Stub;
import org.metawidget.swing.SwingMetawidget;
import org.metawidget.swing.layout.GridBagLayoutConfig;
import org.metawidget.swing.layout.SeparatorLayoutDecorator;
import org.metawidget.swing.layout.SeparatorLayoutDecoratorConfig;
import org.metawidget.swing.widgetprocessor.binding.beanutils.BeanUtilsBindingProcessor;
import org.metawidget.swing.widgetprocessor.binding.reflection.ReflectionBindingProcessor;
import org.metawidget.widgetprocessor.iface.AdvancedWidgetProcessor;

/**
 * @author Richard Kennard
 */

public class SwingAllWidgetsTest extends TestCase {

    //
    // Protected statics
    //

    protected static final String DATE_FORMAT = "E MMM dd HH:mm:ss z yyyy";

    //
    // Constructor
    //

    public SwingAllWidgetsTest() {

        // Default constructor
    }

    //
    // Public methods
    //

    public void testAllWidgets() throws Exception {

        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));

        // BeanUtilsBinding

        ConvertUtils.register(
                new org.metawidget.integrationtest.swing.allwidgets.converter.beanutils.DateConverter(DATE_FORMAT),
                Date.class);
        ConvertUtils.register(
                new org.metawidget.integrationtest.swing.allwidgets.converter.beanutils.NestedWidgetsConverter(),
                NestedWidgets.class);
        runTest(new BeanUtilsBindingProcessor());
    }

    //
    // Protected methods
    //

    protected void runTest(AdvancedWidgetProcessor<JComponent, SwingMetawidget> processor) throws Exception {

        // Model

        AllWidgets allWidgets = new AllWidgets$$EnhancerByCGLIB$$1234();

        // App

        SwingMetawidget metawidget = new SwingMetawidget();
        metawidget.setConfig("org/metawidget/integrationtest/swing/allwidgets/metawidget.xml");
        metawidget.addWidgetProcessor(processor);
        metawidget.addWidgetProcessor(new ReflectionBindingProcessor());
        metawidget.setMetawidgetLayout(new SeparatorLayoutDecorator(new SeparatorLayoutDecoratorConfig().setLayout(
                new org.metawidget.swing.layout.GridBagLayout(new GridBagLayoutConfig().setNumberOfColumns(2)))));

        metawidget.setToInspect(allWidgets);

        metawidget.add(new Stub("mystery"));

        // Test missing components

        try {
            metawidget.getValue("no-such-component");
            fail();
        } catch (MetawidgetException e1) {
            assertEquals("No component named 'no-such-component'", e1.getMessage());

            try {
                metawidget.getValue("textbox", "no-such-component");
                fail();
            } catch (MetawidgetException e2) {
                assertEquals("No component named 'textbox', 'no-such-component'", e2.getMessage());

                try {
                    metawidget.getValue("textbox", "no-such-component1", "no-such-component2");
                    fail();
                } catch (MetawidgetException e3) {
                    assertEquals(
                            "No such component 'no-such-component1' of 'textbox', 'no-such-component1', 'no-such-component2'",
                            e3.getMessage());
                }
            }
        }

        try {
            metawidget.setValue(null, "no-such-component");
            fail();
        } catch (MetawidgetException e1) {
            assertEquals("No component named 'no-such-component'", e1.getMessage());

            try {
                metawidget.setValue(null, "textbox", "no-such-component");
                fail();
            } catch (MetawidgetException e2) {
                assertEquals("No component named 'textbox', 'no-such-component'", e2.getMessage());

                try {
                    metawidget.setValue(null, "textbox", "no-such-component1", "no-such-component2");
                    fail();
                } catch (MetawidgetException e3) {
                    assertEquals(
                            "No such component 'no-such-component1' of 'textbox', 'no-such-component1', 'no-such-component2'",
                            e3.getMessage());
                }
            }
        }

        // Check what created, and edit it

        assertEquals("Textbox*:", ((JLabel) metawidget.getComponent(0)).getText());
        assertTrue(metawidget.getComponent(1) instanceof JTextField);
        assertEquals("Textbox", metawidget.getValue("textbox"));
        ((JTextField) metawidget.getComponent(1)).setText("Textbox1");

        assertEquals("Limited Textbox:", ((JLabel) metawidget.getComponent(2)).getText());
        assertTrue(metawidget.getComponent(3) instanceof JTextField);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(3)).gridx);
        assertEquals("Limited Textbox", metawidget.getValue("limitedTextbox"));
        ((JTextField) metawidget.getComponent(3)).setText("Limited Textbox1");

        assertEquals("Textarea:", ((JLabel) metawidget.getComponent(4)).getText());
        assertTrue(metawidget.getComponent(5) instanceof JScrollPane);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(5)).gridx);
        assertEquals("Textarea", metawidget.getValue("textarea"));

        JTextArea textarea = (JTextArea) ((JScrollPane) metawidget.getComponent(5)).getViewport().getView();
        assertEquals(2, textarea.getRows());
        assertEquals(true, textarea.getLineWrap());
        assertEquals(true, textarea.getWrapStyleWord());
        textarea.setText("Textarea1");

        assertEquals("Password:", ((JLabel) metawidget.getComponent(6)).getText());
        assertTrue(metawidget.getComponent(7) instanceof JPasswordField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(7)).gridx);
        assertEquals("Password", metawidget.getValue("password"));
        ((JPasswordField) metawidget.getComponent(7)).setText("Password1");

        // Primitives

        assertEquals("Byte Primitive:", ((JLabel) metawidget.getComponent(8)).getText());
        assertTrue(metawidget.getComponent(9) instanceof JSpinner);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(9)).gridx);
        assertTrue(Byte.MAX_VALUE == (Byte) metawidget.getValue("bytePrimitive"));
        assertTrue(-5 == (Byte) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(9)).getModel())
                .getMinimum());
        assertTrue(
                Byte.MAX_VALUE == (Byte) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(9)).getModel())
                        .getMaximum());
        assertEquals(0, ((JSpinner.DefaultEditor) ((JSpinner) metawidget.getComponent(9)).getEditor())
                .getTextField().getColumns());
        JSpinner spinner = (JSpinner) metawidget.getComponent(9);
        spinner.setValue(spinner.getModel().getPreviousValue());

        assertEquals("Byte Object:", ((JLabel) metawidget.getComponent(10)).getText());
        assertTrue(metawidget.getComponent(11) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(11)).gridx);
        assertEquals(String.valueOf(Byte.MIN_VALUE), metawidget.getValue("byteObject"));
        ((JTextField) metawidget.getComponent(11)).setText(String.valueOf(Byte.MIN_VALUE + 1));

        assertEquals("Short Primitive:", ((JLabel) metawidget.getComponent(12)).getText());
        assertTrue(metawidget.getComponent(13) instanceof JSpinner);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(13)).gridx);
        assertTrue(Short.MAX_VALUE == (Short) metawidget.getValue("shortPrimitive"));
        assertTrue(-6 == (Short) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(13)).getModel())
                .getMinimum());
        assertTrue(Short.MAX_VALUE == (Short) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(13))
                .getModel()).getMaximum());
        spinner = (JSpinner) metawidget.getComponent(13);
        assertEquals(0, ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().getColumns());
        spinner.setValue(spinner.getModel().getPreviousValue());

        assertEquals("Short Object:", ((JLabel) metawidget.getComponent(14)).getText());
        assertTrue(metawidget.getComponent(15) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(15)).gridx);
        assertEquals(String.valueOf(Short.MIN_VALUE), metawidget.getValue("shortObject"));
        ((JTextField) metawidget.getComponent(15)).setText(String.valueOf(Short.MIN_VALUE + 1));

        assertEquals("Int Primitive:", ((JLabel) metawidget.getComponent(16)).getText());
        assertTrue(metawidget.getComponent(17) instanceof JSpinner);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(17)).gridx);
        assertTrue(Integer.MAX_VALUE == (Integer) metawidget.getValue("intPrimitive"));
        assertTrue(Integer.MIN_VALUE == (Integer) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(17))
                .getModel()).getMinimum());
        assertTrue(Integer.MAX_VALUE == (Integer) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(17))
                .getModel()).getMaximum());
        spinner = (JSpinner) metawidget.getComponent(17);
        assertEquals(0, ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().getColumns());
        spinner.setValue(spinner.getModel().getPreviousValue());

        assertEquals("Integer Object:", ((JLabel) metawidget.getComponent(18)).getText());
        assertTrue(metawidget.getComponent(19) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(19)).gridx);
        assertEquals(String.valueOf(Integer.MIN_VALUE), metawidget.getValue("integerObject"));
        ((JTextField) metawidget.getComponent(19)).setText(String.valueOf(Integer.MIN_VALUE + 1));

        assertEquals("Ranged Int:", ((JLabel) metawidget.getComponent(20)).getText());
        assertTrue(metawidget.getComponent(21) instanceof JSlider);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(21)).gridx);
        assertEquals(1, ((JSlider) metawidget.getComponent(21)).getMinimum());
        assertEquals(100, ((JSlider) metawidget.getComponent(21)).getMaximum());
        assertTrue(32 == (Integer) metawidget.getValue("rangedInt"));
        ((JSlider) metawidget.getComponent(21)).setValue(33);

        assertEquals("Ranged Integer:", ((JLabel) metawidget.getComponent(22)).getText());
        assertTrue(metawidget.getComponent(23) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(23)).gridx);
        assertEquals("33", metawidget.getValue("rangedInteger"));
        ((JTextField) metawidget.getComponent(23)).setText(String.valueOf(34));

        assertEquals("Long Primitive:", ((JLabel) metawidget.getComponent(24)).getText());
        assertTrue(metawidget.getComponent(25) instanceof JSpinner);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(25)).gridx);
        assertTrue(42 == (Long) metawidget.getValue("longPrimitive"));
        assertTrue(-7 == (Long) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(25)).getModel())
                .getMinimum());
        assertTrue(
                Long.MAX_VALUE == (Long) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(25)).getModel())
                        .getMaximum());
        spinner = (JSpinner) metawidget.getComponent(25);
        assertEquals(0, ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().getColumns());
        spinner.setValue(spinner.getModel().getNextValue());

        assertTrue(metawidget.getComponent(26) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(26)).gridx);
        assertEquals("43", metawidget.getValue("longObject"));
        ((JTextField) metawidget.getComponent(26)).setText("44");

        assertEquals("Float Primitive:", ((JLabel) metawidget.getComponent(27)).getText());
        assertTrue(metawidget.getComponent(28) instanceof JSpinner);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(28)).gridx);
        assertEquals(4.2f, metawidget.getValue("floatPrimitive"));
        assertEquals(-Float.MAX_VALUE,
                ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(28)).getModel()).getMinimum());
        assertTrue(2048 == (Float) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(28)).getModel())
                .getMaximum());
        spinner = (JSpinner) metawidget.getComponent(28);
        assertEquals(0, ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().getColumns());
        spinner.setValue(spinner.getModel().getNextValue());

        assertEquals("nullInBundle:", ((JLabel) metawidget.getComponent(29)).getText());
        assertTrue(metawidget.getComponent(30) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(30)).gridx);
        assertEquals("4.3", metawidget.getValue("floatObject"));
        ((JTextField) metawidget.getComponent(30)).setText("5.4");

        assertEquals("Double Primitive:", ((JLabel) metawidget.getComponent(31)).getText());
        assertTrue(metawidget.getComponent(32) instanceof JSpinner);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(32)).gridx);
        assertEquals(42.2d, metawidget.getValue("doublePrimitive"));
        assertTrue(-8 == (Double) ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(32)).getModel())
                .getMinimum());
        assertEquals(Double.MAX_VALUE,
                ((SpinnerNumberModel) ((JSpinner) metawidget.getComponent(32)).getModel()).getMaximum());
        spinner = (JSpinner) metawidget.getComponent(32);
        assertEquals(0, ((JSpinner.DefaultEditor) spinner.getEditor()).getTextField().getColumns());
        spinner.setValue(spinner.getModel().getNextValue());

        assertTrue(metawidget.getComponent(33) instanceof JTextField);
        assertEquals(0, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(33)).gridx);
        assertEquals(2,
                ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(33)).gridwidth);
        assertEquals("43.3", metawidget.getValue("doubleObject"));
        ((JTextField) metawidget.getComponent(33)).setText("54.4");

        assertEquals("Char Primitive:", ((JLabel) metawidget.getComponent(34)).getText());
        assertTrue(metawidget.getComponent(35) instanceof JTextField);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(35)).gridx);
        assertEquals("A", metawidget.getValue("charPrimitive"));
        ((JTextField) metawidget.getComponent(35)).setText("Z");

        assertEquals("Character Object:", ((JLabel) metawidget.getComponent(36)).getText());
        assertTrue(metawidget.getComponent(37) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(37)).gridx);
        assertEquals("Z", metawidget.getValue("characterObject"));
        ((JTextField) metawidget.getComponent(37)).setText("A");

        assertEquals("Boolean Primitive:", ((JLabel) metawidget.getComponent(38)).getText());
        assertTrue(metawidget.getComponent(39) instanceof JCheckBox);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(39)).gridx);
        assertTrue(false == (Boolean) metawidget.getValue("booleanPrimitive"));
        ((JCheckBox) metawidget.getComponent(39)).setSelected(true);

        assertEquals("Boolean Object:", ((JLabel) metawidget.getComponent(40)).getText());
        assertTrue(metawidget.getComponent(41) instanceof JComboBox);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(37)).gridx);
        assertEquals(3, ((JComboBox) metawidget.getComponent(41)).getItemCount());
        assertEquals(Boolean.TRUE, metawidget.getValue("booleanObject"));
        ((JComboBox) metawidget.getComponent(41)).setSelectedItem(Boolean.FALSE);

        assertEquals("Dropdown:", ((JLabel) metawidget.getComponent(42)).getText());
        assertTrue(metawidget.getComponent(43) instanceof JComboBox);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(43)).gridx);
        assertEquals(4, ((JComboBox) metawidget.getComponent(43)).getItemCount());
        assertEquals("dropdown1", metawidget.getValue("dropdown"));
        ((JComboBox) metawidget.getComponent(43)).setSelectedItem("foo1");

        assertEquals("Dropdown With Labels:", ((JLabel) metawidget.getComponent(44)).getText());
        assertTrue(metawidget.getComponent(45) instanceof JComboBox);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(45)).gridx);

        JComboBox combo = (JComboBox) metawidget.getComponent(45);
        assertEquals(5, combo.getItemCount());
        assertEquals("Foo #2",
                ((JLabel) combo.getRenderer().getListCellRendererComponent(new JList(), "foo2", 1, false, false))
                        .getText());
        assertEquals("Dropdown #2", ((JLabel) combo.getRenderer().getListCellRendererComponent(new JList(),
                "dropdown2", 1, false, false)).getText());
        assertEquals("Bar #2",
                ((JLabel) combo.getRenderer().getListCellRendererComponent(new JList(), "bar2", 1, false, false))
                        .getText());
        assertEquals("Baz #2",
                ((JLabel) combo.getRenderer().getListCellRendererComponent(new JList(), "baz2", 1, false, false))
                        .getText());
        assertEquals("dropdown2", metawidget.getValue("dropdownWithLabels"));
        ((JComboBox) metawidget.getComponent(45)).setSelectedItem("bar2");

        assertEquals("Not Null Dropdown:", ((JLabel) metawidget.getComponent(46)).getText());
        assertTrue(metawidget.getComponent(47) instanceof JComboBox);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(47)).gridx);
        assertEquals(3, ((JComboBox) metawidget.getComponent(47)).getItemCount());
        assertTrue(0 == (Byte) metawidget.getValue("notNullDropdown"));
        ((JComboBox) metawidget.getComponent(47)).setSelectedItem((byte) 1);

        assertEquals("Not Null Object Dropdown*:", ((JLabel) metawidget.getComponent(48)).getText());
        assertTrue(metawidget.getComponent(49) instanceof JComboBox);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(49)).gridx);
        assertEquals(6, ((JComboBox) metawidget.getComponent(49)).getItemCount());
        assertEquals("dropdown3", metawidget.getValue("notNullObjectDropdown"));
        ((JComboBox) metawidget.getComponent(49)).setSelectedIndex(0);

        assertEquals("Nested Widgets:", ((JLabel) metawidget.getComponent(50)).getText());
        assertTrue(metawidget.getComponent(51) instanceof SwingMetawidget);

        SwingMetawidget metawidgetNested = (SwingMetawidget) metawidget.getComponent(51);

        assertEquals("Further Nested Widgets:", ((JLabel) metawidgetNested.getComponent(0)).getText());
        assertEquals(1, ((GridBagLayout) metawidgetNested.getLayout())
                .getConstraints(metawidgetNested.getComponent(1)).gridx);

        SwingMetawidget metawidgetFurtherNested = (SwingMetawidget) metawidgetNested.getComponent(1);
        assertEquals("Further Nested Widgets:", ((JLabel) metawidgetFurtherNested.getComponent(0)).getText());
        assertTrue(metawidgetFurtherNested.getComponent(1) instanceof SwingMetawidget);
        assertEquals(((SwingMetawidget) metawidgetFurtherNested.getComponent(1)).getComponentCount(), 0);

        assertEquals("Nested Textbox 1:", ((JLabel) metawidgetFurtherNested.getComponent(2)).getText());
        assertTrue(metawidgetFurtherNested.getComponent(3) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidgetFurtherNested.getLayout())
                .getConstraints(metawidgetFurtherNested.getComponent(3)).gridx);
        assertEquals("Nested Textbox 1",
                metawidget.getValue("nestedWidgets", "furtherNestedWidgets", "nestedTextbox1"));
        ((JTextField) metawidgetFurtherNested.getComponent(3)).setText("Nested Textbox 1.1 (further)");

        assertEquals("Nested Textbox 2:", ((JLabel) metawidgetFurtherNested.getComponent(4)).getText());
        assertTrue(metawidgetFurtherNested.getComponent(5) instanceof JTextField);

        // (should be 1, as in next row, if getEffectiveNumberOfColumns is working)

        assertEquals(1, ((GridBagLayout) metawidgetFurtherNested.getLayout())
                .getConstraints(metawidgetFurtherNested.getComponent(5)).gridx);
        assertEquals("Nested Textbox 2",
                metawidget.getValue("nestedWidgets", "furtherNestedWidgets", "nestedTextbox2"));
        ((JTextField) metawidgetFurtherNested.getComponent(5)).setText("Nested Textbox 2.2 (further)");

        assertEquals("Nested Textbox 1:", ((JLabel) metawidgetNested.getComponent(2)).getText());
        assertTrue(metawidgetNested.getComponent(3) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidgetNested.getLayout())
                .getConstraints(metawidgetNested.getComponent(3)).gridx);
        assertEquals("Nested Textbox 1", metawidget.getValue("nestedWidgets", "nestedTextbox1"));
        ((JTextField) metawidgetNested.getComponent(3)).setText("Nested Textbox 1.1");

        assertEquals("Nested Textbox 2:", ((JLabel) metawidgetNested.getComponent(4)).getText());
        assertTrue(metawidgetNested.getComponent(5) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidgetNested.getLayout())
                .getConstraints(metawidgetNested.getComponent(5)).gridx);
        assertEquals("Nested Textbox 2", metawidget.getValue("nestedWidgets", "nestedTextbox2"));
        ((JTextField) metawidgetNested.getComponent(5)).setText("Nested Textbox 2.2");

        assertEquals("Read Only Nested Widgets:", ((JLabel) metawidget.getComponent(52)).getText());
        assertTrue(metawidget.getComponent(53) instanceof SwingMetawidget);

        metawidgetNested = (SwingMetawidget) metawidget.getComponent(53);
        assertEquals("Nested Textbox 1:", ((JLabel) metawidgetNested.getComponent(2)).getText());
        assertTrue(metawidgetNested.getComponent(3) instanceof JLabel);
        assertEquals(1, ((GridBagLayout) metawidgetNested.getLayout())
                .getConstraints(metawidgetNested.getComponent(3)).gridx);
        assertEquals("Nested Textbox 1", metawidget.getValue("readOnlyNestedWidgets", "nestedTextbox1"));

        assertEquals("Nested Textbox 2:", ((JLabel) metawidgetNested.getComponent(4)).getText());
        assertTrue(metawidgetNested.getComponent(5) instanceof JLabel);
        assertEquals(1, ((GridBagLayout) metawidgetNested.getLayout())
                .getConstraints(metawidgetNested.getComponent(5)).gridx);
        assertEquals("Nested Textbox 2", metawidget.getValue("readOnlyNestedWidgets", "nestedTextbox2"));

        assertEquals("Nested Widgets Dont Expand:", ((JLabel) metawidget.getComponent(54)).getText());
        assertEquals("Nested Textbox 1, Nested Textbox 2", ((JTextField) metawidget.getComponent(55)).getText());
        ((JTextField) metawidget.getComponent(55)).setText("Nested Textbox 1.01, Nested Textbox 2.02");

        assertEquals("Read Only Nested Widgets Dont Expand:", ((JLabel) metawidget.getComponent(56)).getText());
        assertEquals("Nested Textbox 1, Nested Textbox 2", ((JLabel) metawidget.getComponent(57)).getText());

        assertEquals("Date:", ((JLabel) metawidget.getComponent(58)).getText());
        assertTrue(metawidget.getComponent(59) instanceof JTextField);
        assertEquals(1, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(59)).gridx);

        DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
        assertEquals(dateFormat.format(allWidgets.getDate()), metawidget.getValue("date"));
        ((JTextField) metawidget.getComponent(59)).setText("bad date");

        JPanel separatorPanel = (JPanel) metawidget.getComponent(60);
        assertEquals("Section Break", ((JLabel) separatorPanel.getComponent(0)).getText());
        assertEquals(GridBagConstraints.REMAINDER,
                ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(60)).gridwidth);
        assertTrue(separatorPanel.getComponent(1) instanceof JSeparator);

        assertEquals("Read Only:", ((JLabel) metawidget.getComponent(61)).getText());
        assertTrue(metawidget.getComponent(62) instanceof JLabel);
        assertEquals("Read Only", metawidget.getValue("readOnly"));

        assertTrue(metawidget.getComponent(63) instanceof JButton);
        assertEquals(3, ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(63)).gridx);
        assertEquals(GridBagConstraints.NONE,
                ((GridBagLayout) metawidget.getLayout()).getConstraints(metawidget.getComponent(63)).fill);
        JButton button = ((JButton) metawidget.getComponent(63));
        assertEquals("Do Action", button.getText());
        assertTrue(button.isEnabled());
        try {
            button.doClick();
            fail();
        } catch (Exception e) {
            assertEquals("doAction called", e.getCause().getCause().getMessage());
        }

        assertEquals(64, metawidget.getComponentCount());

        // Check painting

        JFrame frame = new JFrame();
        metawidget.paint(frame.getGraphics());

        // Check MetawidgetException

        try {
            processor.getClass().getMethod("save", SwingMetawidget.class).invoke(processor, metawidget);
            fail();
        } catch (Exception e) {
            assertEquals("Could not parse 'bad date'", e.getCause().getCause().getMessage());
        }

        // Check saving

        String now = dateFormat.format(new GregorianCalendar().getTime());
        ((JTextField) metawidget.getComponent(59)).setText(now);
        processor.getClass().getMethod("save", SwingMetawidget.class).invoke(processor, metawidget);

        // Check read-only

        metawidget.setReadOnly(true);

        assertEquals("Textbox:", ((JLabel) metawidget.getComponent(0)).getText());
        assertEquals("Textbox1", ((JLabel) metawidget.getComponent(1)).getText());
        assertEquals("Limited Textbox:", ((JLabel) metawidget.getComponent(2)).getText());
        assertEquals("Limited Textbox1", ((JLabel) metawidget.getComponent(3)).getText());
        assertEquals("Textarea:", ((JLabel) metawidget.getComponent(4)).getText());
        assertEquals("Textarea1",
                ((JTextArea) ((JScrollPane) metawidget.getComponent(5)).getViewport().getView()).getText());
        assertEquals("Password:", ((JLabel) metawidget.getComponent(6)).getText());
        assertTrue(metawidget.getComponent(7) instanceof JPanel);
        assertEquals("Byte Primitive:", ((JLabel) metawidget.getComponent(8)).getText());
        assertEquals("126", ((JLabel) metawidget.getComponent(9)).getText());
        assertEquals("Byte Object:", ((JLabel) metawidget.getComponent(10)).getText());
        assertEquals("-127", ((JLabel) metawidget.getComponent(11)).getText());
        assertEquals("Short Primitive:", ((JLabel) metawidget.getComponent(12)).getText());
        assertEquals("32766", ((JLabel) metawidget.getComponent(13)).getText());
        assertEquals("Short Object:", ((JLabel) metawidget.getComponent(14)).getText());
        assertEquals("-32767", ((JLabel) metawidget.getComponent(15)).getText());
        assertEquals("Int Primitive:", ((JLabel) metawidget.getComponent(16)).getText());
        assertEquals("2147483646", ((JLabel) metawidget.getComponent(17)).getText());
        assertEquals("Integer Object:", ((JLabel) metawidget.getComponent(18)).getText());
        assertEquals("-2147483647", ((JLabel) metawidget.getComponent(19)).getText());
        assertEquals("Ranged Int:", ((JLabel) metawidget.getComponent(20)).getText());
        assertEquals("33", ((JLabel) metawidget.getComponent(21)).getText());
        assertEquals("Ranged Integer:", ((JLabel) metawidget.getComponent(22)).getText());
        assertEquals("34", ((JLabel) metawidget.getComponent(23)).getText());
        assertEquals("Long Primitive:", ((JLabel) metawidget.getComponent(24)).getText());
        assertEquals("43", ((JLabel) metawidget.getComponent(25)).getText());
        assertEquals("44", ((JLabel) metawidget.getComponent(26)).getText());
        assertEquals("Float Primitive:", ((JLabel) metawidget.getComponent(27)).getText());
        assertTrue(((JLabel) metawidget.getComponent(28)).getText().startsWith("4.3")
                || ((JLabel) metawidget.getComponent(28)).getText().startsWith("4.299"));
        assertEquals("nullInBundle:", ((JLabel) metawidget.getComponent(29)).getText());
        assertEquals("5.4", ((JLabel) metawidget.getComponent(30)).getText());
        assertEquals("Double Primitive:", ((JLabel) metawidget.getComponent(31)).getText());
        assertTrue(((JLabel) metawidget.getComponent(32)).getText().startsWith("42.3")
                || ((JLabel) metawidget.getComponent(32)).getText().startsWith("42.299"));
        assertEquals("54.4", ((JLabel) metawidget.getComponent(33)).getText());
        assertEquals("Char Primitive:", ((JLabel) metawidget.getComponent(34)).getText());
        assertEquals("Z", ((JLabel) metawidget.getComponent(35)).getText());
        assertEquals("Character Object:", ((JLabel) metawidget.getComponent(36)).getText());
        assertEquals("A", ((JLabel) metawidget.getComponent(37)).getText());
        assertEquals("Boolean Primitive:", ((JLabel) metawidget.getComponent(38)).getText());
        assertEquals("true", ((JLabel) metawidget.getComponent(39)).getText());
        assertEquals("Boolean Object:", ((JLabel) metawidget.getComponent(40)).getText());
        assertEquals("No", ((JLabel) metawidget.getComponent(41)).getText());
        assertEquals("Dropdown:", ((JLabel) metawidget.getComponent(42)).getText());
        assertEquals("foo1", ((JLabel) metawidget.getComponent(43)).getText());
        assertEquals("Dropdown With Labels:", ((JLabel) metawidget.getComponent(44)).getText());
        assertEquals("Bar #2", ((JLabel) metawidget.getComponent(45)).getText());
        assertEquals("Not Null Dropdown:", ((JLabel) metawidget.getComponent(46)).getText());
        assertEquals("1", ((JLabel) metawidget.getComponent(47)).getText());
        assertEquals("Not Null Object Dropdown:", ((JLabel) metawidget.getComponent(48)).getText());
        assertEquals("foo3", ((JLabel) metawidget.getComponent(49)).getText());
        assertEquals("Nested Widgets:", ((JLabel) metawidget.getComponent(50)).getText());
        assertEquals("Further Nested Widgets:",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(0)).getText());
        assertEquals("Further Nested Widgets:",
                ((JLabel) ((SwingMetawidget) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(1))
                        .getComponent(0)).getText());
        assertEquals("Nested Textbox 1:",
                ((JLabel) ((SwingMetawidget) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(1))
                        .getComponent(2)).getText());
        assertEquals("Nested Textbox 1.1 (further)",
                ((JLabel) ((SwingMetawidget) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(1))
                        .getComponent(3)).getText());
        assertEquals("Nested Textbox 2:",
                ((JLabel) ((SwingMetawidget) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(1))
                        .getComponent(4)).getText());
        assertEquals("Nested Textbox 2.2 (further)",
                ((JLabel) ((SwingMetawidget) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(1))
                        .getComponent(5)).getText());
        assertEquals("Nested Textbox 1:",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(2)).getText());
        assertEquals("Nested Textbox 1.1",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(3)).getText());
        assertEquals("Nested Textbox 2:",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(4)).getText());
        assertEquals("Nested Textbox 2.2",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(51)).getComponent(5)).getText());
        assertEquals("Read Only Nested Widgets:", ((JLabel) metawidget.getComponent(52)).getText());
        assertEquals("Further Nested Widgets:",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(53)).getComponent(0)).getText());
        assertEquals("Nested Textbox 1:",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(53)).getComponent(2)).getText());
        assertEquals("Nested Textbox 1",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(53)).getComponent(3)).getText());
        assertEquals("Nested Textbox 2:",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(53)).getComponent(4)).getText());
        assertEquals("Nested Textbox 2",
                ((JLabel) ((SwingMetawidget) metawidget.getComponent(53)).getComponent(5)).getText());
        assertEquals("Nested Widgets Dont Expand:", ((JLabel) metawidget.getComponent(54)).getText());
        assertEquals("Nested Textbox 1.01, Nested Textbox 2.02", ((JLabel) metawidget.getComponent(55)).getText());
        assertEquals("Read Only Nested Widgets Dont Expand:", ((JLabel) metawidget.getComponent(56)).getText());
        assertEquals("Nested Textbox 1, Nested Textbox 2", ((JLabel) metawidget.getComponent(57)).getText());
        assertEquals("Date:", ((JLabel) metawidget.getComponent(58)).getText());
        assertEquals(now, ((JLabel) metawidget.getComponent(59)).getText());
        assertEquals("Section Break", ((JLabel) ((JPanel) metawidget.getComponent(60)).getComponent(0)).getText());
        assertEquals("Read Only:", ((JLabel) metawidget.getComponent(61)).getText());
        assertEquals("Read Only", ((JLabel) metawidget.getComponent(62)).getText());
        assertEquals("Do Action", ((JButton) metawidget.getComponent(63)).getText());
        assertTrue(!((JButton) metawidget.getComponent(63)).isEnabled());

        assertEquals(metawidget.getComponentCount(), 64);

        // Test Binding.onStartBuild clears the state

        assertTrue(null != metawidget.getClientProperty(processor.getClass()));
        processor.onStartBuild(metawidget);
        assertEquals(null, metawidget.getClientProperty(processor.getClass()));
    }
}