// Copyright 2016 Pants project contributors (see CONTRIBUTORS.md). // Licensed under the Apache License, Version 2.0 (see LICENSE). package com.twitter.intellij.pants.integration; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.psi.search.FilenameIndex; import com.intellij.psi.search.GlobalSearchScope; import com.twitter.intellij.pants.testFramework.OSSPantsIntegrationTest; import com.twitter.intellij.pants.testFramework.PantsTestUtils; import com.twitter.intellij.pants.util.PantsUtil; import org.jetbrains.annotations.NotNull; import java.io.File; import java.util.Collection; import java.util.Collections; public class OSSFileSyncIntegrationTest extends OSSPantsIntegrationTest { public void testFileSync() throws Throwable { ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override public void run() { doImport("examples/tests/java/org/pantsbuild/example/useproto"); /** * Open 'Distances.java' in editor and make sure it only contains `getNumber` and not `getNewDummyNumber`. */ FileEditorManager.getInstance(myProject).openFile(searchForVirtualFileInProject("Distances.java"), true); Editor editor = FileEditorManager.getInstance(myProject).getSelectedTextEditor(); assertContainsSubstring(Collections.singletonList(editor.getDocument().getText()), "getNumber()"); assertNotContainsSubstring(Collections.singletonList(editor.getDocument().getText()), "getNewDummyNumber()"); /** * Find distances.proto, and replaces it with the new text which adds the line "required int64 new_dummy_number = 3" */ Document distanceDotProtoDoc = getDocumentFileInProject("distances.proto"); Document newDistanceProtoDoc = getTestData("testData/protobuf/distances.proto"); distanceDotProtoDoc.setText(newDistanceProtoDoc.getText()); /** * Refresh projects and make sure `getNewDummyNumber()` is loaded into the Editor. */ PantsUtil.refreshAllProjects(myProject); assertContainsSubstring(Collections.singletonList(editor.getDocument().getText()), "getNumber()"); assertContainsSubstring(Collections.singletonList(editor.getDocument().getText()), "getNewDummyNumber()"); } }); } @Override public void tearDown() throws Exception { gitResetRepoCleanExampleDistDir(); super.tearDown(); } @NotNull private Document getTestData(String testDataPath) { File dataFile = PantsTestUtils.findTestPath(testDataPath); VirtualFile dataVirtualFile = VirtualFileManager.getInstance().findFileByUrl("file://" + dataFile.getPath()); assertNotNull(dataVirtualFile); Document dataDocument = FileDocumentManager.getInstance().getDocument(dataVirtualFile); assertNotNull(dataDocument); return dataDocument; } /** * Find document in project by filename. */ @NotNull private Document getDocumentFileInProject(String filename) { VirtualFile sourceFile = searchForVirtualFileInProject(filename); Document doc = FileDocumentManager.getInstance().getDocument(sourceFile); assertNotNull(String.format("%s not found.", filename), doc); return doc; } /** * Find VirtualFile in project by filename. */ @NotNull private VirtualFile searchForVirtualFileInProject(String filename) { Collection<VirtualFile> files = FilenameIndex.getVirtualFilesByName(myProject, filename, GlobalSearchScope.allScope(myProject)); assertEquals(1, files.size()); return files.iterator().next(); } }