package requirejs; import com.intellij.lang.javascript.psi.JSFile; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference; import requirejs.settings.Settings; public class ReferenceTest extends RequirejsTestCase { @Override public void setUp() throws Exception { super.setUp(); myFixture.configureByFiles( "public/blocks/referenceTest.js", "public/blocks/fileWithTwoDotPath.js", "public/blocks/childWebPathFile.js", "public/blocks/fileWithDotPath.js", "public/main.js", "public/blocks/block.js", "public/blocks/childBlocks/childBlock.js", "public/rootWebPathFile.js", "public/blocks/childBlocks/templates/index.html" ); setWebPathSetting(); } public void testReference() { PsiReference reference; PsiElement referenceElement; // referenceNotFound myFixture.getEditor().getCaretModel().moveToLogicalPosition(new LogicalPosition(1, 40)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'app/as'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // referenceTrue myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(2, 40)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // referenceNotFound2 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(3, 40)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof PsiMultiReference); reference = ((PsiMultiReference) reference).getReferences()[1]; assertEquals("'bl'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // referenceDirectory myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(4, 40)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'blocks/childBlocks'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // referenceWithTwoDot myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(5, 46)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'../blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // referenceWithTwoDotTwoDir myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(6, 49)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'../blocks/childBlocks/childBlock'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("childBlock.js", ((JSFile) referenceElement).getName()); // referenceWithOneDot myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(7, 44)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'./block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // referenceWithOneDotTwoDir myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(8, 50)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'./childBlocks/childBlock'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("childBlock.js", ((JSFile) referenceElement).getName()); } public void testReferenceWithBaseUrl() { PsiReference reference; PsiElement referenceElement; myFixture.configureByFiles("public/fileForTestBaseUrlReference.js", "public/mainWithBaseUrl.js"); Settings.getInstance(getProject()).configFilePath = "mainWithBaseUrl.js"; // referenceNotFound myFixture.getEditor().getCaretModel().moveToLogicalPosition(new LogicalPosition(1, 40)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'app/as'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // 1 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(2, 33)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // 2 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(3, 33)); reference = myFixture.getReferenceAtCaretPosition(); assert null != reference; reference = ((PsiMultiReference)reference).getReferences()[1]; assertTrue(reference instanceof RequirejsReference); assertEquals("'block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // 3 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(4, 33)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'childBlocks/childBlock'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("childBlock.js", ((JSFile) referenceElement).getName()); // 4 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(5, 33)); reference = myFixture.getReferenceAtCaretPosition(); assert null != reference; reference = ((PsiMultiReference)reference).getReferences()[1]; assertTrue(reference instanceof RequirejsReference); assertEquals("'childBlocks'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // 5 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(6, 33)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // 6 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(7, 33)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'/blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // 7 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(8, 33)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'/childBlocks/childBlock'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertNull(referenceElement); // 8 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(9, 33)); reference = myFixture.getReferenceAtCaretPosition(); assertTrue(reference instanceof RequirejsReference); assertEquals("'./blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // 9 // TODO: Add check for parent root web directory // myFixture // .getEditor() // .getCaretModel() // .moveToLogicalPosition(new LogicalPosition(10, 33)); // reference = myFixture.getReferenceAtCaretPosition(); // assertTrue(reference instanceof RequirejsReference); // assertEquals("'../public/blocks/block'", reference.getCanonicalText()); // referenceElement = reference.resolve(); // assertNull(referenceElement); } public void testCompletionInDefine() { myFixture.configureByFiles("public/blocks/fileWithDefine.js"); PsiReference reference; PsiElement referenceElement; // 1 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(5, 18)); reference = myFixture.getReferenceAtCaretPosition(); assert null != reference; reference = ((PsiMultiReference)reference).getReferences()[1]; assertTrue(reference instanceof RequirejsReference); assertEquals("'blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // 2 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(5, 33)); reference = myFixture.getReferenceAtCaretPosition(); assert null != reference; reference = ((PsiMultiReference)reference).getReferences()[1]; assertTrue(reference instanceof RequirejsReference); assertEquals("'/blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); // 3 myFixture .getEditor() .getCaretModel() .moveToLogicalPosition(new LogicalPosition(5, 51)); reference = myFixture.getReferenceAtCaretPosition(); assert null != reference; reference = ((PsiMultiReference)reference).getReferences()[1]; assertTrue(reference instanceof RequirejsReference); assertEquals("'./blocks/block'", reference.getCanonicalText()); referenceElement = reference.resolve(); assertTrue(referenceElement instanceof JSFile); assertEquals("block.js", ((JSFile) referenceElement).getName()); } public void testCompletionWithConfigWithRelativePath() { myFixture.configureByFiles( "public/fileForTestConfigWithRelativePathReference.js", "public/sub/mainWithRelativePath.js", "public/sub/kits/kit.js" ); Settings.getInstance(getProject()).configFilePath = "sub/mainWithRelativePath.js"; PsiReference reference; // 1 reference = getReferenceForHumanPosition(2, 35); assertReference(reference, "'pathForBlock'", "block.js"); // 2 reference = getReferenceForHumanPosition(3, 35); assertReference(reference, "'pathForDirectoryTwoDot/block'", "block.js"); // 3 reference = getReferenceForHumanPosition(4, 35); assertReference(reference, "'pathForDirectoryOneDot/kits/kit'", "kit.js"); // 4 reference = getReferenceForHumanPosition(5, 35); assertReference(reference, "'pathForKit'", "kit.js"); // 5 reference = getReferenceForHumanPosition(6, 35); assertReference(reference, "'pathForDirOneDotWithDir/kit'", "kit.js"); // 6 reference = getReferenceForHumanPosition(7, 35); assertReference(reference, "'pathForNotFound'", null); } public void testPathToDirectory() { myFixture.configureByFile("public/fileForTestPathToDirectory.js"); Settings.getInstance(getProject()).configFilePath = "fileForTestPathToDirectory.js"; PsiReference reference = getReferenceForHumanPosition(9, 13); assertReference(reference, "block/block", "block.js"); } public void testMagicModulesReference() { myFixture.configureByFile("public/fileWithMagicModules.js"); PsiReference reference = getReferenceForHumanPosition(2, 38); assertReference(reference, "exports", "fileWithMagicModules.js"); reference = getReferenceForHumanPosition(3, 38); assertReference(reference, "module", "fileWithMagicModules.js"); reference = getReferenceForHumanPosition(4, 38); assertReference(reference, "require", "fileWithMagicModules.js"); } }