diff --git a/app/build.gradle.kts b/app/build.gradle.kts index aab4c0a..40856ce 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -80,6 +80,10 @@ kotlin { implementation("io.ktor:ktor-client-okhttp:$ktorVersion") } + jvmTest.dependencies { + implementation(kotlin("reflect")) + } + jsMain.dependencies { implementation("io.ktor:ktor-client-js:$ktorVersion") diff --git a/app/src/commonMain/kotlin/it/vercruysse/lemmyapi/v0x19/datatypes/CommunityAggregates.kt b/app/src/commonMain/kotlin/it/vercruysse/lemmyapi/v0x19/datatypes/CommunityAggregates.kt index 8269e8a..6674b82 100644 --- a/app/src/commonMain/kotlin/it/vercruysse/lemmyapi/v0x19/datatypes/CommunityAggregates.kt +++ b/app/src/commonMain/kotlin/it/vercruysse/lemmyapi/v0x19/datatypes/CommunityAggregates.kt @@ -13,5 +13,5 @@ data class CommunityAggregates( val users_active_week: Int, val users_active_month: Int, val users_active_half_year: Int, - val subscribers_local: Int?, + val subscribers_local: Int? = null, ) diff --git a/app/src/jvmTest/kotlin/DatatypesValidation.kt b/app/src/jvmTest/kotlin/DatatypesValidation.kt new file mode 100644 index 0000000..6d4bfa3 --- /dev/null +++ b/app/src/jvmTest/kotlin/DatatypesValidation.kt @@ -0,0 +1,42 @@ +import java.io.BufferedReader +import java.io.InputStream +import java.io.InputStreamReader +import kotlin.reflect.full.primaryConstructor +import kotlin.test.Test +import kotlin.test.fail + +class DatatypesValidation { + private val versions = listOf("v0x18", "v0x19") + + @Test + fun `all datatypes that are nullable should also be optional`() { + versions.flatMap { getClasses(this.javaClass.classLoader, "it/vercruysse/lemmyapi/$it/datatypes") } + .forEach { clazz -> + val kClass = clazz.kotlin + if (kClass.isData) { + val primaryConstructor = kClass.primaryConstructor + primaryConstructor?.parameters?.forEach { parameter -> + if (parameter.type.isMarkedNullable && !parameter.isOptional) { + fail("Parameter ${parameter.name} of class ${clazz.name} is nullable but not optional") + } + } + } + } + } + + @Throws(Exception::class) + private fun getClasses(cl: ClassLoader, pack: String): List> { + val dottedPackage = pack.replace("[/]".toRegex(), ".") + val classes: MutableList> = ArrayList() + val upackage = cl.getResource(pack) + + val dis = BufferedReader(InputStreamReader(upackage?.getContent() as InputStream)) + var line: String? + while ((dis.readLine().also { line = it }) != null) { + if (line!!.endsWith(".class")) { + classes.add(Class.forName(dottedPackage + "." + line!!.substring(0, line!!.lastIndexOf('.')))) + } + } + return classes + } +} diff --git a/gradle.properties b/gradle.properties index 63f418b..a5e3c11 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,4 +19,4 @@ POM_DEVELOPER_URL=https://github.com/MV-GH POM_ARTIFACT_ID=lemmy-api GROUP=it.vercruysse.lemmyapi -VERSION_NAME=0.2.4-SNAPSHOT +VERSION_NAME=0.2.5-SNAPSHOT