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 
  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  * @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  */
  42 public 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 }