name.remal.gradle_plugins.testing.dsl.BaseProjectTest.kt Maven / Gradle / Ivy
package name.remal.gradle_plugins.testing.dsl
import name.remal.KotlinAllOpen
import name.remal.asSynchronized
import name.remal.default
import name.remal.newTempDir
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.testfixtures.ProjectBuilder
import org.gradle.wrapper.GradleUserHomeLookup.gradleUserHome
import org.junit.Rule
import org.junit.rules.TestWatcher
import org.junit.runner.Description
abstract class BaseProjectTest {
protected val project: Project by lazy { newTempProject() }
private val createdProjects = mutableListOf().asSynchronized()
protected fun newTempProject(name: String): Project {
val prefix = "gradle-test-project-"
val projectDir = newTempDir("$prefix$name-", doDeleteOnExit = false)
return ProjectBuilder.builder()
.withGradleUserHomeDir(gradleUserHome())
.withProjectDir(projectDir)
.withName(projectDir.name)
.build()
.also { createdProjects.add(it) }
}
protected fun newTempProject(): Project {
val stackTraceElement = Throwable().stackTrace.firstOrNull {
val className = it.className
!className.isNullOrEmpty()
&& className != BaseProjectTest::class.java.name
&& !className.startsWith(BaseProjectTest::class.java.name + "$")
&& !className.startsWith("java.")
&& !className.startsWith("jdk.")
&& !className.startsWith("javax.")
&& !className.startsWith("kotlin.")
&& !className.startsWith("groovy.")
&& !className.startsWith("scala.")
}
val name = stackTraceElement
?.run { "${className.substringAfterLast('.')}.$methodName" }
?.replace(Regex("\\W"), "-")
.default()
return newTempProject(name)
}
@get:Rule
val cleanerTestWatcher = object : TestWatcher() {
override fun succeeded(description: Description?) {
createdProjects.forEach {
it.rootDir.deleteRecursively()
}
}
}
protected fun Project.newSubproject(name: String): Project {
return ProjectBuilder.builder()
.withName(name)
.withParent(this)
.build()
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy