package com.jetbrains.lang.dart.highlighting; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.daemon.impl.analysis.HtmlUnknownTargetInspection; import com.intellij.codeInspection.htmlInspections.HtmlUnknownTagInspection; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor; import com.intellij.spellchecker.inspections.SpellCheckingInspection; import com.jetbrains.lang.dart.DartCodeInsightFixtureTestCase; import com.jetbrains.lang.dart.ide.inspections.DartPathPackageReferenceInspection; import com.jetbrains.lang.dart.util.DartResolveUtil; import java.util.List; public class DartHighlightingTest extends DartCodeInsightFixtureTestCase { protected String getBasePath() { return "/highlighting"; } private void excludeFolder(final String relPath) { ApplicationManager.getApplication().runWriteAction(() -> { final ModifiableRootModel model = ModuleRootManager.getInstance(myModule).getModifiableModel(); try { final ContentEntry[] contentEntries = model.getContentEntries(); contentEntries[0].addExcludeFolder(contentEntries[0].getUrl() + "/" + relPath); model.commit(); } finally { if (!model.isDisposed()) { model.dispose(); } } }); } private void unexcludeFolder(final String relPath) { ApplicationManager.getApplication().runWriteAction(() -> { final ModifiableRootModel model = ModuleRootManager.getInstance(myModule).getModifiableModel(); try { final ContentEntry[] contentEntries = model.getContentEntries(); contentEntries[0].removeExcludeFolder(contentEntries[0].getUrl() + "/" + relPath); model.commit(); } finally { if (!model.isDisposed()) { model.dispose(); } } }); } public void testScriptSrcPathToPackagesFolder() { final String testName = getTestName(false); myFixture.enableInspections(HtmlUnknownTargetInspection.class); myFixture.addFileToProject("pubspec.yaml", "name: ProjectName\n" + "dependencies:\n" + " PathPackage:\n" + " path: local_package\n"); myFixture.addFileToProject("lib/projectFile.dart", ""); myFixture.addFileToProject("local_package/lib/localPackageFile.html", ""); myFixture.addFileToProject("packages/browser/dart.js", ""); myFixture.configureByFile(testName + "/" + testName + ".html"); myFixture.checkHighlighting(true, false, true); } public void testSpelling() { myFixture.enableInspections(SpellCheckingInspection.class); myFixture.configureByFile(getTestName(false) + ".dart"); myFixture.checkHighlighting(true, false, true); } public void testEscapeSequences() { myFixture.configureByFile(getTestName(false) + ".dart"); myFixture.checkHighlighting(true, true, true); } public void testBuiltInIdentifiers() { myFixture.configureByFile(getTestName(false) + ".dart"); myFixture.checkHighlighting(false, true, true); } public void testSyncAsyncAwaitYield() { myFixture.configureByFile(getTestName(false) + ".dart"); myFixture.checkHighlighting(true, true, true); // now check that reparsing because of typing inside a reparseable block doesn't loose knowledge that the method is async final List<HighlightInfo> oldHighlighting = myFixture.doHighlighting(); myFixture.type(' '); assertSameElements(myFixture.doHighlighting(), oldHighlighting); } public void testColorAnnotatorIdePart() { // includes cases not covered by testSyncAsyncAwaitYield, testBuiltInIdentifiers and testEscapeSequences myFixture.configureByFile(getTestName(false) + ".dart"); myFixture.checkHighlighting(true, true, true); } public void testSimplePolymer() { myFixture.enableInspections(HtmlUnknownTagInspection.class); myFixture.addFileToProject("pubspec.yaml", "name: ThisProject\n" + "dependencies:\n" + " PathPackage:\n" + " path: PathPackage\n"); myFixture.addFileToProject("lib/custom_element.html", "<polymer-element name='custom-element'/>"); myFixture.addFileToProject("PathPackage/lib/in_path_package.html", "<polymer-element name='path-package-element'/>"); addStandardPackage("polymer"); addStandardPackage("core_elements"); myFixture.configureByFile(getTestName(false) + "/web/" + getTestName(false) + ".html"); myFixture.checkHighlighting(true, false, true); } public void testPathPackageReferenceInspection() { myFixture.enableInspections(new DartPathPackageReferenceInspection()); myFixture.copyDirectoryToProject(getTestName(false), ""); myFixture.openFileInEditor(ModuleRootManager.getInstance(myModule).getContentRoots()[0].findChild("pubspec.yaml")); excludeFolder("other_project"); try { myFixture.checkHighlighting(true, false, true); } finally { unexcludeFolder("other_project"); } } public void _testRenameImportedFile() { myFixture.addFileToProject("pubspec.yaml", "name: ProjectName\n"); final PsiFile libFile = myFixture.addFileToProject("lib/libFile.dart", ""); final PsiFile libFile2 = myFixture.addFileToProject("lib/sub/libFile2.dart", "import '''../libFile.dart''';\n" + "import '''package:ProjectName/libFile.dart''';"); final PsiFile libFile3 = myFixture.addFileToProject("lib/libFile3.dart", "part '../lib/libFile.dart';\n" + "part 'package:ProjectName/sub/../libFile.dart';"); final PsiFile webFile = myFixture.addFileToProject("web/webFile.dart", "import r'../lib/libFile.dart'\n" + "import r'package:ProjectName/libFile.dart'"); myFixture.renameElement(libFile, "renamed.dart"); myFixture.openFileInEditor(libFile2.getVirtualFile()); myFixture.checkResult("import '''../renamed.dart''';\n" + "import '''package:ProjectName/renamed.dart''';"); myFixture.openFileInEditor(libFile3.getVirtualFile()); myFixture.checkResult("part 'renamed.dart';\n" + "part 'package:ProjectName/renamed.dart';"); myFixture.openFileInEditor(webFile.getVirtualFile()); myFixture.checkResult("import r'../lib/renamed.dart'\n" + "import r'package:ProjectName/renamed.dart'"); } public void _testUpdateImportsOnFileMove() { myFixture.addFileToProject("pubspec.yaml", "name: ProjectName\n"); final PsiFile libFile = myFixture.addFileToProject("lib/libFile.dart", ""); final PsiFile libFile2 = myFixture.addFileToProject("lib/sub/libFile2.dart", "import '../libFile.dart';\n" + "import 'package:ProjectName/libFile.dart';"); new MoveFilesOrDirectoriesProcessor(getProject(), new PsiElement[]{libFile2}, libFile.getParent(), true, true, true, null, null).run(); myFixture.openFileInEditor(libFile2.getVirtualFile()); myFixture.checkResult("import 'libFile.dart';\n" + "import 'package:ProjectName/libFile.dart';"); } public void testUriInPartOf() throws Exception { final PsiFile libFile = myFixture.addFileToProject("foo/bar/libFile.dart", "library libName;"); final PsiFile part1File = myFixture.addFileToProject("part1.dart", "part of 'part1.dart'"); // self reference final PsiFile part2File = myFixture.addFileToProject("part2.dart", "part of 'foo/bar/wrong.dart'"); // wrong reference final PsiFile part3File = myFixture.addFileToProject("part3.dart", "part of 'foo/bar/libFile.dart"); // reference to libName final PsiFile part4File = myFixture.addFileToProject("part4.dart", "part of anotherLib;"); // reference to anotherLib assertEquals("libName", DartResolveUtil.getLibraryName(libFile)); assertEquals("part1.dart", DartResolveUtil.getLibraryName(part1File)); assertEquals("wrong.dart", DartResolveUtil.getLibraryName(part2File)); assertEquals("libName", DartResolveUtil.getLibraryName(part3File)); assertEquals("anotherLib", DartResolveUtil.getLibraryName(part4File)); } }