diff --git a/Library/build.gradle.kts b/Library/build.gradle.kts index fec15e8..4ee8336 100644 --- a/Library/build.gradle.kts +++ b/Library/build.gradle.kts @@ -1,7 +1,10 @@ +import org.gradle.kotlin.dsl.invoke + plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) alias(libs.plugins.android.coveralls) + id("jacoco") } android { @@ -23,6 +26,9 @@ android { "proguard-rules.pro" ) } + debug { // Asegúrate de que los reports de test estén habilitados para debug + enableUnitTestCoverage = true + } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 @@ -32,7 +38,9 @@ android { jvmTarget = "17" } } - +jacoco { + toolVersion = "0.8.5" // La versión que sugeriste en la documentación +} dependencies { implementation(libs.androidx.core.ktx) @@ -45,3 +53,114 @@ dependencies { androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) } + +tasks.register("jacocoReport", JacocoReport::class) { + dependsOn("test") // Aseguramos que los unit tests se ejecuten antes + + group = "Reporting" + description = "Generates JaCoCo coverage report for the Library module." + + reports { + xml.required.set(true) + html.required.set(true) + } + + val fileTreeConfig: (ConfigurableFileTree) -> Unit = { + it.exclude( + "**/R.class", "**/R\$*.class", "**/BuildConfig.*", "**/Manifest*.*", // Android + "android/**/*.*", + "**/*_Factory.class", "**/*_MembersInjector.class", "**/*_Provide*.class" // Dagger/Hilt generated classes (if applicable) + ) + } + + sourceDirectories.setFrom(files( + "${project.projectDir}/src/main/java", + "${project.projectDir}/src/main/kotlin" // Añadido para Kotlin + )) + + // Rutas de clases compiladas + classDirectories.setFrom( + fileTree("${project.buildDir}/intermediates/javac/debug") { fileTreeConfig(this) } + + fileTree("${project.buildDir}/tmp/kotlin-classes/debug") { fileTreeConfig(this) } + // Si tienes otros paths de clases compiladas (ej. para variantes específicas), añádelas aquí + ) + + // Rutas de datos de ejecución de JaCoCo + executionData.setFrom(fileTree(project.buildDir) { + include("jacoco/testDebugUnitTest.exec") // Para Unit Tests + // include("outputs/code_coverage/debugAndroidTest/connected_coverage.exec") // Si tienes Instrumented Tests y quieres incluirlos + }) + + // Asegúrate de que los archivos de ejecución existan antes de procesar + doFirst { + executionData.setFrom(files(executionData.filter { it.exists() })) + } +} + +tasks { + register("jacocoFullReport", JacocoReport::class) { + val jacocoReportTask = this + + group = "Coverage reports" + + val subTasks = getByName("jacocoReport", JacocoReport::class) + dependsOn(subTasks) + + val subSourceDirs = subTasks.sourceDirectories + additionalSourceDirs.setFrom(subSourceDirs) + sourceDirectories.setFrom(subSourceDirs) + + classDirectories.setFrom(files(subTasks.classDirectories)) + executionData.setFrom(files(subTasks.executionData)) + + reports { + html.required = true + html.outputLocation = file("$buildDir/reports/jacoco/html") + + xml.required = true + xml.outputLocation = file("$buildDir/reports/jacoco/jacocoFullReport.xml") + } + + doFirst { + executionData.setFrom(files(executionData.filter { it.exists() })) + } + + coverallsJacoco { + dependsOn(jacocoReportTask) + + reportPath = "$buildDir/reports/jacoco/jacocoFullReport.xml" + reportSourceSets = subSourceDirs.flatMap { files(it) } + } + } +} + + +// **Configuración para el plugin de Coveralls:** +// El plugin de Coveralls (asumiendo que es `com.github.klieber.coveralls`) +// automáticamente buscará una tarea JacocoReport y la usará. +// Por defecto, crea una tarea llamada `coverallsJacoco`. +// Solo necesitamos asegurarnos de que `coverallsJacoco` dependa de nuestro `jacocoReport` personalizado. +tasks.named("coverallsJacoco") { + dependsOn(tasks.named("jacocoReport")) // Asegura que 'jacocoReport' se ejecute antes de coverallsJacoco +} + +// Opcional: Si quieres un reporte JaCoCo para instrumented tests +// tasks.register("jacocoAndroidTestReport", JacocoReport::class) { +// dependsOn("createDebugCoverageReport") // Esta tarea se genera por AGP para instrumented tests +// group = "Reporting" +// description = "Generates JaCoCo coverage report for Android Instrumented Tests." +// +// reports { +// xml.required.set(true) +// html.required.set(true) +// } +// +// classDirectories.setFrom(fileTree("${project.buildDir}/intermediates/javac/debug") + +// fileTree("${project.buildDir}/tmp/kotlin-classes/debug")) +// +// executionData.setFrom(fileTree(project.buildDir) { +// include("outputs/code_coverage/debugAndroidTest/connected_coverage.exec") +// }) +// +// sourceSets.setFrom(files("${project.projectDir}/src/main/java", "${project.projectDir}/src/main/kotlin")) +// } diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b540729..33cd325 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -6,12 +6,12 @@ plugins { android { namespace = "com.blipblipcode.datetime" - compileSdk = 35 + compileSdk = 36 defaultConfig { applicationId = "com.blipblipcode.datetime" minSdk = 24 - targetSdk = 35 + targetSdk = 36 versionCode = 1 versionName = "1.0" @@ -48,8 +48,8 @@ dependencies { implementation(platform(libs.androidx.compose.bom)) implementation(libs.threetenabp) - implementation(project(":Library")) - //implementation(libs.dateTime) + //implementation(project(":Library")) + implementation(libs.dateTime) implementation(libs.androidx.ui) implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.tooling.preview)