/* * Copyright 2013 Hewlett-Packard Development Company, L.P * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.hp.alm.ali.idea.navigation.recognizer; import com.hp.alm.ali.ServerVersion; import com.hp.alm.ali.idea.IntellijTest; import com.hp.alm.ali.idea.navigation.Candidate; import com.hp.alm.ali.idea.util.EditSourceUtil; import com.hp.alm.ali.idea.util.FileEditorManager; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.application.Result; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.textarea.TextComponentEditor; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.StdModuleTypes; import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.testFramework.IdeaTestUtil; import org.junit.After; import org.junit.Assert; import org.junit.Test; import javax.swing.JTextArea; import java.io.File; import java.util.Arrays; import java.util.List; public class ClassRecognizerTest extends IntellijTest { public ClassRecognizerTest() { super(ServerVersion.AGM); } @After public void postClean() { getComponent(EditSourceUtil.class)._restore(); getComponent(FileEditorManager.class)._restore(); } @Test public void testNavigate_class() { handler.async(2); getComponent(EditSourceUtil.class)._setNavigator(new EditSourceUtil.Navigator() { @Override public void navigate(final NavigationItem item, final boolean requestFocus, final boolean useCurrentWindow) { handler.done(new Runnable() { @Override public void run() { Assert.assertEquals("PsiClass:Clazz", item.toString()); Assert.assertTrue(requestFocus); Assert.assertTrue(useCurrentWindow); } }); } }); final TextComponentEditor editor = new TextComponentEditor(getProject(), new JTextArea("1\n2\n3\n4\n5\n")); editor.getSelectionModel().setSelection(1, 2); final int line = 3; getComponent(FileEditorManager.class)._setSelector(new FileEditorManager.Selector() { @Override public Editor getSelectedTextEditor() { handler.done(); return editor; } }); createTestClazz(); boolean result = new ReadAction<Boolean>() { @Override protected void run(Result<Boolean> result) throws Throwable { String hyperlink = new ClassCandidate(1, 100, 10, 90, "test.Clazz", "Clazz", line, null).createLink(getProject()); result.setResult(new MyRecognizer().navigate(getProject(), hyperlink)); } }.execute().getResultObject(); Assert.assertTrue(result); Assert.assertEquals(new LogicalPosition(line - 1, 0), editor.getCaretModel().getLogicalPosition()); Assert.assertNull(editor.getSelectionModel().getSelectedText()); } @Test public void testNavigate_method() { handler.async(); getComponent(EditSourceUtil.class)._setNavigator(new EditSourceUtil.Navigator() { @Override public void navigate(final NavigationItem item, final boolean requestFocus, final boolean useCurrentWindow) { handler.done(new Runnable() { @Override public void run() { Assert.assertEquals("PsiMethod:one", item.toString()); Assert.assertTrue(requestFocus); Assert.assertTrue(useCurrentWindow); } }); } }); createTestClazz(); boolean result = new ReadAction<Boolean>() { @Override protected void run(Result<Boolean> result) throws Throwable { String hyperlink = new ClassCandidate(1, 100, 10, 90, "test.Clazz", "Clazz", 0, "one").createLink(getProject()); result.setResult(new MyRecognizer().navigate(getProject(), hyperlink)); } }.execute().getResultObject(); Assert.assertTrue(result); } @Test public void testNavigate_classNonQualified() { handler.async(2); getComponent(EditSourceUtil.class)._setNavigator(new EditSourceUtil.Navigator() { @Override public void navigate(final NavigationItem item, final boolean requestFocus, final boolean useCurrentWindow) { handler.done(new Runnable() { @Override public void run() { Assert.assertEquals("PsiClass:Clazz", item.toString()); Assert.assertTrue(requestFocus); Assert.assertTrue(useCurrentWindow); } }); } }); final TextComponentEditor editor = new TextComponentEditor(getProject(), new JTextArea("1\n2\n3\n4\n5\n")); editor.getSelectionModel().setSelection(1, 2); final int line = 3; getComponent(FileEditorManager.class)._setSelector(new FileEditorManager.Selector() { @Override public Editor getSelectedTextEditor() { handler.done(); return editor; } }); createTestClazz(); boolean result = new ReadAction<Boolean>() { @Override protected void run(Result<Boolean> result) throws Throwable { String hyperlink = new ClassCandidate(1, 100, 10, 90, "hello.Clazz", "Clazz", line, null).createLink(getProject()); result.setResult(new MyRecognizer().navigate(getProject(), hyperlink)); } }.execute().getResultObject(); Assert.assertTrue(result); Assert.assertEquals(new LogicalPosition(line - 1, 0), editor.getCaretModel().getLogicalPosition()); Assert.assertNull(editor.getSelectionModel().getSelectedText()); } @Test public void testNavigate_negative() { getComponent(EditSourceUtil.class)._setNavigator(new EditSourceUtil.Navigator() { @Override public void navigate(NavigationItem item, boolean requestFocus, boolean useCurrentWindow) { handler.fail("Not expected"); } }); createTestClazz(); boolean result = new ReadAction<Boolean>() { @Override protected void run(Result<Boolean> result) throws Throwable { result.setResult(new MyRecognizer().navigate(getProject(), "goto:c=test.Clazz2&f=Clazz2&l=3")); } }.execute().getResultObject(); Assert.assertTrue(result); } private void createTestClazz() { new WriteCommandAction(getProject()) { @Override protected void run(Result result) throws Throwable { Module module = ModuleManager.getInstance(getProject()).findModuleByName("navigation_decorator_java"); if(module == null) { File tempFile = File.createTempFile("test", ""); tempFile.delete(); tempFile.mkdir(); final VirtualFile dummyRoot = VirtualFileManager.getInstance().findFileByUrl("file://" + tempFile.getAbsolutePath()); dummyRoot.refresh(false, false); List<String> list = Arrays.asList("src/test/Clazz.java".split("/")); String dirPath = StringUtil.join(list.subList(0, list.size() - 1), "/"); VirtualFile dir = VfsUtil.createDirectories(dummyRoot.getPath() + dirPath); VirtualFile vFile = dir.findOrCreateChildData(this, "Clazz.java"); VfsUtil.saveText(vFile, "package test; public class Clazz { public void one() {} }"); module = ApplicationManager.getApplication().runWriteAction(new Computable<Module>() { @Override public Module compute() { return ModuleManager.getInstance(getProject()).newModule("class_recognizer.iml", StdModuleTypes.JAVA.getId()); } }); ModuleRootManager rootManager = ModuleRootManager.getInstance(module); ModifiableRootModel rootModel = rootManager.getModifiableModel(); rootModel.setSdk(IdeaTestUtil.getMockJdk17()); ContentEntry contentEntry = rootModel.addContentEntry(dir.getParent()); contentEntry.addSourceFolder(dir.getParent(), false); rootModel.commit(); } } }.execute(); } private static class MyRecognizer extends ClassRecognizer { @Override public void recognize(String content, List<Candidate> candidates) { } } }