testSrc/org/jetbrains/jps/JpsBuildTestCase.groovy (86 lines of code) (raw):
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.jps
import junit.framework.TestCase
import org.codehaus.gant.GantBinding
import org.jetbrains.jps.idea.IdeaProjectLoader
import org.jetbrains.jps.util.FileSystemItem
import org.jetbrains.jps.util.TempFiles
import org.jetbrains.jps.idea.AntErrorReporter
/**
* @author nik
*/
abstract class JpsBuildTestCase extends TestCase {
private TempFiles myTempFiles;
@Override
protected void setUp() {
myTempFiles = new TempFiles();
}
@Override
protected void tearDown() {
myTempFiles.cleanup();
}
def doTest(String projectPath, Closure initProject, Closure expectedOutput) {
doTest(projectPath, [:], initProject, expectedOutput)
}
def doTest(String projectPath, Map<String, String> pathVariables, Closure initProject, Closure expectedOutput) {
ProjectBuilder projectBuilder = buildAll(projectPath, pathVariables, initProject)
assertOutput(projectBuilder.targetFolder, expectedOutput);
}
def protected assertOutput(String targetFolder, Closure expectedOutput) {
def root = new FileSystemItem(name: "<root>")
initFileSystemItem(root, expectedOutput)
root.assertDirectoryEqual(new File(targetFolder), "")
}
def protected buildAll(String projectPath, Map<String, String> pathVariables, Closure initProject) {
Project project = loadProject(projectPath, pathVariables)
def target = createTempDir()
ProjectBuilder builder = createBuilder(project)
builder.targetFolder = target.absolutePath
if (initProject != null) {
initProject(project, builder)
}
builder.clean()
builder.buildAll()
builder.buildArtifacts()
builder.deleteTempFiles()
return builder
}
protected ProjectBuilder createBuilder(Project project) {
return ((GantBasedProject) project).builder
}
protected Project loadProject(String projectPath, Map<String, String> pathVariables) {
return loadProject(projectPath, pathVariables, {})
}
protected Project loadProject(String projectPath, Map<String, String> pathVariables, Closure initGlobal) {
def binding = new GantBinding()
binding.includeTool << Jps
def project = new GantBasedProject(binding)
initGlobal(project)
IdeaProjectLoader.loadFromPath(project, projectPath, pathVariables, null, new AntErrorReporter(binding))
return project
}
def initFileSystemItem(FileSystemItem item, Closure initializer) {
def meta = new InitializingExpando()
meta.dir = {String name, Closure content ->
def dir = new FileSystemItem(name: name, directory: true)
initFileSystemItem(dir, content)
item << dir
}
meta.archive = {String name, Closure content ->
def archive = new FileSystemItem(name: name, archive: true)
initFileSystemItem(archive, content)
item << archive
}
meta.file = {Object[] args ->
item << new FileSystemItem(name: args[0], content: args.length > 1 ? args[1] : null)
}
initializer.delegate = meta
initializer.setResolveStrategy Closure.DELEGATE_FIRST
initializer()
}
def File createTempDir() {
return myTempFiles.createTempDir();
}
def File createTempFile() {
return myTempFiles.createTempFile();
}
}
interface ProjectInitializer {
void init(Project project, ProjectBuilder projectBuilder)
}