All Downloads are FREE. Search and download functionalities are using the official Maven repository.

name.remal.gradle_plugins.testing.dsl.BaseProjectTest.kt Maven / Gradle / Ivy

package name.remal.gradle_plugins.testing.dsl

import com.google.common.annotations.VisibleForTesting
import name.remal.asSynchronized
import name.remal.default
import name.remal.newTempDir
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

@VisibleForTesting
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("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()
            }
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy