@@ -6,14 +6,20 @@ plugins {
66 alias(libs.plugins.kotlin.compose)
77 alias(libs.plugins.dagger.hilt)
88 alias(libs.plugins.kotlin.kapt)
9+ alias(libs.plugins.jacoco)
910}
11+
1012val localProperties = Properties ()
1113val localPropertiesFile = rootProject.file(" local.properties" )
1214
1315if (localPropertiesFile.exists()) {
1416 localProperties.load(localPropertiesFile.inputStream())
1517}
1618
19+ jacoco {
20+ toolVersion = " 0.8.11"
21+ }
22+
1723android {
1824 namespace = " com.asad.weatherapp"
1925 compileSdk = 36
@@ -41,6 +47,9 @@ android {
4147 }
4248
4349 buildTypes {
50+ debug {
51+ enableUnitTestCoverage = true
52+ }
4453 release {
4554 isMinifyEnabled = false
4655 proguardFiles(
@@ -102,4 +111,81 @@ dependencies {
102111 testImplementation(libs.kotlinx.coroutines.test)
103112 testImplementation(libs.mockk)
104113 testImplementation(libs.turbine)
105- }
114+ }
115+
116+ tasks.register<JacocoReport >(" jacocoTestReport" ) {
117+ dependsOn(" testDebugUnitTest" )
118+
119+ reports {
120+ xml.required.set(true )
121+ html.required.set(true )
122+ }
123+
124+ val fileFilter = listOf (
125+ // Android generated
126+ " **/R.class" ,
127+ " **/R$*.class" ,
128+ " **/BuildConfig.*" ,
129+ " **/Manifest*.*" ,
130+
131+ // Tests
132+ " **/*Test*.*" ,
133+
134+ // Dependency Injection / Hilt
135+ " **/di/**" ,
136+ " **/*Hilt*.*" ,
137+ " **/*_Factory.*" ,
138+ " **/*_MembersInjector.*" ,
139+
140+ // UI Packages to exclude
141+ " **/ui/theme/**" ,
142+ " **/ui/components/**" ,
143+ " **/ui/model/**" ,
144+ " **/ui/forecast/previews/**" ,
145+ " **/ui/forecast/WeatherForecastScreenKt.*" ,
146+ " **/*Lambda*.*" ,
147+
148+ // Data Packages to exclude
149+ " **/data/repository/**" ,
150+ " **/data/remote/**" ,
151+ " **/data/handler/**" ,
152+
153+ // Activities / Fragments (optional, if needed)
154+ " **/*Activity*.*" ,
155+ " **/*Fragment*.*" ,
156+ " **/*$*.*" ,
157+
158+ // Exclude main app classes
159+ " **/WeatherApp.class"
160+ )
161+
162+ val javaClasses = fileTree(
163+ mapOf (
164+ " dir" to " $buildDir /intermediates/javac/debug/classes" ,
165+ " excludes" to fileFilter
166+ )
167+ )
168+
169+ val kotlinClasses = fileTree(
170+ mapOf (
171+ " dir" to " $buildDir /tmp/kotlin-classes/debug" ,
172+ " excludes" to fileFilter
173+ )
174+ )
175+
176+ classDirectories.setFrom(files(javaClasses, kotlinClasses))
177+
178+ sourceDirectories.setFrom(
179+ files(
180+ " src/main/java" ,
181+ " src/main/kotlin"
182+ )
183+ )
184+
185+ executionData.setFrom(
186+ fileTree(buildDir).include(
187+ " outputs/unit_test_code_coverage/debugUnitTest/testDebugUnitTest.exec"
188+ )
189+ )
190+ }
191+
0 commit comments