1 /*
2  * Copyright (c) 2006, 2015, 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 
24 import java.awt.DisplayMode;
25 import java.awt.Frame;
26 import java.awt.GraphicsDevice;
27 import java.util.ArrayList;
28 import java.util.Random;
29 
30 import static java.awt.DisplayMode.REFRESH_RATE_UNKNOWN;
31 
32 /**
33  * @test
34  * @bug 6430607
35  * @summary Test that we throw an exception for incorrect display modes
36  * @author Dmitri.Trembovetski@Sun.COM area=FullScreen
37  * @run main/othervm NonExistentDisplayModeTest
38  * @run main/othervm -Dsun.java2d.noddraw=true NonExistentDisplayModeTest
39  * @run main/othervm -Dsun.java2d.opengl=true NonExistentDisplayModeTest
40  */
41 public class NonExistentDisplayModeTest {
42 
main(String[] args)43     public static void main(String[] args) {
44         new NonExistentDisplayModeTest().start();
45     }
46 
start()47     private void start() {
48         Frame f = new Frame("Testing, please wait..");
49         f.pack();
50         GraphicsDevice gd = f.getGraphicsConfiguration().getDevice();
51         if (!gd.isFullScreenSupported()) {
52             System.out.println("Exclusive FS mode not supported, test passed.");
53             f.dispose();
54             return;
55         }
56 
57         gd.setFullScreenWindow(f);
58         if (!gd.isDisplayChangeSupported()) {
59             System.out.println("DisplayMode change not supported, test passed.");
60             f.dispose();
61             return;
62         }
63 
64         DisplayMode dms[] = gd.getDisplayModes();
65         ArrayList<DisplayMode> dmList = new ArrayList<DisplayMode>(dms.length);
66         for (DisplayMode dm : dms) {
67             dmList.add(dm);
68         }
69 
70         ArrayList<DisplayMode> nonExistentDms = createNonExistentDMList(dmList);
71 
72         for (DisplayMode dm : nonExistentDms) {
73             boolean exThrown = false;
74             try {
75                 System.out.printf("Testing mode: (%4dx%4d) depth=%3d rate=%d\n",
76                                   dm.getWidth(), dm.getHeight(),
77                                   dm.getBitDepth(), dm.getRefreshRate());
78                 gd.setDisplayMode(dm);
79             } catch (IllegalArgumentException e) {
80                 exThrown = true;
81             }
82             if (!exThrown) {
83                 gd.setFullScreenWindow(null);
84                 f.dispose();
85                 throw new
86                     RuntimeException("Failed: No exception thrown for dm "+dm);
87             }
88         }
89         gd.setFullScreenWindow(null);
90         f.dispose();
91         System.out.println("Test passed.");
92     }
93 
94     private static final Random rnd = new Random();
95     private ArrayList<DisplayMode>
createNonExistentDMList(ArrayList<DisplayMode> dmList)96         createNonExistentDMList(ArrayList<DisplayMode> dmList)
97     {
98         ArrayList<DisplayMode> newList =
99             new ArrayList<DisplayMode>(dmList.size());
100         // vary one parameter at a time
101         int param = 0;
102         for (DisplayMode dm : dmList) {
103             param = ++param % 3;
104             switch (param) {
105                 case 0: {
106                     DisplayMode newDM = deriveSize(dm);
107                     if (!dmList.contains(newDM)) {
108                         newList.add(newDM);
109                     }
110                     break;
111                 }
112                 case 1: {
113                     DisplayMode newDM = deriveDepth(dm);
114                     if (!dmList.contains(newDM)) {
115                         newList.add(newDM);
116                     }
117                     break;
118                 }
119                 case 2: {
120                     if (dm.getRefreshRate() != REFRESH_RATE_UNKNOWN) {
121                         DisplayMode newDM = deriveRR(dm);
122                         if (!dmList.contains(newDM)) {
123                             newList.add(newDM);
124                         }
125                     }
126                     break;
127                 }
128             }
129         }
130         return newList;
131     }
132 
deriveSize(DisplayMode dm)133     private static DisplayMode deriveSize(DisplayMode dm) {
134         int w = dm.getWidth() / 7;
135         int h = dm.getHeight() / 3;
136         return new DisplayMode(w, h, dm.getBitDepth(), dm.getRefreshRate());
137     }
deriveRR(DisplayMode dm)138     private static DisplayMode deriveRR(DisplayMode dm) {
139         return new DisplayMode(dm.getWidth(), dm.getHeight(),
140                                dm.getBitDepth(), 777);
141     }
deriveDepth(DisplayMode dm)142     private static DisplayMode deriveDepth(DisplayMode dm) {
143         int depth;
144         if (dm.getBitDepth() == DisplayMode.BIT_DEPTH_MULTI) {
145             depth = 77;
146         } else {
147             depth = DisplayMode.BIT_DEPTH_MULTI;
148         }
149         return new DisplayMode(dm.getWidth(), dm.getHeight(),
150                                depth, dm.getRefreshRate());
151     }
152 }
153