diff options
Diffstat (limited to 'platform/external-system-api/dependency-updater/testSrc/com/intellij/externalSystem/MavenDependencyUpdaterTestBase.java')
-rw-r--r-- | platform/external-system-api/dependency-updater/testSrc/com/intellij/externalSystem/MavenDependencyUpdaterTestBase.java | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/platform/external-system-api/dependency-updater/testSrc/com/intellij/externalSystem/MavenDependencyUpdaterTestBase.java b/platform/external-system-api/dependency-updater/testSrc/com/intellij/externalSystem/MavenDependencyUpdaterTestBase.java new file mode 100644 index 000000000000..1df2785b6c58 --- /dev/null +++ b/platform/external-system-api/dependency-updater/testSrc/com/intellij/externalSystem/MavenDependencyUpdaterTestBase.java @@ -0,0 +1,119 @@ +package com.intellij.externalSystem; + +import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiUtilCore; +import com.intellij.psi.xml.XmlTag; +import com.intellij.rt.execution.junit.FileComparisonFailure; +import com.intellij.testFramework.VfsTestUtil; +import junit.framework.AssertionFailedError; +import com.intellij.maven.testFramework.MavenImportingTestCase; +import org.jetbrains.idea.maven.dom.MavenDomUtil; +import org.jetbrains.idea.maven.dom.model.MavenDomDependency; +import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.Arrays; + +abstract public class MavenDependencyUpdaterTestBase extends MavenImportingTestCase { + protected File myTestDataDir; + protected File myProjectDataDir; + protected File myExpectedDataDir; + protected DependencyModifierService myModifierService; + + @Override + public void setUp() throws Exception { + super.setUp(); + myTestDataDir = PathManagerEx.findFileUnderCommunityHome("platform/external-system-api/dependency-updater/testData/maven"); + assertTrue(myTestDataDir.isDirectory()); + myProjectDataDir = new File(new File(myTestDataDir, "projects"), getTestName(true)); + myExpectedDataDir = new File(new File(myTestDataDir, "expected"), getTestName(true)); + myModifierService = DependencyModifierService.getInstance(myProject); + prepareAndImport(); + } + + protected void prepareAndImport() throws IOException { + createProjectPom(""); + FileUtil.copyDir(myProjectDataDir, myProjectRoot.toNioPath().toFile()); + myProjectRoot.refresh(false, true); + importProjectWithErrors(); + } + + protected XmlTag findDependencyTag(String group, String artifact, String version) { + PsiFile pom = PsiUtilCore.getPsiFile(myProject, myProjectPom); + return findDependencyTag(group, artifact, version, pom); + } + + protected XmlTag findDependencyTag(String group, String artifact, String version, PsiFile pom) { + MavenDomProjectModel model = MavenDomUtil.getMavenDomModel(pom, MavenDomProjectModel.class); + for (MavenDomDependency dependency : model.getDependencies().getDependencies()) { + if (dependency.getGroupId().getStringValue().equals(group) && + dependency.getArtifactId().getStringValue().equals(artifact) && + dependency.getVersion().getStringValue().equals(version)) { + return dependency.getXmlTag(); + } + } + return null; + } + + protected void assertFilesAsExpected() throws IOException { + assertTrue(new File(myExpectedDataDir, "pom.xml").isFile()); + + Files.walkFileTree(myExpectedDataDir.toPath(), new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + File expectedFile = file.toFile(); + Path relativePath = myExpectedDataDir.toPath().relativize(file); + VirtualFile actual = myProjectRoot.findFileByRelativePath(FileUtil.normalize(relativePath.toString())); + if (actual == null) { + fail("File " + file + " not found in actual dir"); + } + String value = new String(actual.contentsToByteArray(), actual.getCharset()); + assertFilesAreIdenticalLineByLineIgnoringIndent(expectedFile.getPath(), value); + return FileVisitResult.CONTINUE; + } + }); + } + + private static void assertFilesAreIdenticalLineByLineIgnoringIndent(String expectedFilePath, String actualText) { + String expectedText; + try { + if (OVERWRITE_TESTDATA) { + VfsTestUtil.overwriteTestData(expectedFilePath, actualText); + //noinspection UseOfSystemOutOrSystemErr + System.out.println("File " + expectedFilePath + " created."); + } + expectedText = FileUtil.loadFile(new File(expectedFilePath), StandardCharsets.UTF_8); + } + catch (FileNotFoundException e) { + VfsTestUtil.overwriteTestData(expectedFilePath, actualText); + throw new AssertionFailedError("No output text found. File " + expectedFilePath + " created."); + } + catch (IOException e) { + throw new RuntimeException(e); + } + + var expectedLines = Arrays.stream(StringUtil.splitByLines(expectedText.trim(), true)) + .map(s -> s.stripLeading()) + .toArray(); + var actualLines = Arrays.stream(StringUtil.splitByLines(actualText.trim(), true)) + .map(s -> s.stripLeading()) + .toArray(); + + if (!Arrays.equals(expectedLines, actualLines)) { + throw new FileComparisonFailure(null, StringUtil.convertLineSeparators(expectedText.trim()), + StringUtil.convertLineSeparators(actualText.trim()), expectedFilePath); + } + } +} |