3 import static org.testng.Assert.assertNotNull;
6 import java.util.ArrayList;
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;
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;
25 @Test(singleThreaded = true)
26 public class QuitHandlerTest
28 private static String saveProjectFile = "test-output/tempSaveFile.jvp";
30 private static String saveFastaFile = "test-output/tempSaveFile.fa";
32 @BeforeClass(alwaysRun = true)
33 public void setUpJvOptionPane()
35 JvOptionPane.setInteractiveMode(false);
36 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
37 Jalview2XML.setDebugDelaySave(3);
41 * @throws java.lang.Exception
43 @BeforeClass(alwaysRun = true)
44 public static void setUpBeforeClass() throws Exception
46 Cache.loadProperties("test/jalview/gui/quitProps.jvprops");
49 * set news feed last read to a future time to ensure no
50 * 'unread' news item is displayed
52 Date oneHourFromNow = new Date(
53 System.currentTimeMillis() + 3600 * 1000);
54 Cache.setDateProperty("JALVIEW_NEWS_RSS_LASTMODIFIED", oneHourFromNow);
58 { "-nowebservicediscovery", "-nosplash", "-nonews" });
61 @AfterClass(alwaysRun = true)
62 public static void resetProps()
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);
71 Jalview2XML.setDebugDelaySave(20);
74 @BeforeMethod(alwaysRun = true)
75 public static void tearDownAfterClass() throws Exception
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);
84 Cache.setProperty("DEBUG_DELAY_SAVE", "false");
85 Jalview2XML.setDebugDelaySave(3);
88 @AfterMethod(alwaysRun = true)
89 public static void cleanup()
92 List<String> files = new ArrayList<>();
93 files.add(saveProjectFile);
94 files.add(saveFastaFile);
95 for (String filename : files)
97 File file = new File(filename);
105 @Test(groups = { "Functional" }, singleThreaded = true, priority = 1)
106 public void testInstantQuit() throws Exception
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);
113 long start = System.currentTimeMillis();
115 // if a save is attempted it will delay 3s
116 Cache.setProperty("DEBUG_DELAY_SAVE", "true");
118 // loaded file but haven't done anything, should just quit
119 QResponse response = QuitHandler.getQuitResponse(true);
120 long end = System.currentTimeMillis();
122 Assert.assertEquals(response, QResponse.QUIT);
123 Assert.assertTrue(end - start < 1000,
124 "Quit-with-no-save-needed took too long (" + (end - start)
126 Desktop.instance.closeAll_actionPerformed(null);
129 @Test(groups = { "Functional" }, singleThreaded = true, priority = 10)
130 public void testWaitForSaveQuit() throws Exception
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);
137 long start = System.currentTimeMillis();
139 // start a long save (3s)
140 Cache.setProperty("DEBUG_DELAY_SAVE", "true");
141 af.saveAlignment(saveProjectFile, FileFormat.Jalview);
143 QResponse response = QuitHandler.getQuitResponse(true,
144 QuitHandler.defaultOkQuit, () -> {
145 // set FORCE_QUIT without the force quit
146 QuitHandler.setResponse(QResponse.FORCE_QUIT);
148 }, QuitHandler.defaultCancelQuit);
149 long end = System.currentTimeMillis();
151 Assert.assertEquals(response, QResponse.QUIT);
152 Assert.assertTrue(end - start > 2900,
153 "Quit-whilst-saving was too short (" + (end - start) + "ms)");
155 Desktop.instance.closeAll_actionPerformed(null);
158 @Test(groups = { "Functional" }, singleThreaded = true, priority = 9)
159 public void testSavedProjectChanges() throws Exception
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);
170 // no hanging around needed here
171 Cache.setProperty("DEBUG_DELAY_SAVE", "false");
172 af.saveAlignment(saveProjectFile, FileFormat.Jalview);
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);
181 }, QuitHandler.defaultCancelQuit);
183 // if not saved this would be CANCEL_QUIT
184 Assert.assertEquals(response, QResponse.QUIT);
185 Desktop.instance.closeAll_actionPerformed(null);
188 @Test(groups = { "Functional" }, singleThreaded = true, priority = 9)
189 public void testSavedAlignmentChanges() throws Exception
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);
200 // no hanging around needed here
201 Cache.setProperty("DEBUG_DELAY_SAVE", "false");
202 af.saveAlignment(saveFastaFile, FileFormat.Fasta);
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);
211 }, QuitHandler.defaultCancelQuit);
213 // if not saved this would be CANCEL_QUIT
214 Assert.assertEquals(response, QResponse.QUIT);
215 Desktop.instance.closeAll_actionPerformed(null);
218 @Test(groups = { "Functional" }, singleThreaded = true, priority = 1)
219 public void testUnsavedChanges() throws Exception
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);
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);
237 }, QuitHandler.defaultCancelQuit);
239 Assert.assertEquals(response, QResponse.CANCEL_QUIT);
240 Desktop.instance.closeAll_actionPerformed(null);
243 @Test(groups = { "Functional" }, singleThreaded = true, priority = 1)
244 public void testNoGUIUnsavedChanges() throws Exception
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);
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);
262 }, QuitHandler.defaultCancelQuit);
264 Assert.assertEquals(response, QResponse.QUIT);
265 Desktop.instance.closeAll_actionPerformed(null);