package com.google.jstestdriver.idea.assertFramework.jstd; import com.google.jstestdriver.idea.assertFramework.jstd.jsSrc.JstdDefaultAssertionFrameworkSrcMarker; import com.google.jstestdriver.idea.assertFramework.library.JstdLibraryUtil; import com.google.jstestdriver.idea.util.VfsUtils; import com.intellij.lang.javascript.library.JSLibraryManager; import com.intellij.lang.javascript.library.JSLibraryMappings; import com.intellij.lang.javascript.psi.JSFunction; import com.intellij.lang.javascript.psi.JSReferenceExpression; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPolyVariantReference; import com.intellij.psi.ResolveResult; import com.intellij.testFramework.ResolveTestCase; import com.intellij.util.ArrayUtil; import com.intellij.webcore.libraries.ScriptingLibraryManager; import com.intellij.webcore.libraries.ScriptingLibraryModel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; /** * @author Sergey Simonchik */ public class JstdResolveTest extends ResolveTestCase { private static final boolean ADD_LIBRARY = true; @Override public void setUp() throws Exception { super.setUp(); if (ADD_LIBRARY) { Collection<VirtualFile> jstdLibSourceFiles = VfsUtils.findVirtualFilesByResourceNames( JstdDefaultAssertionFrameworkSrcMarker.class, new String[]{"Asserts.js", "TestCase.js"} ); addJstdLibrary(getProject(), jstdLibSourceFiles); } } @Override public void tearDown() throws Exception { try { if (ADD_LIBRARY) { removeLibrary(getProject()); } } finally { super.tearDown(); } } private static void removeLibrary(@NotNull final Project project) { ApplicationManager.getApplication().runWriteAction(() -> { ScriptingLibraryManager libraryManager = ServiceManager.getService(project, JSLibraryManager.class); ScriptingLibraryModel model = libraryManager.getLibraryByName(JstdLibraryUtil.LIBRARY_NAME); assert model != null; libraryManager.removeLibrary(model); libraryManager.commitChanges(); }); } private static void addJstdLibrary(@NotNull final Project project, @NotNull final Collection<VirtualFile> libSourceFiles) { ApplicationManager.getApplication().runWriteAction(() -> { JSLibraryManager jsLibraryManager = ServiceManager.getService(project, JSLibraryManager.class); ScriptingLibraryModel libraryModel = jsLibraryManager.createLibrary( JstdLibraryUtil.LIBRARY_NAME, VfsUtilCore.toVirtualFileArray(libSourceFiles), VirtualFile.EMPTY_ARRAY, ArrayUtil.EMPTY_STRING_ARRAY, ScriptingLibraryModel.LibraryLevel.GLOBAL, false ); JSLibraryMappings jsLibraryMappings = ServiceManager.getService(project, JSLibraryMappings.class); jsLibraryMappings.associate(null, libraryModel.getName()); jsLibraryManager.commitChanges(); }); } public void testResolveTestCaseFunction() throws Exception { String fileText = "Test<ref>Case('', {});"; JSReferenceExpression ref = (JSReferenceExpression)configureByFileText(fileText, "sample.js"); final PsiElement resolved = doResolve(ref); assertTrue(resolved instanceof JSFunction); } @Nullable public static PsiElement doResolve(@NotNull PsiPolyVariantReference psiPolyVariantReference) { ResolveResult[] resolveResults = psiPolyVariantReference.multiResolve(false); for (ResolveResult resolveResult : resolveResults) { PsiElement element = unwrapResolveResult(resolveResult); if (element != null) { return element; } } return null; } @Nullable private static PsiElement unwrapResolveResult(@NotNull ResolveResult resolveResult) { PsiElement resolvedElement = resolveResult.getElement(); if (resolvedElement == null || !resolveResult.isValidResult()) { return null; } return resolvedElement; } }