package org.angularjs.codeInsight; import com.intellij.lang.javascript.psi.JSCallExpression; import com.intellij.lang.javascript.psi.JSLiteralExpression; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.include.FileIncludeProvider; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlAttributeValue; import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; import org.angularjs.AngularTestUtil; import org.angularjs.codeInsight.refs.AngularJSReferencesContributor; import java.util.List; /** * @author Dennis.Ushakov */ public class RoutingTest extends LightPlatformCodeInsightFixtureTestCase { @Override protected String getTestDataPath() { return AngularTestUtil.getBaseTestDataPath(getClass()) + "routing"; } public void testPartialResolve() { myFixture.configureByFiles("custom.js", "angular.js", "index.html", "partials/phone-details.html", "partials/phone-list.html"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("phone-<caret>details", myFixture.getFile()); PsiReference ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); PsiElement resolve = ref.resolve(); assertInstanceOf(resolve, PsiFile.class); assertEquals("phone-details.html", ((PsiFile)resolve).getName()); offsetBySignature = AngularTestUtil.findOffsetBySignature("phone-<caret>list", myFixture.getFile()); ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); resolve = ref.resolve(); assertInstanceOf(resolve, PsiFile.class); assertEquals("phone-list.html", ((PsiFile)resolve).getName()); offsetBySignature = AngularTestUtil.findOffsetBySignature("template<caret>Id", myFixture.getFile()); ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); resolve = ref.resolve(); assertInstanceOf(resolve, XmlAttributeValue.class); assertEquals("\"templateId.htm\"", resolve.getText()); } public void testNgIncludeResolve() { myFixture.configureByFiles("ng-include.html", "custom.js", "angular.js", "index.html"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("ind<caret>ex.html", myFixture.getFile()); PsiReference ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); PsiElement resolve = ref.resolve(); assertInstanceOf(resolve, PsiFile.class); assertEquals("index.html", ((PsiFile)resolve).getName()); } public void testPartialCompletion() { myFixture.configureByFiles("custom.js", "angular.js", "index.html", "partials/phone-details.html", "partials/phone-list.html"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("<caret>partials/phone-details", myFixture.getFile()); myFixture.getEditor().getCaretModel().moveToOffset(offsetBySignature); myFixture.completeBasic(); final List<String> variants = myFixture.getLookupElementStrings(); assertContainsElements(variants, "partials", "index.html", "templateId.htm"); } public void testControllerResolve() { myFixture.configureByFiles("custom.js", "angular.js", "partials/phone-details.html", "partials/phone-list.html"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("controller: 'App<caret>Ctrl'", myFixture.getFile()); PsiReference ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); PsiElement resolve = ref.resolve(); assertNotNull(resolve); assertEquals("'AppCtrl'", resolve.getParent().getText()); } public void testControllerCompletion() { myFixture.configureByFiles("custom.js", "angular.js"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("controller: '<caret>AppCtrl'", myFixture.getFile()); myFixture.getEditor().getCaretModel().moveToOffset(offsetBySignature); myFixture.completeBasic(); final List<String> variants = myFixture.getLookupElementStrings(); assertContainsElements(variants, "AppCtrl", "OtherCtrl"); } public void testControllerWithControllerAsCompletion() { myFixture.configureByFiles("custom1.js", "angular.js"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("controller: '<caret>AppCtrl'", myFixture.getFile()); myFixture.getEditor().getCaretModel().moveToOffset(offsetBySignature); myFixture.completeBasic(); final List<String> variants = myFixture.getLookupElementStrings(); assertContainsElements(variants, "AppCtrl", "localCtl", "localCtl2", "OtherCtrl"); } public void testControllerWithControllerAsResolve() { myFixture.configureByFiles("custom1.js", "angular.js", "partials/phone-details.html", "partials/phone-list.html"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("controller: 'local<caret>Ctl'", myFixture.getFile()); PsiReference ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); PsiElement resolve = ref.resolve(); assertNotNull(resolve); assertEquals("controller: function(){}", resolve.getParent().getText()); } public void testControllerWithControllerAsResolve2() { myFixture.configureByFiles("custom1.js", "angular.js", "partials/phone-details.html", "partials/phone-list.html"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("controller: 'local<caret>Ctl2'", myFixture.getFile()); PsiReference ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); PsiElement resolve = ref.resolve(); assertNotNull(resolve); assertEquals("'localCtl2'", resolve.getParent().getText()); } public void testNgAppResolve() { Extensions.getExtensions(FileIncludeProvider.EP_NAME); myFixture.configureByFiles("ngAppRouting.html", "myAppDefinition.js", "myAppUsage.js", "otherMyAppDefinition.js", "angular.js"); int offsetBySignature = AngularTestUtil.findOffsetBySignature("ng-app=\"my<caret>App\"", myFixture.getFile()); PsiReference ref = myFixture.getFile().findReferenceAt(offsetBySignature); assertNotNull(ref); PsiElement resolve = ref.resolve(); assertNotNull(resolve); assertEquals("'myApp'", resolve.getNavigationElement().getText()); assertEquals("myAppDefinition.js", resolve.getContainingFile().getName()); final ResolveResult[] results = ((PsiPolyVariantReference)ref).multiResolve(false); assertEquals(1, results.length); } public void testNgAppCompletion() throws Exception { myFixture.configureByFiles("ngAppCompletion.html", "dependencyModuleDefinition.js", "myAppDefinition.js", "myAppUsage.js", "otherMyAppDefinition.js", "angular.js"); myFixture.completeBasic(); final List<String> strings = myFixture.getLookupElementStrings(); assertNotNull(strings); assertTrue(strings.contains("myApp")); assertTrue(strings.contains("dependency")); } public void testModuleCompletion() throws Exception { myFixture.configureByFiles("moduleCompletion.js", "dependencyModuleDefinition.js", "myAppDefinition.js", "myAppUsage.js", "otherMyAppDefinition.js", "angular.js"); myFixture.completeBasic(); final List<String> strings = myFixture.getLookupElementStrings(); assertNotNull(strings); assertTrue(strings.contains("myApp")); assertTrue(strings.contains("dependency")); } public void testModuleNavigation() throws Exception { myFixture.configureByFiles("moduleNavigation.js", "dependencyModuleDefinition.js", "myAppDefinition.js", "myAppUsage.js", "angular.js"); assertModuleReferenceIsUnderCaret(true); final PsiReference reference = myFixture.getReferenceAtCaretPosition("moduleNavigation.js"); assertNotNull(reference); PsiElement resolve = reference.resolve(); assertNotNull(resolve); assertEquals("'myApp'", resolve.getNavigationElement().getText()); assertEquals("myAppDefinition.js", resolve.getContainingFile().getName()); final ResolveResult[] results = ((PsiPolyVariantReference)reference).multiResolve(false); assertEquals(1, results.length); } private void assertModuleReferenceIsUnderCaret(boolean value) { final JSLiteralExpression literal = PsiTreeUtil.getParentOfType(myFixture.getFile().findElementAt(myFixture.getCaretOffset()), JSLiteralExpression.class); assertNotNull(literal); final boolean accepts = AngularJSReferencesContributor.MODULE_PATTERN.accepts(literal); assertEquals(value, accepts); } public void testModuleDependenciesCompletion() throws Exception { myFixture.configureByFiles("moduleDependenciesCompletion.js", "dependencyModuleDefinition.js", "myAppDefinition.js", "myAppUsage.js", "otherMyAppDefinition.js", "angular.js"); myFixture.completeBasic(); final List<String> strings = myFixture.getLookupElementStrings(); assertNotNull(strings); assertTrue(strings.contains("myApp")); assertTrue(strings.contains("dependency")); assertTrue(strings.contains("new")); } public void testNotAModuleNoReference() throws Exception { myFixture.configureByFiles("notAModuleNoNavigation.js", "angular.js"); assertModuleReferenceIsUnderCaret(true); final PsiReference reference = myFixture.getReferenceAtCaretPosition("notAModuleNoNavigation.js"); assertNotNull(reference); final PsiElement resolve = reference.resolve(); assertNull(resolve); } public void testModuleNavigationWithAlias() throws Exception { myFixture.configureByFiles("moduleNavigationWithAlias.js", "dependencyModuleDefinition.js", "myAppDefinition.js", "myAppUsage.js", "angular.js"); assertModuleReferenceIsUnderCaret(true); final PsiReference reference = myFixture.getReferenceAtCaretPosition("moduleNavigationWithAlias.js"); assertNotNull(reference); PsiElement resolve = reference.resolve(); assertNotNull(resolve); assertEquals("'myApp'", resolve.getNavigationElement().getText()); assertEquals("myAppDefinition.js", resolve.getContainingFile().getName()); final ResolveResult[] results = ((PsiPolyVariantReference)reference).multiResolve(false); assertEquals(1, results.length); } public void testModuleDefinitionWrapperTopLevel() throws Exception { final String pr = "wrapperTopLevel/"; checkModuleDefinitionWrapper(pr, ""); } public void testModuleDefinitionWrapperGlobal() throws Exception { final String pr = "wrapperGlobal/"; checkModuleDefinitionWrapper(pr, "ApplicationConfiguration."); } private void checkModuleDefinitionWrapper(String pr, String declarationQualifier) { myFixture.configureByFiles(pr + "usage.es6", pr + "declaration.es6", pr + "wrapper.es6", "angular.js"); assertModuleReferenceIsUnderCaret(true); final PsiReference reference = myFixture.getReferenceAtCaretPosition(pr + "usage.es6"); assertNotNull(reference); PsiElement resolve = reference.resolve(); assertNotNull(resolve); assertEquals(declarationQualifier + "registerModule", resolve.getNavigationElement().getText()); assertTrue(resolve.getParent() instanceof JSCallExpression); assertEquals("discoverability", StringUtil.unquoteString(((JSCallExpression)resolve.getParent()).getArguments()[0].getText())); assertEquals("declaration.es6", resolve.getContainingFile().getName()); final ResolveResult[] results = ((PsiPolyVariantReference)reference).multiResolve(false); assertEquals(1, results.length); } }