package org.jetbrains.plugins.clojure.resolve; import com.intellij.openapi.module.Module; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.ResolveResult; import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference; import org.jetbrains.plugins.clojure.psi.api.defs.ClDef; import org.jetbrains.plugins.clojure.psi.impl.ns.ClSyntheticNamespace; import org.jetbrains.plugins.clojure.util.TestUtils; import java.io.IOException; /** * @author ilyas */ public class ClojureResolveSymbolTest extends ClojureResolveTestCaseBase { @Override public String getTestDataPath() { return TestUtils.getTestDataPath() + "/resolve/"; } @Override public String folderPath() { return super.folderPath() + "/resolve/"; } private String commonTestFile() { return getTestName(true) + "/my_namespace.clj"; } private PsiElement resolveReference() throws Exception { configureByFileName(commonTestFile()); final PsiElement element = findReference().resolve(); assertNotNull(element); return element; } private PsiElement resolveReference(String testPath) throws Exception { configureByFileName(testPath); final PsiElement element = findReference().resolve(); assertNotNull(element); return element; } public void testDefinitionInsideLet() throws Exception { final PsiElement element = resolveReference("base/definitionInsideLet.clj"); assertTrue(element instanceof ClDef); assertEquals("foo", ((ClDef) element).getName()); } public void testDeftest1() throws Exception { final PsiElement element = resolveReference("useNs/deftest1.clj"); assertTrue(element instanceof ClDef); assertTrue("deftest".equals(((ClDef) element).getName())); } public void testDeftest2() throws Exception { final PsiElement element = resolveReference("useNs/deftest2.clj"); assertTrue(element instanceof ClDef); assertTrue("deftest".equals(((ClDef) element).getName())); } public void testDeftest3() throws Exception { final PsiElement element = resolveReference("useNs/deftest3.clj"); assertTrue(element instanceof ClDef); assertTrue("deftest".equals(((ClDef) element).getName())); } public void testDeftest4() throws Exception { final PsiElement element = resolveReference("useNs/deftest4.clj"); assertTrue(element instanceof ClDef); assertTrue("deftest".equals(((ClDef) element).getName())); } public void testDeftest5() throws Exception { checkReferenceIsUnresolved("useNs/deftest5.clj"); } public void testDeftest6() throws Exception { final PsiElement element = resolveReference("useNs/deftest6.clj"); assertTrue(element instanceof ClDef); assertTrue("deftest".equals(((ClDef) element).getName())); } // Actual test cases public void testUseNs() throws Exception { final PsiElement element = resolveReference(); assertTrue(element instanceof ClDef); assertTrue("encode-str".equals(((ClDef) element).getName())); } public void testUseNsMany() throws Exception { final PsiElement element = resolveReference(); assertTrue(element instanceof ClDef); assertTrue("collection-tag".equals(((ClDef) element).getName())); } public void testUseNsResolve() throws Exception { final PsiElement element = resolveReference(); assertTrue(element instanceof ClSyntheticNamespace); assertTrue("clojure.inspector".equals(((ClSyntheticNamespace) element).getQualifiedName())); } public void testRequireNs() throws Exception { final PsiElement element = resolveReference(); assertTrue(element instanceof ClSyntheticNamespace); } public void testRequireSymbol() throws Exception { final PsiElement element = resolveReference(); assertTrue(element instanceof ClDef); assertTrue("trace-fn-call".equals(((ClDef) element).getName())); } public void testImport1() throws Exception { checkResolveToDate("javaClass/import1.clj"); } public void testImport2() throws Exception { checkResolveToDate("javaClass/import2.clj"); } public void testImport3() throws Exception { checkResolveToDate("javaClass/import3.clj"); } public void testImport4() throws Exception { checkResolveToDate("javaClass/import4.clj"); } public void testImport5() throws Exception { checkResolveToDate("javaClass/import5.clj"); } public void testImport6() throws Exception { checkResolveToDate("javaClass/import6.clj"); } public void testImport7() throws Exception { checkResolveToDate("javaClass/import7.clj"); } public void testRequire1() throws Exception { checkResolveToCapitalize("requireNs/require1.clj"); } public void testRequire2() throws Exception { checkResolveToCapitalize("requireNs/require2.clj"); } public void testRequire3() throws Exception { checkResolveToCapitalize("requireNs/require3.clj"); } public void testRequire4() throws Exception { checkResolveToCapitalize("requireNs/require4.clj"); } public void testRequire5() throws Exception { checkResolveToCapitalize("requireNs/require5.clj"); } public void testRequire6() throws Exception { checkResolveToCapitalize("requireNs/require6.clj"); } private void checkResolveToDate(String filePath) throws IOException { configureByFileName(filePath); final PsiReference reference = findReference(); final PsiElement element = reference.resolve(); assert(element instanceof PsiClass && ((PsiClass) element).getQualifiedName().equals("java.util.Date")); } private void checkResolveToCapitalize(String filePath) throws IOException { configureByFileName(filePath); final PsiReference reference = findReference(); final PsiElement element = reference.resolve(); assert(element instanceof ClDef && ((ClDef) element).getName().equals("is")); } private void checkResolveToSplit(String filePath) throws IOException { configureByFileName(filePath); final PsiReference reference = findReference(); final PsiElement element = reference.resolve(); assert(element instanceof ClDef && ((ClDef) element).getName().equals("split")); } public void testUse1() throws Exception { checkResolveToSplit("use/use1.clj"); } public void testUse2() throws Exception { checkResolveToSplit("use/use2.clj"); } public void testUse3() throws Exception { checkResolveToSplit("use/use3.clj"); } public void testUse4() throws Exception { checkResolveToSplit("use/use4.clj"); } public void testUse5() throws Exception { checkResolveToSplit("use/use5.clj"); } public void testUse6() throws Exception { checkResolveToSplit("use/use6.clj"); } public void testUse7() throws Exception { checkResolveToSplit("use/use7.clj"); } public void testUse8() throws Exception { checkResolveToSplit("use/use8.clj"); } public void testUse9() throws Exception { checkResolveToSplit("use/use9.clj"); } public void testUse10() throws Exception { checkResolveToSplit("use/use10.clj"); } public void testUse11() throws Exception { checkResolveToSplit("use/use11.clj"); } public void testUse12() throws Exception { checkResolveToSplit("use/use12.clj"); } public void testUse13() throws Exception { checkResolveToSplit("use/use13.clj"); } public void testUse14() throws Exception { checkResolveToSplit("use/use14.clj"); } public void testUse15() throws Exception { checkResolveToSplit("use/use15.clj"); } public void testUse16() throws Exception { checkResolveToSplit("use/use16.clj"); } public void testUseFails1() throws Exception { checkReferenceIsUnresolved("use/useFailed1.clj"); } public void testUseFails2() throws Exception { checkReferenceIsUnresolved("use/useFailed2.clj"); } public void testUseFails4() throws Exception { checkReferenceIsUnresolved("use/useFailed4.clj"); } public void testUseFails5() throws Exception { checkReferenceIsUnresolved("use/useFailed5.clj"); } public void testImportFails1() throws Exception { checkReferenceIsUnresolved("javaClass/importFails1.clj"); } public void testImportFails2() throws Exception { checkReferenceIsUnresolved("javaClass/importFails2.clj"); } public void testRequireFails1() throws Exception { checkReferenceIsUnresolved("requireNs/requireFails1.clj"); } public void testRequireFails2() throws Exception { checkReferenceIsUnresolved("requireNs/requireFails2.clj"); } private void checkReferenceIsUnresolved(String filePath) throws IOException { configureByFileName(filePath); final PsiReference reference = findReference(); final PsiElement element = reference.resolve(); assertNull(element); } public void testImportFails3() throws Exception { checkReferenceIsUnresolved("javaClass/importFails3.clj"); } public void testJavaClass() throws Exception { configureByFileName(commonTestFile()); final PsiReference reference = findReference(); if (reference instanceof PsiMultiReference) { PsiMultiReference multiReference = (PsiMultiReference) reference; for (ResolveResult result : multiReference.multiResolve(false)) { final PsiElement element = result.getElement(); if (element instanceof PsiClass) { PsiClass clazz = (PsiClass) element; if (clazz.getName().equals("Arrays")) { return; } } } assertTrue("No 'Arrays' class found", false); } else { assertTrue(false); } } }