forked from DrJavaAtRice/drjava
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCommandLineTest.java
More file actions
430 lines (384 loc) · 19.1 KB
/
CommandLineTest.java
File metadata and controls
430 lines (384 loc) · 19.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
/*BEGIN_COPYRIGHT_BLOCK
*
* Copyright (c) 2001-2019, JavaPLT group at Rice University (drjava@rice.edu). All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
* following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the following
* disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
* following disclaimer in the documentation and/or other materials provided with the distribution.
* * Neither the names of DrJava, the JavaPLT group, Rice University, nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software is Open Source Initiative approved Open Source Software. Open Source Initative Approved is a trademark
* of the Open Source Initiative.
*
* This file is part of DrJava. Download the current version of this project from http://www.drjava.org/ or
* http://sourceforge.net/projects/drjava/
*
* END_COPYRIGHT_BLOCK*/
package edu.rice.cs.drjava;
import javax.swing.text.BadLocationException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import edu.rice.cs.drjava.DrJavaTestCase;
import edu.rice.cs.drjava.model.OpenDefinitionsDocument;
import edu.rice.cs.drjava.model.definitions.InvalidPackageException;
import edu.rice.cs.drjava.ui.MainFrame;
import edu.rice.cs.plt.io.IOUtil;
import edu.rice.cs.util.Log;
import edu.rice.cs.util.StringOps;
import edu.rice.cs.util.swing.Utilities;
/** Tests opening/creating files specified as command line arguments. Does not use MultiThreadedTestCase because
* all JUnit assertXXX calls run in the main test thread.
* @version $Id$
*/
public final class CommandLineTest extends DrJavaTestCase {
/** File separator, i.e. '/' or '\\'. */
private static final char FS = File.separatorChar;
/** The MainFrame we're working with. */
private MainFrame _mf;
/** Files that exist, and the filenames that represent them. */
private volatile File f1;
private volatile String f1_name;
private volatile String f1_contents;
private volatile File f2;
private volatile String f2_name;
private volatile String f2_contents;
private volatile File f3;
private volatile String f3_name;
private volatile String f3_contents;
private volatile File f4;
private volatile String f4_name;
private volatile String f4_contents;
private volatile File f5;
private volatile String f5_name;
private volatile String f5_contents;
private volatile File f6;
private volatile String f6_name;
private volatile String f6_contents;
private volatile File f7;
private volatile String f7_name;
private volatile String f7_contents;
private volatile File f8;
private volatile String f8_name;
private volatile String f8_contents;
/** Files that do not exist (constructor deletes them), and their filenames. */
private volatile File nof1;
private volatile File nof2;
private volatile File nof3;
private volatile File nof4;
private volatile File nof5;
private volatile String nof1_name;
private volatile String nof2_name;
private volatile String nof3_name;
private volatile String nof4_name;
private volatile String nof5_name;
private Log _log = new Log("CommandLineTest.txt", false);
/** Constructor. Sets up test files for us to use: (i) three files that exist and can be opened; (ii) three
* files that don't exist
* @param name the name of the test case
*/
public CommandLineTest(String name) { super(name); }
public void setUp() throws Exception {
super.setUp();
// Perform Swing initialization in event thread because the event thread is already running
Utilities.invokeAndWait(new Runnable() {
public void run() {
_log.log("Creating a MainFrame for " + this);
_mf = new MainFrame();
_log.log("Created a MainFrame for " + this + "; stating file setup");
try {
f1 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f1.deleteOnExit();
f1_name = f1.getAbsolutePath();
f1_contents = "abcde";
FileWriter fw1 = new FileWriter(f1);
fw1.write(f1_contents,0,f1_contents.length());
fw1.close();
f2 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f2.deleteOnExit();
f2_name = f2.getAbsolutePath();
f2_contents = "fghijklm";
FileWriter fw2 = new FileWriter(f2);
fw2.write(f2_contents,0,f2_contents.length());
fw2.close();
f3 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f3.deleteOnExit();
f3_name = f3.getAbsolutePath();
f3_contents = "nopqrstuvwxyz";
FileWriter fw3 = new FileWriter(f3);
fw3.write(f3_contents,0,f3_contents.length());
fw3.close();
f4 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f4.deleteOnExit();
f4_name = f4.getAbsolutePath();
f4_contents = "abcde";
FileWriter fw4 = new FileWriter(f4);
fw4.write(f4_contents,0,f4_contents.length());
fw4.close();
f5 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f5.deleteOnExit();
f5_name = f5.getAbsolutePath();
f5_contents = "fghijklm";
FileWriter fw5 = new FileWriter(f5);
fw5.write(f5_contents,0,f5_contents.length());
fw5.close();
f6 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f6.deleteOnExit();
f6_name = f6.getAbsolutePath();
f6_contents = "nopqrstuvwxyz";
FileWriter fw6 = new FileWriter(f6);
fw6.write(f6_contents,0,f6_contents.length());
fw6.close();
f7 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f7.deleteOnExit();
f7_name = f7.getAbsolutePath();
f7_contents = "abcde";
FileWriter fw7 = new FileWriter(f7);
fw7.write(f7_contents,0,f7_contents.length());
fw7.close();
f8 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
f8.deleteOnExit();
f8_name = f8.getAbsolutePath();
f8_contents = "fghijklm";
FileWriter fw8 = new FileWriter(f8);
fw8.write(f8_contents,0,f8_contents.length());
fw8.close();
nof1 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
nof1_name = nof1.getAbsolutePath();
nof1.delete();
nof2 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
nof2_name = nof2.getAbsolutePath();
nof2.delete();
nof3 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
nof3_name = nof3.getAbsolutePath();
nof3.delete();
nof4 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
nof4_name = nof4.getAbsolutePath();
nof4.delete();
nof5 = File.createTempFile("DrJava-test", ".java").getCanonicalFile();
nof5_name = nof5.getAbsolutePath();
nof5.delete();
_log.log("File initialization (setUp) is complete");
}
catch (IOException e) {
System.err.print("createTempFile failed. This should not happen.");
throw new RuntimeException(e.toString());
}
}
});
}
public void tearDown() throws Exception {
Utilities.invokeAndWait(new Runnable() { public void run() { _mf.dispose(); } });
_mf = null;
super.tearDown();
}
/** Tests DrJava with no command line arguments. Should open a new, untitled document. */
public void testNone() {
DrJavaRoot.openCommandLineFiles(_mf, new String[0],false);
// ListModel<DefinitionsDocument> docs =
// Wouldn't that be nice?
List<OpenDefinitionsDocument> docs = _mf.getModel().getOpenDefinitionsDocuments();
assertEquals("Only one document?", 1, docs.size());
OpenDefinitionsDocument doc = docs.get(0);
assertTrue("Is new document untitled?", doc.isUntitled());
_log.log("testNone() completed");
}
/** Open one file on the command line. Should (obviously) open that file.
* @throws BadLocationException if an invalid location within the document model is referenced
*/
public void testOpenOne() throws BadLocationException {
String[] list = new String[1];
list[0] = f1_name;
DrJavaRoot.openCommandLineFiles(_mf, list,false);
// _log.log("openCommandLineFiles completed");
List<OpenDefinitionsDocument> docs = _mf.getModel().getOpenDefinitionsDocuments();
// Utilities.showDebug(docs.toString());
// _log.log("got OpenDefDocs");
assertEquals("Only one document opened?", 1, docs.size());
OpenDefinitionsDocument doc = docs.get(0);
// System.err.println("Doc text = " + doc.getText());
assertEquals("Correct length of file?", f1_contents.length(), doc.getLength());
// _log.log("Ready to perform getText operation");
assertEquals("Do the contents match?", f1_contents, doc.getText(0,f1_contents.length()));
_log.log("testOpenOne completed");
}
/** A nonexistent file. Should open a new, untitled document. */
public void testNE() {
String[] list = new String[1];
list[0] = nof1_name;
DrJavaRoot.openCommandLineFiles(_mf, list, false);
// _log.log("openCommandLineFiles completed");
List<OpenDefinitionsDocument> docs = _mf.getModel().getOpenDefinitionsDocuments();
assertEquals("Exactly one document?", 1, docs.size());
OpenDefinitionsDocument doc = docs.get(0);
assertTrue("Is document untitled?", doc.isUntitled());
_log.log("testNE completed");
}
/** Many files on the command line.
* Should open all of them, displaying the last one.
* @throws BadLocationException if an invalid location within the document model is referenced
*/
public void testOpenMany() throws BadLocationException {
String[] list = new String[3];
list[0] = f1_name;
list[1] = f2_name;
list[2] = f3_name;
DrJavaRoot.openCommandLineFiles(_mf, list, false);
// _log.log("openCommandLineFiles completed");
List<OpenDefinitionsDocument> docs = _mf.getModel().getOpenDefinitionsDocuments();
assertEquals("Exactly three documents?", 3, docs.size());
OpenDefinitionsDocument doc1 = docs.get(0);
assertEquals("Correct length of file 1?", f1_contents.length(), doc1.getLength());
assertEquals("Do the contents of file 1 match?", f1_contents, doc1.getText(0,f1_contents.length()));
OpenDefinitionsDocument doc2 = docs.get(1);
assertEquals("Correct length of file 2?", f2_contents.length(), doc2.getLength());
assertEquals("Do the contents of file 2 match?", f2_contents, doc2.getText(0,f2_contents.length()));
OpenDefinitionsDocument doc3 = docs.get(2);
assertEquals("Correct length of file 3?", f3_contents.length(), doc3.getLength());
assertEquals("Do the contents of file 3 match?", f3_contents, doc3.getText(0,f3_contents.length()));
assertEquals("Is the last document the active one?", doc3, _mf.getModel().getActiveDocument());
_log.log("testOpenMany completed");
}
/** Supplying both valid and invalid filenames on the command line.
* Should open only the valid ones.
* @throws BadLocationException if an invalid location within the document model is referenced
*/
public void testMixed() throws BadLocationException {
String[] list = new String[6];
list[0] = f4_name;
list[1] = nof1_name;
list[2] = nof2_name;
list[3] = f5_name;
list[4] = f6_name;
list[5] = nof3_name;
DrJavaRoot.openCommandLineFiles(_mf, list, false);
// _log.log("openCommandLineFiles completed");
List<OpenDefinitionsDocument> docs = _mf.getModel().getOpenDefinitionsDocuments();
assertEquals("Exactly three documents?", 3, docs.size());
OpenDefinitionsDocument doc1 = docs.get(0);
assertEquals("Correct length of file 1?", f4_contents.length(), doc1.getLength());
assertEquals("Do the contents of file 1 match?", f4_contents, doc1.getText(0,f4_contents.length()));
OpenDefinitionsDocument doc2 = docs.get(1);
assertEquals("Correct length of file 2?", f5_contents.length(), doc2.getLength());
assertEquals("Do the contents of file 2 match?", f5_contents, doc2.getText(0,f5_contents.length()));
OpenDefinitionsDocument doc3 = docs.get(2);
assertEquals("Correct length of file 3?", f6_contents.length(), doc3.getLength());
assertEquals("Do the contents of file 3 match?", f6_contents, doc3.getText(0,f6_contents.length()));
assertEquals("Is the last document the active one?", doc3, _mf.getModel().getActiveDocument());
_log.log("testMixed completed");
}
/** Test duplicate files.
* @throws BadLocationException if an invalid location within the document model is referenced
*/
public void testDups() throws BadLocationException {
String[] list = new String[6];
list[0] = f7_name;
list[1] = nof4_name;
list[2] = nof5_name;
list[3] = f8_name;
list[4] = f8_name;
list[5] = f7_name;
DrJavaRoot.openCommandLineFiles(_mf, list, false);
// _log.log("openCommandLineFiles in testDups completed");
List<OpenDefinitionsDocument> docs = _mf.getModel().getOpenDefinitionsDocuments();
Utilities.clearEventQueue();
assertEquals("Exactly two documents?", 2, docs.size());
OpenDefinitionsDocument doc1 = docs.get(0);
assertEquals("Correct length of file 1?", f7_contents.length(), doc1.getLength());
assertEquals("Do the contents of file 1 match?", f7_contents, doc1.getText(0,f7_contents.length()));
Utilities.clearEventQueue();
OpenDefinitionsDocument doc2 = docs.get(1);
assertEquals("Correct length of file 2?", f8_contents.length(), doc2.getLength());
assertEquals("Do the contents of file 2 match?", f8_contents, doc2.getText(0,f8_contents.length()));
assertEquals("Is the last document the active one?", doc2, _mf.getModel().getActiveDocument());
// _log.log("testDups completed");
}
/** A regression test for bug #542747, which related to opening a file via the command line using a relative path.
* The problem was that getSourceRoot() would fail on the document, because the filename was not absolute. (The
* fix will be to absolutize file paths when opening files.)
* @throws IOException if an IO operation fails
* @throws InvalidPackageException if the document contains an invalid package statement
*/
public void testRelativePath() throws IOException, InvalidPackageException {
String funnyName = "DrJava_automatically_deletes_this_1";
File newDirectory = mkTempDir(funnyName);
File relativeFile = new File(newDirectory, "X.java");
assertEquals(relativeFile + " is absolute?", false, relativeFile.isAbsolute());
try { checkFile(relativeFile, funnyName); }
catch (Exception e) { fail("Exception thrown: " + StringOps.getStackTrace(e)); }
finally { IOUtil.deleteOnExitRecursively(newDirectory); }
_log.log("testRelativePath completed");
}
/** Tests paths with "." and ".." in them. Windows will blow up if you use one in a JFileChooser without
* converting it to a canonical filename.
*/
public void testDotPaths() {
String funnyName = "DrJava_automatically_deletes_this_2";
File newDirectory = mkTempDir(funnyName);
assertTrue("child directory created OK", new File(newDirectory, "childDir").mkdir());
File relativeFile = new File(newDirectory, "." + FS + "X.java");
File relativeFile2 = new File(newDirectory, "." + FS + "Y.java");
File relativeFile3 = new File(newDirectory, "childDir" + FS + ".." + FS + "Z.java");
try {
checkFile(relativeFile, funnyName);
checkFile(relativeFile2, funnyName);
checkFile(relativeFile3, funnyName);
}
catch (Exception e) { fail("Exception thrown: " + StringOps.getStackTrace(e)); }
finally { IOUtil.deleteOnExitRecursively(newDirectory); }
_log.log("testDotPaths completed");
}
/** Helper for testRelativeFile and testDotPaths.
* @param funnyName the name of the directory to create
* @return the newly-created directory
*/
private File mkTempDir(String funnyName) {
// OK, we have to create a directory with a hard-coded name in the current working directory, so we'll make it
// strange. If this directory happens to exist, it'll be deleted.
File newDirectory = new File(funnyName);
if (newDirectory.exists()) IOUtil.deleteOnExitRecursively(newDirectory);
// System.err.println("newDirectory.exists() = " + newDirectory.exists());
assertTrue("directory created OK", newDirectory.mkdir());
// _log.log("Temporary directory " + funnyName + " created");
return newDirectory;
}
/** Helper for testRelativeFile and testDotPaths.
* @param relativeFile file to write to
* @param funnyName name of package to write to file
* @throws IOException if an IO operation fails
* @throws InvalidPackageException if the document contains an invalid package statement
*/
private void checkFile(File relativeFile, String funnyName)
throws IOException, InvalidPackageException {
IOUtil.writeStringToFile(relativeFile, "package " + funnyName + "; class X { }");
assertTrue("file exists", relativeFile.exists());
String path = relativeFile.getCanonicalPath();
DrJavaRoot.openCommandLineFiles(_mf, new String[] { path }, false);
List<OpenDefinitionsDocument> docs = _mf.getModel().getOpenDefinitionsDocuments();
assertEquals("Number of open documents", 1, docs.size());
OpenDefinitionsDocument doc = docs.get(0);
assertEquals("OpenDefDoc file is the right one and is canonical", relativeFile.getCanonicalFile(), doc.getFile());
// The source root should be the current directory (as a canonical path, of course).
Utilities.clearEventQueue();
File root = doc.getSourceRoot();
Utilities.clearEventQueue();
// System.err.println("Source root is: " + root);
// System.err.println("Package name is: " + doc.getPackageName());
assertEquals("source root", IOUtil.WORKING_DIRECTORY.getCanonicalFile(), root);
// Close this doc to clean up after ourselves for the next check.
_mf.getModel().closeFile(doc);
}
}