bug4697612.java revision 11111:4ef86895869c
1229159Sadrian/*
2229159Sadrian * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
3229159Sadrian * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4229159Sadrian *
5229159Sadrian * This code is free software; you can redistribute it and/or modify it
6229159Sadrian * under the terms of the GNU General Public License version 2 only, as
7229159Sadrian * published by the Free Software Foundation.
8229159Sadrian *
9229159Sadrian * This code is distributed in the hope that it will be useful, but WITHOUT
10229159Sadrian * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11229159Sadrian * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12229159Sadrian * version 2 for more details (a copy is included in the LICENSE file that
13229159Sadrian * accompanied this code).
14229159Sadrian *
15229159Sadrian * You should have received a copy of the GNU General Public License version
16229159Sadrian * 2 along with this work; if not, write to the Free Software Foundation,
17229159Sadrian * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18229159Sadrian *
19229159Sadrian * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20229159Sadrian * or visit www.oracle.com if you need additional information or have any
21229159Sadrian * questions.
22229159Sadrian */
23229159Sadrian
24229159Sadrian/*
25229159Sadrian * @test
26229159Sadrian * @bug 4697612 6244705
27229159Sadrian * @author Peter Zhelezniakov
28229159Sadrian * @library ../../regtesthelpers
29229159Sadrian * @build Util
30229159Sadrian * @run main bug4697612
31229159Sadrian */
32229159Sadrianimport java.io.*;
33229159Sadrianimport java.awt.*;
34229159Sadrianimport java.awt.event.*;
35229159Sadrianimport javax.swing.*;
36229159Sadrian
37229159Sadrianimport javax.swing.text.BadLocationException;
38229159Sadrian
39229159Sadrianpublic class bug4697612 {
40229159Sadrian
41229159Sadrian    static final int FRAME_WIDTH = 300;
42229159Sadrian    static final int FRAME_HEIGHT = 300;
43229159Sadrian    static final int FONT_HEIGHT = 16;
44229159Sadrian    private static volatile int frameHeight;
45229159Sadrian    private static volatile int fontHeight;
46229159Sadrian    private static JFrame frame;
47229159Sadrian    private static JTextArea text;
48229159Sadrian    private static JScrollPane scroller;
49229159Sadrian
50229159Sadrian    public static void main(String[] args) throws Throwable {
51229159Sadrian        Robot robot = new Robot();
52229159Sadrian        robot.setAutoDelay(100);
53229159Sadrian
54229159Sadrian        SwingUtilities.invokeAndWait(new Runnable() {
55229159Sadrian
56229159Sadrian            @Override
57229159Sadrian            public void run() {
58229159Sadrian                createAndShowGUI();
59229159Sadrian            }
60229159Sadrian        });
61229159Sadrian
62229159Sadrian        robot.waitForIdle();
63229159Sadrian
64229159Sadrian        SwingUtilities.invokeAndWait(new Runnable() {
65229159Sadrian
66229159Sadrian            @Override
67229159Sadrian            public void run() {
68229159Sadrian                text.requestFocus();
69229159Sadrian            }
70229159Sadrian        });
71229159Sadrian
72229159Sadrian        robot.waitForIdle();
73229159Sadrian
74229159Sadrian        // 4697612: pressing PgDn + PgUp should not alter caret position
75229159Sadrian        Util.hitKeys(robot, KeyEvent.VK_HOME);
76229159Sadrian        Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
77229159Sadrian
78229159Sadrian
79229159Sadrian        int pos0 = getTextCaretPosition();
80229159Sadrian        int caretHeight = getTextCaretHeight();
81229159Sadrian        fontHeight = FONT_HEIGHT;
82229159Sadrian
83229159Sadrian        // iterate two times, for different (even and odd) font height
84229159Sadrian        for (int i = 0; i < 2; i++) {
85229159Sadrian
86229159Sadrian            SwingUtilities.invokeAndWait(new Runnable() {
87229159Sadrian
88229159Sadrian                public void run() {
89229159Sadrian                    text.setFont(text.getFont().deriveFont(fontHeight));
90229159Sadrian                }
91229159Sadrian            });
92229159Sadrian
93229159Sadrian            frameHeight = FRAME_HEIGHT;
94229159Sadrian
95229159Sadrian            for (int j = 0; j < caretHeight; j++) {
96229159Sadrian                SwingUtilities.invokeAndWait(new Runnable() {
97229159Sadrian
98229159Sadrian                    public void run() {
99229159Sadrian                        frame.setSize(FRAME_WIDTH, frameHeight);
100229159Sadrian                    }
101229159Sadrian                });
102229159Sadrian
103229159Sadrian                robot.waitForIdle();
104229159Sadrian
105229159Sadrian                Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
106229159Sadrian                Util.hitKeys(robot, KeyEvent.VK_PAGE_UP);
107229159Sadrian                robot.waitForIdle();
108229159Sadrian
109229159Sadrian                int pos = getTextCaretPosition();
110                if (pos0 != pos) {
111                    throw new RuntimeException("Failed 4697612: PgDn & PgUp keys scroll by different amounts");
112                }
113                frameHeight++;
114            }
115            fontHeight++;
116        }
117
118
119        // 6244705: pressing PgDn at the very bottom should not scroll
120        LookAndFeel laf = UIManager.getLookAndFeel();
121        if (laf.getID().equals("Aqua")) {
122            Util.hitKeys(robot, KeyEvent.VK_END);
123        } else {
124            Util.hitKeys(robot, KeyEvent.VK_CONTROL, KeyEvent.VK_END);
125        }
126
127        robot.waitForIdle();
128
129        pos0 = getScrollerViewPosition();
130        Util.hitKeys(robot, KeyEvent.VK_PAGE_DOWN);
131        robot.waitForIdle();
132
133        int pos = getScrollerViewPosition();
134
135        if (pos0 != pos) {
136            throw new RuntimeException("Failed 6244705: PgDn at the bottom causes scrolling");
137        }
138    }
139
140    private static int getTextCaretPosition() throws Exception {
141        final int[] result = new int[1];
142        SwingUtilities.invokeAndWait(new Runnable() {
143
144            @Override
145            public void run() {
146                result[0] = text.getCaretPosition();
147            }
148        });
149
150        return result[0];
151    }
152
153    private static int getTextCaretHeight() throws Exception {
154        final int[] result = new int[1];
155        SwingUtilities.invokeAndWait(new Runnable() {
156
157            @Override
158            public void run() {
159                try {
160                    int pos0 = text.getCaretPosition();
161                    Rectangle dotBounds = text.modelToView(pos0);
162                    result[0] = dotBounds.height;
163                } catch (BadLocationException ex) {
164                    throw new RuntimeException(ex);
165                }
166            }
167        });
168
169        return result[0];
170    }
171
172    private static int getScrollerViewPosition() throws Exception {
173        final int[] result = new int[1];
174        SwingUtilities.invokeAndWait(new Runnable() {
175
176            @Override
177            public void run() {
178                result[0] = scroller.getViewport().getViewPosition().y;
179            }
180        });
181
182        return result[0];
183    }
184
185    private static void createAndShowGUI() {
186        frame = new JFrame();
187        frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
188        frame.setPreferredSize(new Dimension(FRAME_WIDTH, FRAME_HEIGHT));
189        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
190
191        text = new JTextArea();
192        try {
193            InputStream is =
194                    bug4697612.class.getResourceAsStream("bug4697612.txt");
195            text.read(new InputStreamReader(is), null);
196        } catch (IOException e) {
197            throw new Error(e);
198        }
199
200        scroller = new JScrollPane(text);
201
202        frame.getContentPane().add(scroller);
203
204        frame.pack();
205        frame.setVisible(true);
206    }
207}
208