From 4338d821e50e70d83be93790b612c3e715796de0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 10 Oct 2023 21:31:45 +0200 Subject: [PATCH] Konsist: improve test about no default value for State classes, and fix new detected issues. --- .../io/element/android/app/KonsistTest.kt | 22 +++++++++---- .../invitelist/impl/InviteListState.kt | 8 ++--- .../impl/InviteListStateProvider.kt | 4 +++ .../features/leaveroom/api/LeaveRoomState.kt | 8 ++--- .../leaveroom/api/LeaveRoomStateProvider.kt | 23 +++++++++---- .../leaveroom/fake/FakeLeaveRoomPresenter.kt | 9 ++++-- .../poll/impl/create/CreatePollState.kt | 2 +- .../impl/create/CreatePollStateProvider.kt | 32 +++++++++++++++---- .../impl/RoomDetailsStateProvider.kt | 3 +- .../roomlist/impl/RoomListStateProvider.kt | 3 +- 10 files changed, 82 insertions(+), 32 deletions(-) diff --git a/app/src/test/kotlin/io/element/android/app/KonsistTest.kt b/app/src/test/kotlin/io/element/android/app/KonsistTest.kt index bb063bb2e5..bf44b0c2ed 100644 --- a/app/src/test/kotlin/io/element/android/app/KonsistTest.kt +++ b/app/src/test/kotlin/io/element/android/app/KonsistTest.kt @@ -19,8 +19,10 @@ package io.element.android.app import androidx.compose.runtime.Composable import com.lemonappdev.konsist.api.KoModifier import com.lemonappdev.konsist.api.Konsist +import com.lemonappdev.konsist.api.ext.list.constructors import com.lemonappdev.konsist.api.ext.list.modifierprovider.withoutModifier import com.lemonappdev.konsist.api.ext.list.modifierprovider.withoutOverrideModifier +import com.lemonappdev.konsist.api.ext.list.parameters import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf import com.lemonappdev.konsist.api.ext.list.withAllParentsOf import com.lemonappdev.konsist.api.ext.list.withNameEndingWith @@ -40,7 +42,9 @@ class KonsistTest { Konsist.scopeFromProject() .classes() .withAllParentsOf(Presenter::class) - .assertTrue { it.name.endsWith("Presenter") } + .assertTrue { + it.name.endsWith("Presenter") + } } @Test @@ -94,12 +98,16 @@ class KonsistTest { .scopeFromProject() .classes() .withNameEndingWith("State") - .assertTrue { classDeclaration -> - classDeclaration.constructors.all { constructorDeclaration -> - constructorDeclaration.parameters.all { parameterDeclaration -> - parameterDeclaration.defaultValue == null - } - } + .withoutName( + "CameraPositionState", + ) + .constructors + .parameters + .assertTrue { parameterDeclaration -> + parameterDeclaration.defaultValue == null && + // Using parameterDeclaration.defaultValue == null is not enough apparently, + // Also check that the text does not contain an equal sign + parameterDeclaration.text.contains("=").not() } } diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt index c1e00727f9..43644cd6aa 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListState.kt @@ -25,10 +25,10 @@ import kotlinx.collections.immutable.ImmutableList @Immutable data class InviteListState( val inviteList: ImmutableList, - val declineConfirmationDialog: InviteDeclineConfirmationDialog = InviteDeclineConfirmationDialog.Hidden, - val acceptedAction: Async = Async.Uninitialized, - val declinedAction: Async = Async.Uninitialized, - val eventSink: (InviteListEvents) -> Unit = {} + val declineConfirmationDialog: InviteDeclineConfirmationDialog, + val acceptedAction: Async, + val declinedAction: Async, + val eventSink: (InviteListEvents) -> Unit ) sealed interface InviteDeclineConfirmationDialog { diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt index d4d1f5c166..f187398689 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListStateProvider.kt @@ -39,6 +39,10 @@ open class InviteListStateProvider : PreviewParameterProvider { internal fun aInviteListState() = InviteListState( inviteList = aInviteListInviteSummaryList(), + declineConfirmationDialog = InviteDeclineConfirmationDialog.Hidden, + acceptedAction = Async.Uninitialized, + declinedAction = Async.Uninitialized, + eventSink = {}, ) internal fun aInviteListInviteSummaryList(): ImmutableList { diff --git a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomState.kt b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomState.kt index 3f14833cf0..df6d44df4d 100644 --- a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomState.kt +++ b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomState.kt @@ -19,10 +19,10 @@ package io.element.android.features.leaveroom.api import io.element.android.libraries.matrix.api.core.RoomId data class LeaveRoomState( - val confirmation: Confirmation = Confirmation.Hidden, - val progress: Progress = Progress.Hidden, - val error: Error = Error.Hidden, - val eventSink: (LeaveRoomEvent) -> Unit = {}, + val confirmation: Confirmation, + val progress: Progress, + val error: Error, + val eventSink: (LeaveRoomEvent) -> Unit, ) { sealed interface Confirmation { data object Hidden : Confirmation diff --git a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt index e9b08bcd18..f82b58cba3 100644 --- a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt +++ b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomStateProvider.kt @@ -22,32 +22,32 @@ import io.element.android.libraries.matrix.api.core.RoomId class LeaveRoomStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( - LeaveRoomState( + aLeaveRoomState( confirmation = LeaveRoomState.Confirmation.Hidden, progress = LeaveRoomState.Progress.Hidden, error = LeaveRoomState.Error.Hidden, ), - LeaveRoomState( + aLeaveRoomState( confirmation = LeaveRoomState.Confirmation.Generic(A_ROOM_ID), progress = LeaveRoomState.Progress.Hidden, error = LeaveRoomState.Error.Hidden, ), - LeaveRoomState( + aLeaveRoomState( confirmation = LeaveRoomState.Confirmation.PrivateRoom(A_ROOM_ID), progress = LeaveRoomState.Progress.Hidden, error = LeaveRoomState.Error.Hidden, ), - LeaveRoomState( + aLeaveRoomState( confirmation = LeaveRoomState.Confirmation.LastUserInRoom(A_ROOM_ID), progress = LeaveRoomState.Progress.Hidden, error = LeaveRoomState.Error.Hidden, ), - LeaveRoomState( + aLeaveRoomState( confirmation = LeaveRoomState.Confirmation.Hidden, progress = LeaveRoomState.Progress.Shown, error = LeaveRoomState.Error.Hidden, ), - LeaveRoomState( + aLeaveRoomState( confirmation = LeaveRoomState.Confirmation.Hidden, progress = LeaveRoomState.Progress.Hidden, error = LeaveRoomState.Error.Shown, @@ -56,3 +56,14 @@ class LeaveRoomStateProvider : PreviewParameterProvider { } private val A_ROOM_ID = RoomId("!aRoomId:aDomain") + +fun aLeaveRoomState( + confirmation: LeaveRoomState.Confirmation = LeaveRoomState.Confirmation.Hidden, + progress: LeaveRoomState.Progress = LeaveRoomState.Progress.Hidden, + error: LeaveRoomState.Error = LeaveRoomState.Error.Hidden, +) = LeaveRoomState( + confirmation = confirmation, + progress = progress, + error = error, + eventSink = {}, +) diff --git a/features/leaveroom/test/src/main/kotlin/io/element/android/features/leaveroom/fake/FakeLeaveRoomPresenter.kt b/features/leaveroom/test/src/main/kotlin/io/element/android/features/leaveroom/fake/FakeLeaveRoomPresenter.kt index 7a6c086436..0aac5a0d74 100644 --- a/features/leaveroom/test/src/main/kotlin/io/element/android/features/leaveroom/fake/FakeLeaveRoomPresenter.kt +++ b/features/leaveroom/test/src/main/kotlin/io/element/android/features/leaveroom/fake/FakeLeaveRoomPresenter.kt @@ -21,7 +21,7 @@ import io.element.android.features.leaveroom.api.LeaveRoomEvent import io.element.android.features.leaveroom.api.LeaveRoomPresenter import io.element.android.features.leaveroom.api.LeaveRoomState -class FakeLeaveRoomPresenter: LeaveRoomPresenter { +class FakeLeaveRoomPresenter : LeaveRoomPresenter { val events = mutableListOf() @@ -29,7 +29,12 @@ class FakeLeaveRoomPresenter: LeaveRoomPresenter { events += event } - private var state = LeaveRoomState(eventSink = ::handleEvent) + private var state = LeaveRoomState( + confirmation = LeaveRoomState.Confirmation.Hidden, + progress = LeaveRoomState.Progress.Hidden, + error = LeaveRoomState.Error.Hidden, + eventSink = ::handleEvent, + ) set(value) { field = value.copy(eventSink = ::handleEvent) } diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt index eccaea45fc..0a7a9ad618 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollState.kt @@ -26,7 +26,7 @@ data class CreatePollState( val answers: ImmutableList, val pollKind: PollKind, val showConfirmation: Boolean, - val eventSink: (CreatePollEvents) -> Unit = {}, + val eventSink: (CreatePollEvents) -> Unit, ) data class Answer( diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollStateProvider.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollStateProvider.kt index 29aa1288ad..c1393e0da0 100644 --- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollStateProvider.kt +++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/create/CreatePollStateProvider.kt @@ -18,12 +18,13 @@ package io.element.android.features.poll.impl.create import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.libraries.matrix.api.poll.PollKind +import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.persistentListOf class CreatePollStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( - CreatePollState( + aCreatePollState( canCreate = false, canAddAnswer = true, question = "", @@ -34,7 +35,7 @@ class CreatePollStateProvider : PreviewParameterProvider { pollKind = PollKind.Disclosed, showConfirmation = false, ), - CreatePollState( + aCreatePollState( canCreate = true, canAddAnswer = true, question = "What type of food should we have?", @@ -45,7 +46,7 @@ class CreatePollStateProvider : PreviewParameterProvider { showConfirmation = false, pollKind = PollKind.Undisclosed, ), - CreatePollState( + aCreatePollState( canCreate = true, canAddAnswer = true, question = "What type of food should we have?", @@ -56,7 +57,7 @@ class CreatePollStateProvider : PreviewParameterProvider { showConfirmation = true, pollKind = PollKind.Undisclosed, ), - CreatePollState( + aCreatePollState( canCreate = true, canAddAnswer = true, question = "What type of food should we have?", @@ -69,7 +70,7 @@ class CreatePollStateProvider : PreviewParameterProvider { showConfirmation = false, pollKind = PollKind.Undisclosed, ), - CreatePollState( + aCreatePollState( canCreate = true, canAddAnswer = false, question = "Should there be more than 20 answers?", @@ -98,7 +99,7 @@ class CreatePollStateProvider : PreviewParameterProvider { showConfirmation = false, pollKind = PollKind.Undisclosed, ), - CreatePollState( + aCreatePollState( canCreate = true, canAddAnswer = true, question = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." + @@ -122,3 +123,22 @@ class CreatePollStateProvider : PreviewParameterProvider { ) ) } + +private fun aCreatePollState( + canCreate: Boolean, + canAddAnswer: Boolean, + question: String, + answers: PersistentList, + showConfirmation: Boolean, + pollKind: PollKind +): CreatePollState { + return CreatePollState( + canCreate = canCreate, + canAddAnswer = canAddAnswer, + question = question, + answers = answers, + showConfirmation = showConfirmation, + pollKind = pollKind, + eventSink = {} + ) +} diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt index c580e6d677..bbbcc64da6 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt @@ -18,6 +18,7 @@ package io.element.android.features.roomdetails.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.leaveroom.api.LeaveRoomState +import io.element.android.features.leaveroom.api.aLeaveRoomState import io.element.android.features.roomdetails.impl.members.details.aRoomMemberDetailsState import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMember @@ -80,7 +81,7 @@ fun aRoomDetailsState() = RoomDetailsState( canShowNotificationSettings = true, roomType = RoomDetailsType.Room, roomMemberDetailsState = null, - leaveRoomState = LeaveRoomState(), + leaveRoomState = aLeaveRoomState(), roomNotificationSettings = RoomNotificationSettings(mode = RoomNotificationMode.MUTE, isDefault = false), eventSink = {} ) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt index c30879bf79..2a27777e4a 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt @@ -18,6 +18,7 @@ package io.element.android.features.roomlist.impl import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.features.leaveroom.api.LeaveRoomState +import io.element.android.features.leaveroom.api.aLeaveRoomState import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders import io.element.android.libraries.designsystem.components.avatar.AvatarData @@ -58,7 +59,7 @@ internal fun aRoomListState() = RoomListState( invitesState = InvitesState.NoInvites, displaySearchResults = false, contextMenu = RoomListState.ContextMenu.Hidden, - leaveRoomState = LeaveRoomState(), + leaveRoomState = aLeaveRoomState(), eventSink = {} )