diff -r 4ebc2e2fb97c -r 71c04702a3d5 test/jdk/java/beans/Introspector/Test4935607.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/jdk/java/beans/Introspector/Test4935607.java Tue Sep 12 19:03:39 2017 +0200 @@ -0,0 +1,404 @@ +/* + * 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 { + } +}