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