JAL-1988 JAL-3772 Tests for various quitting scenarios
[jalview.git] / test / jalview / gui / QuitHandlerTest.java
1 package jalview.gui;
2
3 import static org.testng.Assert.assertNotNull;
4
5 import java.io.File;
6 import java.util.ArrayList;
7 import java.util.Date;
8 import java.util.List;
9
10 import org.testng.Assert;
11 import org.testng.annotations.AfterClass;
12 import org.testng.annotations.AfterMethod;
13 import org.testng.annotations.BeforeClass;
14 import org.testng.annotations.BeforeMethod;
15 import org.testng.annotations.Test;
16
17 import jalview.bin.Cache;
18 import jalview.bin.Jalview;
19 import jalview.gui.QuitHandler.QResponse;
20 import jalview.io.DataSourceType;
21 import jalview.io.FileFormat;
22 import jalview.io.FileLoader;
23 import jalview.project.Jalview2XML;
24
25 @Test(singleThreaded = true)
26 public class QuitHandlerTest
27 {
28   private static String saveProjectFile = "test-output/tempSaveFile.jvp";
29
30   private static String saveFastaFile = "test-output/tempSaveFile.fa";
31
32   @BeforeClass(alwaysRun = true)
33   public void setUpJvOptionPane()
34   {
35     JvOptionPane.setInteractiveMode(false);
36     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
37     Jalview2XML.setDebugDelaySave(3);
38   }
39
40   /**
41    * @throws java.lang.Exception
42    */
43   @BeforeClass(alwaysRun = true)
44   public static void setUpBeforeClass() throws Exception
45   {
46     Cache.loadProperties("test/jalview/gui/quitProps.jvprops");
47
48     /*
49      * set news feed last read to a future time to ensure no
50      * 'unread' news item is displayed
51      */
52     Date oneHourFromNow = new Date(
53             System.currentTimeMillis() + 3600 * 1000);
54     Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", oneHourFromNow);
55
56     Jalview.main(
57             new String[]
58             { "-nowebservicediscovery", "-nosplash", "-nonews" });
59   }
60
61   @AfterClass(alwaysRun = true)
62   public static void resetProps()
63   {
64     // reset quit response
65     QuitHandler.setResponse(QResponse.NULL);
66     // reset mock response
67     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
68     // close desktop windows/frames
69     jalview.gui.Desktop.instance.closeAll_actionPerformed(null);
70     // reset debug delay
71     Jalview2XML.setDebugDelaySave(20);
72   }
73
74   @BeforeMethod(alwaysRun = true)
75   public static void tearDownAfterClass() throws Exception
76   {
77     // reset quit response
78     QuitHandler.setResponse(QResponse.NULL);
79     // reset mock response
80     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
81     // close desktop windows/frames
82     jalview.gui.Desktop.instance.closeAll_actionPerformed(null);
83     // reset debug delay
84     Cache.setProperty("DEBUG_DELAY_SAVE", "false");
85     Jalview2XML.setDebugDelaySave(3);
86   }
87
88   @AfterMethod(alwaysRun = true)
89   public static void cleanup()
90   {
91     // delete save files
92     List<String> files = new ArrayList<>();
93     files.add(saveProjectFile);
94     files.add(saveFastaFile);
95     for (String filename : files)
96     {
97       File file = new File(filename);
98       if (file.exists())
99       {
100         file.delete();
101       }
102     }
103   }
104
105   @Test(groups = { "Functional" }, singleThreaded = true, priority = 1)
106   public void testInstantQuit() throws Exception
107   {
108     String inFile = "examples/uniref50.fa";
109     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile,
110             DataSourceType.FILE);
111     assertNotNull(af, "Didn't read input file " + inFile);
112
113     long start = System.currentTimeMillis();
114
115     // if a save is attempted it will delay 3s
116     Cache.setProperty("DEBUG_DELAY_SAVE", "true");
117
118     // loaded file but haven't done anything, should just quit
119     QResponse response = QuitHandler.getQuitResponse(true);
120     long end = System.currentTimeMillis();
121
122     Assert.assertEquals(response, QResponse.QUIT);
123     Assert.assertTrue(end - start < 1000,
124             "Quit-with-no-save-needed took too long (" + (end - start)
125                     + "ms)");
126     Desktop.instance.closeAll_actionPerformed(null);
127   }
128
129   @Test(groups = { "Functional" }, singleThreaded = true, priority = 10)
130   public void testWaitForSaveQuit() throws Exception
131   {
132     String inFile = "examples/uniref50.fa";
133     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile,
134             DataSourceType.FILE);
135     assertNotNull(af, "Didn't read input file " + inFile);
136
137     long start = System.currentTimeMillis();
138
139     // start a long save (3s)
140     Cache.setProperty("DEBUG_DELAY_SAVE", "true");
141     af.saveAlignment(saveProjectFile, FileFormat.Jalview);
142
143     QResponse response = QuitHandler.getQuitResponse(true,
144             QuitHandler.defaultOkQuit, () -> {
145               // set FORCE_QUIT without the force quit
146               QuitHandler.setResponse(QResponse.FORCE_QUIT);
147               return null;
148             }, QuitHandler.defaultCancelQuit);
149     long end = System.currentTimeMillis();
150
151     Assert.assertEquals(response, QResponse.QUIT);
152     Assert.assertTrue(end - start > 2900,
153             "Quit-whilst-saving was too short (" + (end - start) + "ms)");
154
155     Desktop.instance.closeAll_actionPerformed(null);
156   }
157
158   @Test(groups = { "Functional" }, singleThreaded = true, priority = 9)
159   public void testSavedProjectChanges() throws Exception
160   {
161     String inFile = "examples/uniref50.fa";
162     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile,
163             DataSourceType.FILE);
164     assertNotNull(af, "Didn't read input file " + inFile);
165     AlignViewport viewport = af.getViewport();
166     // pretend something has happened
167     viewport.setSavedUpToDate(false);
168     Jalview2XML.setStateSavedUpToDate(false);
169
170     // no hanging around needed here
171     Cache.setProperty("DEBUG_DELAY_SAVE", "false");
172     af.saveAlignment(saveProjectFile, FileFormat.Jalview);
173
174     // this is only a two button dialog [Quit] [Cancel] so use NO_OPTION
175     JvOptionPane.setMockResponse(JvOptionPane.NO_OPTION);
176     QResponse response = QuitHandler.getQuitResponse(true,
177             QuitHandler.defaultOkQuit, () -> {
178               // set FORCE_QUIT without the force quit
179               QuitHandler.setResponse(QResponse.FORCE_QUIT);
180               return null;
181             }, QuitHandler.defaultCancelQuit);
182
183     // if not saved this would be CANCEL_QUIT
184     Assert.assertEquals(response, QResponse.QUIT);
185     Desktop.instance.closeAll_actionPerformed(null);
186   }
187
188   @Test(groups = { "Functional" }, singleThreaded = true, priority = 9)
189   public void testSavedAlignmentChanges() throws Exception
190   {
191     String inFile = "examples/uniref50.fa";
192     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile,
193             DataSourceType.FILE);
194     assertNotNull(af, "Didn't read input file " + inFile);
195     AlignViewport viewport = af.getViewport();
196     // pretend something has happened
197     viewport.setSavedUpToDate(false);
198     Jalview2XML.setStateSavedUpToDate(false);
199
200     // no hanging around needed here
201     Cache.setProperty("DEBUG_DELAY_SAVE", "false");
202     af.saveAlignment(saveFastaFile, FileFormat.Fasta);
203
204     // this is only a two button dialog [Quit] [Cancel] so use NO_OPTION
205     JvOptionPane.setMockResponse(JvOptionPane.NO_OPTION);
206     QResponse response = QuitHandler.getQuitResponse(true,
207             QuitHandler.defaultOkQuit, () -> {
208               // set FORCE_QUIT without the force quit
209               QuitHandler.setResponse(QResponse.FORCE_QUIT);
210               return null;
211             }, QuitHandler.defaultCancelQuit);
212
213     // if not saved this would be CANCEL_QUIT
214     Assert.assertEquals(response, QResponse.QUIT);
215     Desktop.instance.closeAll_actionPerformed(null);
216   }
217
218   @Test(groups = { "Functional" }, singleThreaded = true, priority = 1)
219   public void testUnsavedChanges() throws Exception
220   {
221     String inFile = "examples/uniref50.fa";
222     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile,
223             DataSourceType.FILE);
224     assertNotNull(af, "Didn't read input file " + inFile);
225     AlignViewport viewport = af.getViewport();
226     // pretend something has happened
227     viewport.setSavedUpToDate(false);
228     Jalview2XML.setStateSavedUpToDate(false);
229
230     // this is only a two button dialog [Quit] [Cancel] so use NO_OPTION
231     JvOptionPane.setMockResponse(JvOptionPane.NO_OPTION);
232     QResponse response = QuitHandler.getQuitResponse(true,
233             QuitHandler.defaultOkQuit, () -> {
234               // set FORCE_QUIT without the force quit
235               QuitHandler.setResponse(QResponse.FORCE_QUIT);
236               return null;
237             }, QuitHandler.defaultCancelQuit);
238
239     Assert.assertEquals(response, QResponse.CANCEL_QUIT);
240     Desktop.instance.closeAll_actionPerformed(null);
241   }
242
243   @Test(groups = { "Functional" }, singleThreaded = true, priority = 1)
244   public void testNoGUIUnsavedChanges() throws Exception
245   {
246     String inFile = "examples/uniref50.fa";
247     AlignFrame af = new FileLoader().LoadFileWaitTillLoaded(inFile,
248             DataSourceType.FILE);
249     assertNotNull(af, "Didn't read input file " + inFile);
250     AlignViewport viewport = af.getViewport();
251     // pretend something has happened
252     viewport.setSavedUpToDate(false);
253     Jalview2XML.setStateSavedUpToDate(false);
254
255     // this is only a two button dialog [Quit] [Cancel] so use NO_OPTION
256     JvOptionPane.setMockResponse(JvOptionPane.NO_OPTION);
257     QResponse response = QuitHandler.getQuitResponse(false,
258             QuitHandler.defaultOkQuit, () -> {
259               // set FORCE_QUIT without the force quit
260               QuitHandler.setResponse(QResponse.FORCE_QUIT);
261               return null;
262             }, QuitHandler.defaultCancelQuit);
263
264     Assert.assertEquals(response, QResponse.QUIT);
265     Desktop.instance.closeAll_actionPerformed(null);
266   }
267
268 }