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