| 1 19 package org.netbeans.test.java.editor.completion; 20 21 import java.io.*; 22 import java.util.Arrays ; 23 import java.util.Collection ; 24 import java.util.Collections ; 25 import java.util.Comparator ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 import javax.swing.JEditorPane ; 29 import javax.swing.SwingUtilities ; 30 import javax.swing.text.BadLocationException ; 31 import lib.EditorTestCase; 32 import lib.EditorTestCase.ValueResolver; 33 import org.netbeans.api.editor.mimelookup.MimeLookup; 34 import org.netbeans.api.editor.mimelookup.MimePath; 35 import org.openide.filesystems.FileObject; 36 import org.netbeans.editor.*; 37 import org.netbeans.editor.ext.Completion; 38 import org.netbeans.editor.ext.CompletionQuery; 39 import org.netbeans.editor.ext.ExtUtilities; 40 import org.netbeans.junit.ide.ProjectSupport; 41 import org.netbeans.modules.editor.completion.CompletionImpl; 42 import org.netbeans.modules.editor.completion.CompletionResultSetImpl; 43 import org.netbeans.modules.editor.java.JavaCompletionProvider; 44 import org.netbeans.modules.editor.java.LazyTypeCompletionItem; 45 import org.netbeans.spi.editor.completion.CompletionItem; 46 import org.netbeans.spi.editor.completion.CompletionProvider; 47 import org.netbeans.spi.editor.completion.CompletionResultSet; 48 import org.netbeans.spi.editor.completion.CompletionTask; 49 import org.openide.cookies.CloseCookie; 50 import org.openide.cookies.EditorCookie; 51 import org.openide.cookies.SaveCookie; 52 import org.openide.filesystems.FileUtil; 53 import org.openide.loaders.DataObject; 54 import org.openide.util.Lookup; 55 56 105 public class CompletionTest extends java.lang.Object { 106 107 private static final long OPENING_TIMEOUT = 60 * 1000; 108 private static final long SLEEP_TIME = 1000; 109 110 111 public CompletionTest() { 112 } 113 114 private class ResultReadyResolver implements ValueResolver { 115 private CompletionResultSetImpl crs; 116 117 public ResultReadyResolver(CompletionResultSetImpl crs) { 118 this.crs = crs; 119 } 120 121 public Object getValue() { 122 return crs.isFinished(); 123 } 124 } 125 126 private void completionQuery(PrintWriter out, 127 PrintWriter log, 128 JEditorPane editor, 129 boolean unsorted, 130 int queryType 131 ) { 132 BaseDocument doc = Utilities.getDocument(editor); 133 SyntaxSupport support = doc.getSyntaxSupport(); 134 135 CompletionImpl completion = CompletionImpl.get(); 136 String mimeType = (String ) doc.getProperty("mimeType"); 137 Lookup lookup = MimeLookup.getLookup(MimePath.get(mimeType)); 138 Collection <? extends CompletionProvider> col = lookup.lookupAll(CompletionProvider.class); 139 JavaCompletionProvider jcp = null; 140 for (Iterator <? extends CompletionProvider> it = col.iterator(); it.hasNext();) { 141 CompletionProvider completionProvider = it.next(); 142 if(completionProvider instanceof JavaCompletionProvider) jcp = (JavaCompletionProvider) completionProvider; 143 } 144 if(jcp==null) log.println("JavaCompletionProvider not found"); 145 CompletionTask task = jcp.createTask(queryType, editor); 146 CompletionResultSetImpl result = completion.createTestResultSet(task,queryType); 147 task.query(result.getResultSet()); 148 EditorTestCase.waitMaxMilisForValue(5000, new ResultReadyResolver(result), Boolean.TRUE); 149 if(!result.isFinished()) log.println("Result is not finished"); 150 List <? extends CompletionItem> list = result.getItems(); 151 CompletionItem[] array = list.toArray(new CompletionItem[]{}); 152 if(!unsorted) { 153 Arrays.sort(array, new Comparator <CompletionItem>(){ 154 public int compare(CompletionItem arg0, CompletionItem arg1) { 155 String a0 = (arg0 instanceof LazyTypeCompletionItem)? arg0.getSortText().toString():arg0.toString(); 156 String a1 = (arg1 instanceof LazyTypeCompletionItem)? arg1.getSortText().toString():arg1.toString(); 157 return a0.compareTo(a1); 158 } 159 }); 160 } 161 for (int i = 0; i < array.length; i++) { 162 CompletionItem completionItem = array[i]; 163 if(completionItem instanceof LazyTypeCompletionItem) out.println(completionItem.getSortText().toString()); 164 else out.println(completionItem.toString()); 165 } 166 203 } 204 205 206 215 private void testPerform(PrintWriter out, PrintWriter log, 216 JEditorPane editor, 217 boolean unsorted, 218 String assign, 219 int lineIndex, 220 int queryType) throws BadLocationException , IOException { 221 if (!SwingUtilities.isEventDispatchThread()) 222 throw new IllegalStateException ("The testPerform method may be called only inside AWT event dispatch thread."); 223 224 BaseDocument doc = Utilities.getDocument(editor); 225 int lineOffset = Utilities.getRowStartFromLineOffset(doc, lineIndex -1); 226 227 editor.grabFocus(); 228 editor.getCaret().setDot(lineOffset); 229 doc.insertString(lineOffset, assign, null); 230 reparseDocument((DataObject) doc.getProperty(doc.StreamDescriptionProperty)); 231 completionQuery(out, log, editor, unsorted, queryType); 232 } 233 234 public void test(final PrintWriter out, final PrintWriter log, 235 final String assign, final boolean unsorted, 236 final File dataDir, final String projectName, 237 final String testFileName, final int line) throws Exception { 238 test(out, log, assign, unsorted, dataDir, projectName, testFileName, line, CompletionProvider.COMPLETION_QUERY_TYPE); 239 } 240 241 public void test(final PrintWriter out, final PrintWriter log, 242 final String assign, final boolean unsorted, 243 final File dataDir, final String projectName, 244 final String testFileName, final int line, final int queryType) throws Exception { 245 try { 246 log.println("Completion test start."); 247 log.flush(); 248 249 FileObject testFileObject = getTestFile(dataDir, projectName, testFileName, log); 250 final DataObject testFile = DataObject.find(testFileObject); 251 252 try { 253 Runnable test = new Runnable () { 254 public void run() { 255 try { 256 JEditorPane editor = getAnEditorPane(testFile, log); 257 testPerform(out, log, editor, unsorted, assign, line, queryType); 258 } catch (Exception e) { 259 e.printStackTrace(log); 260 }; 261 } 262 }; 263 if (SwingUtilities.isEventDispatchThread()) { 264 test.run(); 265 } else { 266 SwingUtilities.invokeAndWait(test); 267 } 268 } finally { 269 testFile.setModified(false); 270 } 272 } catch (Exception e) { 273 e.printStackTrace(log); 274 throw e; 275 } 276 } 277 278 private FileObject getTestFile(File dataDir, String projectName, String testFile, PrintWriter log) throws IOException, InterruptedException { 279 File projectFile = new File(dataDir, projectName); 280 FileObject project = FileUtil.toFileObject(projectFile); 281 Object prj= ProjectSupport.openProject(projectFile); 282 283 if (prj == null) 284 throw new IllegalStateException ("Given directory \"" + project + "\" does not contain a project."); 285 286 log.println("Project found: " + prj); 287 288 FileObject test = project.getFileObject("src/" + testFile); 289 290 if (test == null) 291 throw new IllegalStateException ("Given test file does not exist."); 292 293 return test; 294 } 295 296 304 312 private static JEditorPane getAnEditorPane(DataObject file, PrintWriter log) throws Exception { 313 EditorCookie cookie = (EditorCookie)file.getCookie(EditorCookie.class); 314 315 if (cookie == null) 316 throw new IllegalStateException ("Given file (\"" + file.getName() + "\") does not have EditorCookie."); 317 318 JEditorPane [] panes = cookie.getOpenedPanes(); 319 long start = System.currentTimeMillis(); 320 321 if (panes == null) { 322 cookie.openDocument(); 325 cookie.open(); 326 while ((panes = cookie.getOpenedPanes()) == null && (System.currentTimeMillis() - start) < OPENING_TIMEOUT) { 327 try { 328 Thread.sleep(SLEEP_TIME); 329 } catch (InterruptedException e) { 330 e.printStackTrace(log); 331 } 332 }; 333 334 log.println("Waiting spent: " + (System.currentTimeMillis() - start) + "ms."); 335 }; 336 337 if (panes == null) 338 throw new IllegalStateException ("The editor was not opened. The timeout was: " + OPENING_TIMEOUT + "ms."); 339 340 return panes[0]; 341 } 342 343 353 private static void reparseDocument(DataObject file) throws IOException { 354 saveDocument(file); 355 363 try { 365 Thread.sleep(1000); 366 } catch (InterruptedException e) { 367 368 } 369 } 370 371 private static void saveDocument(DataObject file) throws IOException { SaveCookie sc = (SaveCookie) file.getCookie(SaveCookie.class); 373 374 if (sc != null) { 375 sc.save(); 376 } 377 } 378 379 } 380 | Popular Tags |