1 33 34 package edu.rice.cs.drjava.model; 35 36 import javax.swing.text.BadLocationException ; 37 import java.io.File ; 38 import java.io.IOException ; 39 40 import java.util.Arrays ; 41 42 import edu.rice.cs.util.FileOpenSelector; 43 import edu.rice.cs.util.Log; 44 import edu.rice.cs.util.OperationCanceledException; 45 import edu.rice.cs.util.StringOps; 46 import edu.rice.cs.util.swing.Utilities; 47 48 51 public class SingleDisplayModelTest extends GlobalModelTestCase { 52 53 55 private Object _readyLock = new Object (); 57 58 private DefaultGlobalModel getSDModel() { return _model; } 59 60 protected void assertNotEmpty() { 61 assertTrue("number of documents", getSDModel().getOpenDefinitionsDocuments().size() > 0); 62 } 63 64 protected void assertActiveDocument(OpenDefinitionsDocument doc) { 65 assertEquals("active document", doc, getSDModel().getActiveDocument()); 66 } 67 68 72 protected OpenDefinitionsDocument setupDocument(String text) throws BadLocationException { 73 74 assertNotEmpty(); 75 SDTestListener listener = new SDTestListener() { 76 public synchronized void newFileCreated(OpenDefinitionsDocument doc) { newCount++; } 77 public synchronized void activeDocumentChanged(OpenDefinitionsDocument doc) { switchCount++; } 78 }; 79 80 getSDModel().addListener(listener); 81 82 listener.assertSwitchCount(0); 83 84 int numOpen = getSDModel().getOpenDefinitionsDocuments().size(); 86 OpenDefinitionsDocument doc = getSDModel().newFile(); 87 assertNumOpenDocs(numOpen + 1); 88 89 listener.assertNewCount(1); 90 listener.assertSwitchCount(1); 91 assertLength(0, doc); 92 assertModified(false, doc); 93 94 changeDocumentText(text, doc); getSDModel().removeListener(listener); 96 97 _log.log("New File " + doc + " created"); 98 99 return doc; 100 } 101 102 103 public void testNotEmptyOnStartup() throws BadLocationException { 104 assertNumOpenDocs(1); 106 OpenDefinitionsDocument doc = getSDModel().getActiveDocument(); 107 assertModified(false, doc); 108 assertLength(0, doc); 109 _log.log("testNotEmptyOnStartup completed"); 110 } 111 112 113 public void testDocumentSwitching() throws BadLocationException { 114 SDTestListener listener = new SDTestListener() { 116 public synchronized void newFileCreated(OpenDefinitionsDocument doc) { newCount++; } 117 public synchronized void activeDocumentChanged(OpenDefinitionsDocument doc) { switchCount++; } 118 }; 119 getSDModel().addListener(listener); 120 121 OpenDefinitionsDocument doc3 = getSDModel().getActiveDocument(); 123 changeDocumentText(FOO_TEXT, doc3); 124 listener.assertSwitchCount(0); 125 126 OpenDefinitionsDocument doc2 = setupDocument(BAR_TEXT); 128 assertNumOpenDocs(2); 129 listener.assertNewCount(1); 130 listener.assertSwitchCount(1); 131 assertActiveDocument(doc2); 132 133 OpenDefinitionsDocument doc1 = setupDocument(BAZ_TEXT); 134 assertNumOpenDocs(3); 135 listener.assertNewCount(2); 136 listener.assertSwitchCount(2); 137 assertActiveDocument(doc1); 138 139 getSDModel().setActivePreviousDocument(); 141 listener.assertSwitchCount(3); 142 assertActiveDocument(doc3); 143 144 getSDModel().setActiveNextDocument(); 146 listener.assertSwitchCount(4); 147 assertActiveDocument(doc1); 148 149 getSDModel().setActiveNextDocument(); 151 listener.assertSwitchCount(5); 152 assertActiveDocument(doc2); 153 154 getSDModel().setActiveNextDocument(); 155 listener.assertSwitchCount(6); 156 assertActiveDocument(doc3); 157 158 getSDModel().setActiveNextDocument(); 160 listener.assertSwitchCount(7); 161 assertActiveDocument(doc1); 162 163 getSDModel().setActivePreviousDocument(); 165 listener.assertSwitchCount(8); 166 assertActiveDocument(doc3); 167 168 getSDModel().setActiveDocument(doc1); 170 listener.assertSwitchCount(9); 171 assertActiveDocument(doc1); 172 173 assertNumOpenDocs(3); 175 getSDModel().removeListener(listener); 176 _log.log("testDocumentSwitching completed"); 177 } 178 179 182 public void testCloseUnmodifiedAutomatically() throws BadLocationException , IOException , 183 OperationCanceledException, AlreadyOpenException { 184 185 assertNumOpenDocs(1); OpenDefinitionsDocument doc = getSDModel().getActiveDocument(); 187 assertModified(false, doc); 188 assertLength(0, doc); 189 190 final File tempFile = writeToNewTempFile(BAR_TEXT); 191 192 SDTestListener listener = new SDTestListener() { 194 public void fileOpened(OpenDefinitionsDocument doc) { 195 File file = null; 196 try { file = doc.getFile(); } 197 catch (FileMovedException fme) { 198 fail("file does not exist"); 200 } 201 try { 202 assertEquals("file to open", tempFile.getCanonicalFile(), file.getCanonicalFile()); 203 synchronized(this) { openCount++; } 204 } 205 catch (IOException ioe) { fail("could not get canonical file"); } 206 } 207 public synchronized void fileClosed(OpenDefinitionsDocument doc) { closeCount++; } 208 public synchronized void activeDocumentChanged(OpenDefinitionsDocument doc) { switchCount++; } 209 }; 210 getSDModel().addListener(listener); 211 212 doc = getSDModel().openFile(new FileSelector(tempFile)); 214 listener.assertOpenCount(1); 215 listener.assertCloseCount(1); 216 listener.assertSwitchCount(1); 217 assertNumOpenDocs(1); 218 assertModified(false, doc); 219 assertContents(BAR_TEXT, doc); 220 getSDModel().removeListener(listener); 221 _log.log("testCloseUnmodifiedAutomatically completed"); 222 } 223 224 225 public void testCloseFiles() throws BadLocationException { 226 SDTestListener listener = new SDTestListener() { 228 public synchronized boolean canAbandonFile(OpenDefinitionsDocument doc) { 229 canAbandonCount++; 230 return true; } 232 public synchronized void newFileCreated(OpenDefinitionsDocument doc) { newCount++; } 233 public synchronized void fileClosed(OpenDefinitionsDocument doc) { closeCount++; } 234 public synchronized void activeDocumentChanged(OpenDefinitionsDocument doc) { switchCount++; } 235 public synchronized void interpreterReady(File wd) { interpreterReadyCount++; 239 synchronized(_readyLock) { _readyLock.notify(); } 240 } 241 }; 242 243 _model.addListener(listener); 244 245 OpenDefinitionsDocument doc1 = _model.getActiveDocument(); 247 changeDocumentText(FOO_TEXT, doc1); 248 OpenDefinitionsDocument doc2 = setupDocument(BAR_TEXT); 249 assertActiveDocument(doc2); 250 assertNumOpenDocs(2); 251 listener.assertNewCount(1); 252 listener.assertSwitchCount(1); 253 254 _model.closeFile(_model.getActiveDocument()); 256 assertNumOpenDocs(1); 257 listener.assertCloseCount(1); 258 listener.assertAbandonCount(1); 259 listener.assertSwitchCount(2); 260 assertActiveDocument(doc1); 261 assertContents(FOO_TEXT, _model.getActiveDocument()); 262 263 _model.closeFile(_model.getActiveDocument()); 265 listener.assertCloseCount(2); 266 listener.assertAbandonCount(2); 267 268 assertNumOpenDocs(1); 270 listener.assertNewCount(2); 271 listener.assertSwitchCount(3); 272 assertLength(0, _model.getActiveDocument()); 273 274 _log.log("Starting second phase of testCloseFiles"); 275 276 doc1 = _model.getActiveDocument(); 278 changeDocumentText(FOO_TEXT, doc1); 279 doc2 = setupDocument(BAR_TEXT); 280 assertNumOpenDocs(2); 281 listener.assertNewCount(3); 282 283 _log.log("Just before calling _model.closeAllFiles()"); 284 285 _model.closeAllFiles(); 287 Utilities.clearEventQueue(); 288 assertNumOpenDocs(1); 289 assertLength(0, _model.getActiveDocument()); 290 291 try { 293 synchronized(_readyLock) { 294 if (listener.getInterpreterReadyCount() == 0) _readyLock.wait(10000); } 296 } 297 catch(InterruptedException e) { fail("Wait for interpreterReady event was interrupted by " + e); } 298 listener.assertInterpreterReadyCount(1); 299 listener.assertNewCount(4); 300 listener.assertCloseCount(4); 301 listener.assertAbandonCount(4); 302 303 _model.removeListener(listener); 304 } 306 307 308 public void testCompleteFilename() throws BadLocationException , IOException , OperationCanceledException, 309 AlreadyOpenException { 310 OpenDefinitionsDocument doc = _model.getActiveDocument(); 312 assertEquals("untitled display filename", "(Untitled)", doc.getCompletePath()); 313 314 File file = File.createTempFile("DrJava-filename-test", ".java", _tempDir).getCanonicalFile(); 316 file.deleteOnExit(); 317 String name = file.getAbsolutePath(); 318 doc = _model.openFile(new FileSelector(file)); 319 320 assertEquals(".java display filename", name, doc.getCompletePath()); 321 322 file = File.createTempFile("DrJava-filename-test", ".txt", _tempDir).getCanonicalFile(); 324 file.deleteOnExit(); 325 name = file.getAbsolutePath(); 326 doc = _model.openFile(new FileSelector(file)); 327 assertEquals(".txt display filename", name, doc.getCompletePath()); 328 329 file = File.createTempFile("DrJava-filename-test", ".java", _tempDir).getCanonicalFile(); 331 file.deleteOnExit(); 332 name = file.getAbsolutePath(); 333 doc = _model.openFile(new FileSelector(file)); 334 changeDocumentText("foo", doc); 335 assertEquals(".java.txt display filename", name + " *", doc.getCompletePath()); 336 _log.log("testDisplayFilename completed"); 337 } 338 339 public void testDeleteFileWhileOpen() 340 throws IOException , OperationCanceledException, AlreadyOpenException { 341 String txt = "This is some test text"; 342 File f = writeToNewTempFile(txt); 343 OpenDefinitionsDocument doc1 = _model.openFile(new FileSelector(f)); 344 OpenDefinitionsDocument doc2 = _model.newFile(); 345 f.delete(); 346 _model.closeFile(doc1); 347 _log.log("testDeleteFileWhileOpen completed"); 348 351 354 } 360 public void testDeleteFileBeforeCloseAll() 361 throws IOException , OperationCanceledException, AlreadyOpenException { 362 final File [] files = new File [10]; 363 for (int i = 0; i < 10; i++) { 364 String txt = "Text for file " + i; 365 files[i] = writeToNewTempFile(txt); 366 } 367 FileOpenSelector fos = new FileOpenSelector() { 368 public File [] getFiles() throws OperationCanceledException { return files; } 369 }; 370 _model.openFiles(fos); 371 _log.log("Opened files " + Arrays.toString(files)); 372 OpenDefinitionsDocument doc = _model.getSortedOpenDefinitionsDocuments().get(5); 373 _model.setActiveDocument(doc); 374 _log.log("Active document is: " + doc); 375 files[5].delete(); 376 _log.log("Delected document: " + doc); 377 _model.closeAllFiles(); 378 _log.log("testDeleteFileBeforeCloseAll completed"); 379 } 380 381 384 public static class SDTestListener extends TestListener implements GlobalModelListener { 385 386 387 protected volatile int switchCount; 388 389 public void resetCounts() { 390 super.resetCounts(); 391 switchCount = 0; 392 } 393 394 public void assertSwitchCount(int i) { assertEquals("number of active document switches", i, switchCount); } 395 396 public void activeDocumentChanged(OpenDefinitionsDocument doc) { 397 fail("activeDocumentChanged fired unexpectedly"); 398 } 399 400 public int getInterpreterReadyCount() { return interpreterReadyCount; } 401 } 402 } 403 | Popular Tags |