Add Konsist test to check that toPersistentList() is not used.

Same for `toPersistentSet()` and `toPersistentMap()`.
Fix existing issues.
This commit is contained in:
Benoit Marty 2025-10-08 14:25:15 +02:00
parent 2fa1b9d448
commit 67c9daa0bf
85 changed files with 305 additions and 254 deletions

View file

@ -33,7 +33,6 @@ import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.launch
import timber.log.Timber
@ -79,7 +78,7 @@ class CreatePollPresenter(
repository.getPoll(mode.eventId).onSuccess {
val loadedPoll = PollFormState(
question = it.question,
answers = it.answers.map(PollAnswer::text).toPersistentList(),
answers = it.answers.map(PollAnswer::text).toImmutableList(),
isDisclosed = it.kind.isDisclosed,
)
initialPoll = loadedPoll

View file

@ -9,8 +9,7 @@ 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
import kotlinx.collections.immutable.toImmutableList
class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
override val values: Sequence<CreatePollState>
@ -20,7 +19,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = false,
canAddAnswer = true,
question = "",
answers = persistentListOf(
answers = listOf(
Answer("", false),
Answer("", false)
),
@ -33,7 +32,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = true,
question = "What type of food should we have?",
answers = persistentListOf(
answers = listOf(
Answer("Italian \uD83C\uDDEE\uD83C\uDDF9", false),
Answer("Chinese \uD83C\uDDE8\uD83C\uDDF3", false),
),
@ -46,7 +45,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = true,
question = "What type of food should we have?",
answers = persistentListOf(
answers = listOf(
Answer("Italian \uD83C\uDDEE\uD83C\uDDF9", false),
Answer("Chinese \uD83C\uDDE8\uD83C\uDDF3", false),
),
@ -59,7 +58,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = true,
question = "What type of food should we have?",
answers = persistentListOf(
answers = listOf(
Answer("Italian \uD83C\uDDEE\uD83C\uDDF9", true),
Answer("Chinese \uD83C\uDDE8\uD83C\uDDF3", true),
Answer("Brazilian \uD83C\uDDE7\uD83C\uDDF7", true),
@ -74,7 +73,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = false,
question = "Should there be more than 20 answers?",
answers = persistentListOf(
answers = listOf(
Answer("1", true),
Answer("2", true),
Answer("3", true),
@ -108,7 +107,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
" Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor" +
" in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt" +
" in culpa qui officia deserunt mollit anim id est laborum.",
answers = persistentListOf(
answers = listOf(
Answer(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." +
" Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis a.",
@ -129,7 +128,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = false,
canAddAnswer = true,
question = "",
answers = persistentListOf(
answers = listOf(
Answer("", false),
Answer("", false)
),
@ -142,7 +141,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = false,
canAddAnswer = true,
question = "",
answers = persistentListOf(
answers = listOf(
Answer("", false),
Answer("", false)
),
@ -158,7 +157,7 @@ private fun aCreatePollState(
canCreate: Boolean,
canAddAnswer: Boolean,
question: String,
answers: PersistentList<Answer>,
answers: List<Answer>,
showBackConfirmation: Boolean,
showDeleteConfirmation: Boolean,
pollKind: PollKind
@ -168,7 +167,7 @@ private fun aCreatePollState(
canSave = canCreate,
canAddAnswer = canAddAnswer,
question = question,
answers = answers,
answers = answers.toImmutableList(),
showBackConfirmation = showBackConfirmation,
showDeleteConfirmation = showDeleteConfirmation,
pollKind = pollKind,

View file

@ -13,7 +13,7 @@ import io.element.android.features.poll.impl.PollConstants
import io.element.android.features.poll.impl.PollConstants.MIN_ANSWERS
import io.element.android.libraries.matrix.api.poll.PollKind
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
/**
* Represents the state of the poll creation / edit form.
@ -28,7 +28,7 @@ data class PollFormState(
companion object {
val Empty = PollFormState(
question = "",
answers = MutableList(MIN_ANSWERS) { "" }.toPersistentList(),
answers = MutableList(MIN_ANSWERS) { "" }.toImmutableList(),
isDisclosed = true,
)
}
@ -49,7 +49,7 @@ data class PollFormState(
return this
}
return copy(answers = (answers + "").toPersistentList())
return copy(answers = (answers + "").toImmutableList())
}
/**
@ -66,7 +66,7 @@ data class PollFormState(
return this
}
return copy(answers = answers.filterIndexed { i, _ -> i != index }.toPersistentList())
return copy(answers = answers.filterIndexed { i, _ -> i != index }.toImmutableList())
}
/**
@ -82,7 +82,7 @@ data class PollFormState(
fun withAnswerChanged(index: Int, rawAnswer: String): PollFormState =
copy(answers = answers.toMutableList().apply {
this[index] = rawAnswer.take(PollConstants.MAX_ANSWER_LENGTH)
}.toPersistentList())
}.toImmutableList())
/**
* Whether a new answer can be added.
@ -114,7 +114,7 @@ internal val pollFormStateSaver = mapSaver(
restore = { saved ->
PollFormState(
question = saved["question"] as String,
answers = (saved["answers"] as Array<*>).map { it as String }.toPersistentList(),
answers = (saved["answers"] as Array<*>).map { it as String }.toImmutableList(),
isDisclosed = saved["isDisclosed"] as Boolean,
)
}

View file

@ -13,7 +13,7 @@ import io.element.android.features.poll.api.pollcontent.aPollContentState
import io.element.android.features.poll.impl.history.model.PollHistoryFilter
import io.element.android.features.poll.impl.history.model.PollHistoryItem
import io.element.android.features.poll.impl.history.model.PollHistoryItems
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
class PollHistoryStateProvider : PreviewParameterProvider<PollHistoryState> {
override val values: Sequence<PollHistoryState>
@ -53,8 +53,8 @@ internal fun aPollHistoryState(
hasMoreToLoad = hasMoreToLoad,
activeFilter = activeFilter,
pollHistoryItems = PollHistoryItems(
ongoing = currentItems.toPersistentList(),
past = currentItems.toPersistentList(),
ongoing = currentItems.toImmutableList(),
past = currentItems.toImmutableList(),
),
eventSink = eventSink,
)

View file

@ -14,7 +14,7 @@ import io.element.android.libraries.dateformatter.api.DateFormatter
import io.element.android.libraries.dateformatter.api.DateFormatterMode
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.api.timeline.item.event.PollContent
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.withContext
@Inject
@ -36,8 +36,8 @@ class PollHistoryItemsFactory(
}
}
PollHistoryItems(
ongoing = ongoing.toPersistentList(),
past = past.toPersistentList()
ongoing = ongoing.toImmutableList(),
past = past.toImmutableList()
)
}

View file

@ -9,7 +9,7 @@ package io.element.android.features.poll.impl.create
import androidx.compose.runtime.saveable.SaverScope
import com.google.common.truth.Truth.assertThat
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.persistentListOf
import org.junit.Test
class PollFormStateSaverTest {
@ -21,7 +21,7 @@ class PollFormStateSaverTest {
fun `test save and restore`() {
val state = PollFormState(
question = "question",
answers = listOf("answer1", "answer2").toPersistentList(),
answers = persistentListOf("answer1", "answer2"),
isDisclosed = true,
)

View file

@ -10,7 +10,7 @@ package io.element.android.features.poll.impl.create
import com.google.common.truth.Truth.assertThat
import io.element.android.features.poll.impl.PollConstants
import io.element.android.libraries.matrix.api.poll.PollKind
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import org.junit.Test
class PollFormStateTest {
@ -47,7 +47,7 @@ class PollFormStateTest {
val state = PollFormState.Empty
val newState = state.withAnswerChanged(1, "New answer")
assertThat(newState).isEqualTo(PollFormState.Empty.copy(
answers = listOf("", "New answer").toPersistentList()
answers = listOf("", "New answer").toImmutableList()
))
}
@ -58,7 +58,7 @@ class PollFormStateTest {
val state = PollFormState.Empty
val newState = state.withAnswerChanged(1, tooLongAnswer)
assertThat(newState).isEqualTo(PollFormState.Empty.copy(
answers = listOf("", truncatedAnswer).toPersistentList()
answers = listOf("", truncatedAnswer).toImmutableList()
))
}
@ -101,7 +101,7 @@ class PollFormStateTest {
@Test
fun `is valid is false when not enough answers`() {
val state = aValidPollFormState().copy(answers = listOf("").toPersistentList())
val state = aValidPollFormState().copy(answers = listOf("").toImmutableList())
assertThat(state.isValid).isFalse()
}
@ -127,10 +127,10 @@ class PollFormStateTest {
private fun aValidPollFormState(): PollFormState {
return PollFormState.Empty.copy(
question = "question",
answers = listOf("answer1", "answer2").toPersistentList(),
answers = listOf("answer1", "answer2").toImmutableList(),
isDisclosed = true,
)
}
private fun PollFormState.withBlankAnswers(numAnswers: Int): PollFormState =
copy(answers = List(numAnswers) { "" }.toPersistentList())
copy(answers = List(numAnswers) { "" }.toImmutableList())