1/*
2 * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import java.awt.DisplayMode;
25import java.awt.Frame;
26import java.awt.GraphicsDevice;
27import java.util.ArrayList;
28import java.util.Random;
29
30import static java.awt.DisplayMode.REFRESH_RATE_UNKNOWN;
31
32/**
33 * @test
34 * @key headful
35 * @bug 6430607
36 * @summary Test that we throw an exception for incorrect display modes
37 * @author Dmitri.Trembovetski@Sun.COM area=FullScreen
38 * @run main/othervm NonExistentDisplayModeTest
39 * @run main/othervm -Dsun.java2d.noddraw=true NonExistentDisplayModeTest
40 * @run main/othervm -Dsun.java2d.opengl=true NonExistentDisplayModeTest
41 */
42public class NonExistentDisplayModeTest {
43
44    public static void main(String[] args) {
45        new NonExistentDisplayModeTest().start();
46    }
47
48    private void start() {
49        Frame f = new Frame("Testing, please wait..");
50        f.pack();
51        GraphicsDevice gd = f.getGraphicsConfiguration().getDevice();
52        if (!gd.isFullScreenSupported()) {
53            System.out.println("Exclusive FS mode not supported, test passed.");
54            f.dispose();
55            return;
56        }
57
58        gd.setFullScreenWindow(f);
59        if (!gd.isDisplayChangeSupported()) {
60            System.out.println("DisplayMode change not supported, test passed.");
61            f.dispose();
62            return;
63        }
64
65        DisplayMode dms[] = gd.getDisplayModes();
66        ArrayList<DisplayMode> dmList = new ArrayList<DisplayMode>(dms.length);
67        for (DisplayMode dm : dms) {
68            dmList.add(dm);
69        }
70
71        ArrayList<DisplayMode> nonExistentDms = createNonExistentDMList(dmList);
72
73        for (DisplayMode dm : nonExistentDms) {
74            boolean exThrown = false;
75            try {
76                System.out.printf("Testing mode: (%4dx%4d) depth=%3d rate=%d\n",
77                                  dm.getWidth(), dm.getHeight(),
78                                  dm.getBitDepth(), dm.getRefreshRate());
79                gd.setDisplayMode(dm);
80            } catch (IllegalArgumentException e) {
81                exThrown = true;
82            }
83            if (!exThrown) {
84                gd.setFullScreenWindow(null);
85                f.dispose();
86                throw new
87                    RuntimeException("Failed: No exception thrown for dm "+dm);
88            }
89        }
90        gd.setFullScreenWindow(null);
91        f.dispose();
92        System.out.println("Test passed.");
93    }
94
95    private static final Random rnd = new Random();
96    private ArrayList<DisplayMode>
97        createNonExistentDMList(ArrayList<DisplayMode> dmList)
98    {
99        ArrayList<DisplayMode> newList =
100            new ArrayList<DisplayMode>(dmList.size());
101        // vary one parameter at a time
102        int param = 0;
103        for (DisplayMode dm : dmList) {
104            param = ++param % 3;
105            switch (param) {
106                case 0: {
107                    DisplayMode newDM = deriveSize(dm);
108                    if (!dmList.contains(newDM)) {
109                        newList.add(newDM);
110                    }
111                    break;
112                }
113                case 1: {
114                    DisplayMode newDM = deriveDepth(dm);
115                    if (!dmList.contains(newDM)) {
116                        newList.add(newDM);
117                    }
118                    break;
119                }
120                case 2: {
121                    if (dm.getRefreshRate() != REFRESH_RATE_UNKNOWN) {
122                        DisplayMode newDM = deriveRR(dm);
123                        if (!dmList.contains(newDM)) {
124                            newList.add(newDM);
125                        }
126                    }
127                    break;
128                }
129            }
130        }
131        return newList;
132    }
133
134    private static DisplayMode deriveSize(DisplayMode dm) {
135        int w = dm.getWidth() / 7;
136        int h = dm.getHeight() / 3;
137        return new DisplayMode(w, h, dm.getBitDepth(), dm.getRefreshRate());
138    }
139    private static DisplayMode deriveRR(DisplayMode dm) {
140        return new DisplayMode(dm.getWidth(), dm.getHeight(),
141                               dm.getBitDepth(), 777);
142    }
143    private static DisplayMode deriveDepth(DisplayMode dm) {
144        int depth;
145        if (dm.getBitDepth() == DisplayMode.BIT_DEPTH_MULTI) {
146            depth = 77;
147        } else {
148            depth = DisplayMode.BIT_DEPTH_MULTI;
149        }
150        return new DisplayMode(dm.getWidth(), dm.getHeight(),
151                               depth, dm.getRefreshRate());
152    }
153}
154