| /* | |
| * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code 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 General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| /* | |
| * @test %I% %G% | |
| * @bug 4935607 | |
| * @summary Tests transient properties | |
| * @author Sergey Malenkov | |
| */ | |
| import java.awt.Component; | |
| import java.awt.Dimension; | |
| import java.awt.Point; | |
| import java.awt.Rectangle; | |
| import java.awt.ScrollPane; | |
| import java.awt.geom.RectangularShape; | |
| import java.awt.im.InputContext; | |
| import java.beans.FeatureDescriptor; | |
| import java.beans.Transient; | |
| import java.util.EventListener; | |
| import javax.swing.AbstractButton; | |
| import javax.swing.DefaultListSelectionModel; | |
| import javax.swing.ImageIcon; | |
| import javax.swing.JComboBox; | |
| import javax.swing.JComponent; | |
| import javax.swing.JLabel; | |
| import javax.swing.JList; | |
| import javax.swing.JMenuBar; | |
| import javax.swing.JScrollPane; | |
| import javax.swing.JTabbedPane; | |
| import javax.swing.JViewport; | |
| import javax.swing.table.JTableHeader; | |
| import javax.swing.text.JTextComponent; | |
| public class Test4935607 { | |
| public static void main(String[] args) { | |
| // test all possible cases | |
| test(Null.class); | |
| test(True.class); | |
| test(False.class); | |
| test(NullNull.class); | |
| test(TrueNull.class); | |
| test(FalseNull.class); | |
| test(NullTrue.class); | |
| test(TrueTrue.class); | |
| test(FalseTrue.class); | |
| test(NullFalse.class); | |
| test(TrueFalse.class); | |
| test(FalseFalse.class); | |
| // test transient properties in AWT | |
| test(RectangularShape.class, "frame"); // NON-NLS: getFrame() | |
| test(Rectangle.class, "bounds"); // NON-NLS: getBounds() | |
| test(Dimension.class, "size"); // NON-NLS: getSize() | |
| test(Point.class, "location"); // NON-NLS: getLocation() | |
| test(Component.class, "foreground"); // NON-NLS: getForeground() | |
| test(Component.class, "background"); // NON-NLS: getBackground() | |
| test(Component.class, "font"); // NON-NLS: getFont() | |
| test(Component.class, "visible"); // NON-NLS: getVisible() | |
| test(ScrollPane.class, "scrollPosition"); // NON-NLS: getScrollPosition() | |
| test(InputContext.class, "compositionEnabled"); // NON-NLS: getCompositionEnabled() | |
| // test transient properties in Swing | |
| test(JComponent.class, "minimumSize"); // NON-NLS: getMinimumSize() | |
| test(JComponent.class, "preferredSize"); // NON-NLS: getPreferredSize() | |
| test(JComponent.class, "maximumSize"); // NON-NLS: getMaximumSize() | |
| test(ImageIcon.class, "image"); // NON-NLS: getImage() | |
| test(ImageIcon.class, "imageObserver"); // NON-NLS: getImageObserver() | |
| test(JMenuBar.class, "helpMenu"); // NON-NLS: getHelpMenu() | |
| test(JScrollPane.class, "verticalScrollBar"); // NON-NLS: getVerticalScrollBar() | |
| test(JScrollPane.class, "horizontalScrollBar"); // NON-NLS: getHorizontalScrollBar() | |
| test(JScrollPane.class, "rowHeader"); // NON-NLS: getRowHeader() | |
| test(JScrollPane.class, "columnHeader"); // NON-NLS: getColumnHeader() | |
| test(JViewport.class, "extentSize"); // NON-NLS: getExtentSize() | |
| test(JTableHeader.class, "defaultRenderer"); // NON-NLS: getDefaultRenderer() | |
| test(JList.class, "cellRenderer"); // NON-NLS: getCellRenderer() | |
| test(JList.class, "selectedIndices"); // NON-NLS: getSelectedIndices() | |
| test(DefaultListSelectionModel.class, "leadSelectionIndex"); // NON-NLS: getLeadSelectionIndex() | |
| test(DefaultListSelectionModel.class, "anchorSelectionIndex"); // NON-NLS: getAnchorSelectionIndex() | |
| test(JComboBox.class, "selectedIndex"); // NON-NLS: getSelectedIndex() | |
| test(JTabbedPane.class, "selectedIndex"); // NON-NLS: getSelectedIndex() | |
| test(JTabbedPane.class, "selectedComponent"); // NON-NLS: getSelectedComponent() | |
| test(AbstractButton.class, "disabledIcon"); // NON-NLS: getDisabledIcon() | |
| test(JLabel.class, "disabledIcon"); // NON-NLS: getDisabledIcon() | |
| test(JTextComponent.class, "caret"); // NON-NLS: getCaret() | |
| test(JTextComponent.class, "caretPosition"); // NON-NLS: getCaretPosition() | |
| test(JTextComponent.class, "selectionStart"); // NON-NLS: getSelectionStart() | |
| test(JTextComponent.class, "selectionEnd"); // NON-NLS: getSelectionEnd() | |
| } | |
| private static void test(Class type) { | |
| Object value = getExpectedValue(type); | |
| test(value, BeanUtils.getPropertyDescriptor(type, "property")); // NON-NLS: the property to check | |
| test(value, BeanUtils.getEventSetDescriptor(type, "eventSet")); // NON-NLS: the event set to check | |
| System.out.println(); | |
| } | |
| private static void test(Class type, String property) { | |
| System.out.print(type.getName() + ": "); | |
| test(Boolean.TRUE, BeanUtils.getPropertyDescriptor(type, property)); | |
| } | |
| private static void test(Object expected, FeatureDescriptor fd) { | |
| System.out.println(fd.getName()); | |
| Object actual = fd.getValue("transient"); // NON-NLS: the attribute name | |
| if ((actual == null) ? (expected != null) : !actual.equals(expected)) | |
| throw new Error("expected " + expected + " value, but actual value is " + actual); | |
| } | |
| private static Object getExpectedValue(Class type) { | |
| try { | |
| return type.getField("VALUE").get(type); // NON-NLS: the field name with expected value | |
| } catch (NoSuchFieldException exception) { | |
| return null; | |
| } catch (IllegalAccessException exception) { | |
| throw new Error("unexpected error", exception); | |
| } | |
| } | |
| public static class Null { | |
| public Object getProperty() { | |
| return this; | |
| } | |
| public void setProperty(Object object) { | |
| } | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class True { | |
| public static final Boolean VALUE = Boolean.TRUE; | |
| @Transient | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Transient | |
| public void setProperty(Object object) { | |
| } | |
| @Transient | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Transient | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class False { | |
| public static final Boolean VALUE = Boolean.FALSE; | |
| @Transient(false) | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Transient(false) | |
| public void setProperty(Object object) { | |
| } | |
| @Transient(false) | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Transient(false) | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class NullNull extends Null { | |
| @Override | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class TrueNull extends Null { | |
| public static final Boolean VALUE = Boolean.TRUE; | |
| @Override | |
| @Transient | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| @Transient | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| @Transient | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| @Transient | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class FalseNull extends Null { | |
| public static final Boolean VALUE = Boolean.FALSE; | |
| @Override | |
| @Transient(false) | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| @Transient(false) | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| @Transient(false) | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| @Transient(false) | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class NullTrue extends True { | |
| @Override | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class TrueTrue extends True { | |
| @Override | |
| @Transient | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| @Transient | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| @Transient | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| @Transient | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class FalseTrue extends True { | |
| public static final Boolean VALUE = Boolean.FALSE; | |
| @Override | |
| @Transient(false) | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| @Transient(false) | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| @Transient(false) | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| @Transient(false) | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class NullFalse extends False { | |
| @Override | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class TrueFalse extends False { | |
| public static final Boolean VALUE = Boolean.TRUE; | |
| @Override | |
| @Transient | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| @Transient | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| @Transient | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| @Transient | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static class FalseFalse extends False { | |
| @Override | |
| @Transient(false) | |
| public Object getProperty() { | |
| return this; | |
| } | |
| @Override | |
| @Transient(false) | |
| public void setProperty(Object object) { | |
| } | |
| @Override | |
| @Transient(false) | |
| public void addEventSetListener(EventSetListener listener) { | |
| } | |
| @Override | |
| @Transient(false) | |
| public void removeEventSetListener(EventSetListener listener) { | |
| } | |
| } | |
| public static final class EventSetListener implements EventListener { | |
| } | |
| } |