Merge pull request #1552 from vector-im/feature/bma/konsist2
Konsist: add more test
This commit is contained in:
commit
0a63f2a3f1
22 changed files with 301 additions and 172 deletions
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.app
|
||||||
|
|
||||||
|
import com.lemonappdev.konsist.api.Konsist
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.constructors
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.modifierprovider.withSealedModifier
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.parameters
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withNameEndingWith
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withoutName
|
||||||
|
import com.lemonappdev.konsist.api.verify.assertEmpty
|
||||||
|
import com.lemonappdev.konsist.api.verify.assertTrue
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class KonsistArchitectureTest {
|
||||||
|
@Test
|
||||||
|
fun `Data class state MUST not have default value`() {
|
||||||
|
Konsist
|
||||||
|
.scopeFromProject()
|
||||||
|
.classes()
|
||||||
|
.withNameEndingWith("State")
|
||||||
|
.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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Events MUST be sealed interface`() {
|
||||||
|
Konsist.scopeFromProject()
|
||||||
|
.classes()
|
||||||
|
.withSealedModifier()
|
||||||
|
.withNameEndingWith("Events")
|
||||||
|
.assertEmpty(additionalMessage = "Events class MUST be sealed interface")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.app
|
||||||
|
|
||||||
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
import com.bumble.appyx.core.node.Node
|
||||||
|
import com.lemonappdev.konsist.api.Konsist
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withAllParentsOf
|
||||||
|
import com.lemonappdev.konsist.api.verify.assertTrue
|
||||||
|
import io.element.android.libraries.architecture.Presenter
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class KonsistClassNameTest {
|
||||||
|
@Test
|
||||||
|
fun `Classes extending 'Presenter' should have 'Presenter' suffix`() {
|
||||||
|
Konsist.scopeFromProject()
|
||||||
|
.classes()
|
||||||
|
.withAllParentsOf(Presenter::class)
|
||||||
|
.assertTrue {
|
||||||
|
it.name.endsWith("Presenter")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Classes extending 'Node' should have 'Node' suffix`() {
|
||||||
|
Konsist.scopeFromProject()
|
||||||
|
.classes()
|
||||||
|
.withAllParentsOf(Node::class)
|
||||||
|
.assertTrue {
|
||||||
|
it.name.endsWith("Node")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Classes extending 'PreviewParameterProvider' name MUST end with "Provider" and MUST contain provided class name`() {
|
||||||
|
Konsist.scopeFromProject()
|
||||||
|
.classes()
|
||||||
|
.withAllParentsOf(PreviewParameterProvider::class)
|
||||||
|
.assertTrue {
|
||||||
|
// Cannot find a better way to get the type of the generic
|
||||||
|
val providedType = it.text
|
||||||
|
.substringBefore(">")
|
||||||
|
.substringAfter("<")
|
||||||
|
.removeSuffix("?")
|
||||||
|
.replace(".", "")
|
||||||
|
it.name.endsWith("Provider") && it.name.contains(providedType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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.modifierprovider.withoutModifier
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withTopLevel
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withoutName
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withoutNameEndingWith
|
||||||
|
import com.lemonappdev.konsist.api.verify.assertTrue
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class KonsistComposableTest {
|
||||||
|
@Test
|
||||||
|
fun `Top level function with '@Composable' annotation starting with a upper case should be placed in a file with the same name`() {
|
||||||
|
Konsist
|
||||||
|
.scopeFromProject()
|
||||||
|
.functions()
|
||||||
|
.withTopLevel()
|
||||||
|
.withoutModifier(KoModifier.PRIVATE)
|
||||||
|
.withoutNameEndingWith("Preview")
|
||||||
|
.withAllAnnotationsOf(Composable::class)
|
||||||
|
.withoutName(
|
||||||
|
// Add some exceptions...
|
||||||
|
"OutlinedButton",
|
||||||
|
"TextButton",
|
||||||
|
"SimpleAlertDialogContent",
|
||||||
|
)
|
||||||
|
.assertTrue(
|
||||||
|
additionalMessage =
|
||||||
|
"""
|
||||||
|
Please check the filename. It should match the top level Composable function. If the filename is correct:
|
||||||
|
- consider making the Composable private or moving it to its own file
|
||||||
|
- at last resort, you can add an exception in the Konsist test
|
||||||
|
""".trimIndent()
|
||||||
|
) {
|
||||||
|
if (it.name.first().isLowerCase()) {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
val fileName = it.containingFile.name.removeSuffix(".kt")
|
||||||
|
fileName == it.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,17 +14,23 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.element.android.libraries.designsystem.utils
|
package io.element.android.app
|
||||||
|
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import com.lemonappdev.konsist.api.Konsist
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.properties
|
||||||
|
import com.lemonappdev.konsist.api.verify.assertFalse
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
open class PairCombinedProvider<T1, T2>(
|
class KonsistFieldTest {
|
||||||
private val provider: Pair<PreviewParameterProvider<T1>, PreviewParameterProvider<T2>>
|
@Test
|
||||||
) : PreviewParameterProvider<Pair<T1, T2>> {
|
fun `no field should have 'm' prefix`() {
|
||||||
override val values: Sequence<Pair<T1, T2>>
|
Konsist
|
||||||
get() = provider.first.values.flatMap { first ->
|
.scopeFromProject()
|
||||||
provider.second.values.map { second ->
|
.classes()
|
||||||
first to second
|
.properties()
|
||||||
|
.assertFalse {
|
||||||
|
val secondCharacterIsUppercase = it.name.getOrNull(1)?.isUpperCase() ?: false
|
||||||
|
it.name.startsWith('m') && secondCharacterIsUppercase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.app
|
||||||
|
|
||||||
|
import com.lemonappdev.konsist.api.Konsist
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf
|
||||||
|
import com.lemonappdev.konsist.api.verify.assertTrue
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class KonsistPreviewTest {
|
||||||
|
@Test
|
||||||
|
fun `Functions with '@PreviewsDayNight' annotation should have 'Preview' suffix`() {
|
||||||
|
Konsist
|
||||||
|
.scopeFromProject()
|
||||||
|
.functions()
|
||||||
|
.withAllAnnotationsOf(PreviewsDayNight::class)
|
||||||
|
.assertTrue {
|
||||||
|
it.hasNameEndingWith("Preview") &&
|
||||||
|
it.hasNameEndingWith("LightPreview").not() &&
|
||||||
|
it.hasNameEndingWith("DarkPreview").not()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,139 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2023 New Vector Ltd
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
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.properties
|
|
||||||
import com.lemonappdev.konsist.api.ext.list.withAllAnnotationsOf
|
|
||||||
import com.lemonappdev.konsist.api.ext.list.withAllParentsOf
|
|
||||||
import com.lemonappdev.konsist.api.ext.list.withNameEndingWith
|
|
||||||
import com.lemonappdev.konsist.api.ext.list.withReturnType
|
|
||||||
import com.lemonappdev.konsist.api.ext.list.withTopLevel
|
|
||||||
import com.lemonappdev.konsist.api.ext.list.withoutName
|
|
||||||
import com.lemonappdev.konsist.api.ext.list.withoutNameEndingWith
|
|
||||||
import com.lemonappdev.konsist.api.verify.assertFalse
|
|
||||||
import com.lemonappdev.konsist.api.verify.assertTrue
|
|
||||||
import io.element.android.libraries.architecture.Presenter
|
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import org.junit.Test
|
|
||||||
|
|
||||||
class KonsistTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Classes extending 'Presenter' should have 'Presenter' suffix`() {
|
|
||||||
Konsist.scopeFromProject()
|
|
||||||
.classes()
|
|
||||||
.withAllParentsOf(Presenter::class)
|
|
||||||
.assertTrue {
|
|
||||||
it.name.endsWith("Presenter")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Functions with '@PreviewsDayNight' annotation should have 'Preview' suffix`() {
|
|
||||||
Konsist
|
|
||||||
.scopeFromProject()
|
|
||||||
.functions()
|
|
||||||
.withAllAnnotationsOf(PreviewsDayNight::class)
|
|
||||||
.assertTrue {
|
|
||||||
it.hasNameEndingWith("Preview") &&
|
|
||||||
it.hasNameEndingWith("LightPreview").not() &&
|
|
||||||
it.hasNameEndingWith("DarkPreview").not()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Top level function with '@Composable' annotation starting with a upper case should be placed in a file with the same name`() {
|
|
||||||
Konsist
|
|
||||||
.scopeFromProject()
|
|
||||||
.functions()
|
|
||||||
.withTopLevel()
|
|
||||||
.withoutModifier(KoModifier.PRIVATE)
|
|
||||||
.withoutNameEndingWith("Preview")
|
|
||||||
.withAllAnnotationsOf(Composable::class)
|
|
||||||
.withoutName(
|
|
||||||
// Add some exceptions...
|
|
||||||
"OutlinedButton",
|
|
||||||
"TextButton",
|
|
||||||
"SimpleAlertDialogContent",
|
|
||||||
)
|
|
||||||
.assertTrue(
|
|
||||||
additionalMessage =
|
|
||||||
"""
|
|
||||||
Please check the filename. It should match the top level Composable function. If the filename is correct:
|
|
||||||
- consider making the Composable private or moving it to its own file
|
|
||||||
- at last resort, you can add an exception in the Konsist test
|
|
||||||
""".trimIndent()
|
|
||||||
) {
|
|
||||||
if (it.name.first().isLowerCase()) {
|
|
||||||
true
|
|
||||||
} else {
|
|
||||||
val fileName = it.containingFile.name.removeSuffix(".kt")
|
|
||||||
fileName == it.name
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Data class state MUST not have default value`() {
|
|
||||||
Konsist
|
|
||||||
.scopeFromProject()
|
|
||||||
.classes()
|
|
||||||
.withNameEndingWith("State")
|
|
||||||
.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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `Function which creates Presenter in test MUST be named 'createPresenterName'`() {
|
|
||||||
Konsist
|
|
||||||
.scopeFromTest()
|
|
||||||
.functions()
|
|
||||||
.withReturnType { it.name.endsWith("Presenter") }
|
|
||||||
.withoutOverrideModifier()
|
|
||||||
.assertTrue { functionDeclaration ->
|
|
||||||
functionDeclaration.name == "create${functionDeclaration.returnType?.name}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `no field should have 'm' prefix`() {
|
|
||||||
Konsist
|
|
||||||
.scopeFromProject()
|
|
||||||
.classes()
|
|
||||||
.properties()
|
|
||||||
.assertFalse {
|
|
||||||
val secondCharacterIsUppercase = it.name.getOrNull(1)?.isUpperCase() ?: false
|
|
||||||
it.name.startsWith('m') && secondCharacterIsUppercase
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.app
|
||||||
|
|
||||||
|
import com.lemonappdev.konsist.api.Konsist
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.modifierprovider.withoutOverrideModifier
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withFunction
|
||||||
|
import com.lemonappdev.konsist.api.ext.list.withReturnType
|
||||||
|
import com.lemonappdev.konsist.api.verify.assertTrue
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class KonsistTestTest {
|
||||||
|
@Test
|
||||||
|
fun `Classes name containing @Test must end with 'Test''`() {
|
||||||
|
Konsist
|
||||||
|
.scopeFromTest()
|
||||||
|
.classes()
|
||||||
|
.withFunction { it.hasAnnotationOf(Test::class) }
|
||||||
|
.assertTrue { it.name.endsWith("Test") }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Function which creates Presenter in test MUST be named 'createPresenterName'`() {
|
||||||
|
Konsist
|
||||||
|
.scopeFromTest()
|
||||||
|
.functions()
|
||||||
|
.withReturnType { it.name.endsWith("Presenter") }
|
||||||
|
.withoutOverrideModifier()
|
||||||
|
.assertTrue { functionDeclaration ->
|
||||||
|
functionDeclaration.name == "create${functionDeclaration.returnType?.name}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -23,7 +23,7 @@ import org.robolectric.RobolectricTestRunner
|
||||||
import java.net.URLEncoder
|
import java.net.URLEncoder
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
class CallIntentDataParserTests {
|
class CallIntentDataParserTest {
|
||||||
|
|
||||||
private val callIntentDataParser = CallIntentDataParser()
|
private val callIntentDataParser = CallIntentDataParser()
|
||||||
|
|
||||||
|
|
@ -30,15 +30,15 @@ import androidx.compose.ui.layout.ContentScale
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import io.element.android.features.location.api.R
|
import io.element.android.features.location.api.R
|
||||||
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
|
||||||
import io.element.android.libraries.designsystem.preview.ElementPreview
|
import io.element.android.libraries.designsystem.preview.ElementPreview
|
||||||
|
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
|
||||||
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
|
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
|
||||||
import io.element.android.libraries.designsystem.theme.components.Icon
|
import io.element.android.libraries.designsystem.theme.components.Icon
|
||||||
import io.element.android.libraries.designsystem.theme.components.Text
|
import io.element.android.libraries.designsystem.theme.components.Text
|
||||||
|
import io.element.android.libraries.designsystem.utils.BooleanProvider
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
@ -81,7 +81,7 @@ internal fun StaticMapPlaceholder(
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun StaticMapPlaceholderPreview(
|
internal fun StaticMapPlaceholderPreview(
|
||||||
@PreviewParameter(BooleanParameterProvider::class) values: Boolean
|
@PreviewParameter(BooleanProvider::class) values: Boolean
|
||||||
) = ElementPreview {
|
) = ElementPreview {
|
||||||
StaticMapPlaceholder(
|
StaticMapPlaceholder(
|
||||||
showProgress = values,
|
showProgress = values,
|
||||||
|
|
@ -91,8 +91,3 @@ internal fun StaticMapPlaceholderPreview(
|
||||||
onLoadMapClick = {},
|
onLoadMapClick = {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class BooleanParameterProvider : PreviewParameterProvider<Boolean> {
|
|
||||||
override val values: Sequence<Boolean>
|
|
||||||
get() = sequenceOf(true, false)
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ import io.element.android.libraries.matrix.api.auth.AuthenticationException
|
||||||
import io.element.android.libraries.ui.strings.CommonStrings
|
import io.element.android.libraries.ui.strings.CommonStrings
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class ErrorFormatterTests {
|
class ErrorFormatterTest {
|
||||||
|
|
||||||
// region loginError
|
// region loginError
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -19,7 +19,7 @@ package io.element.android.libraries.core.extensions
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class ResultTests {
|
class ResultTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testFlatMap() {
|
fun testFlatMap() {
|
||||||
|
|
@ -537,7 +537,7 @@ internal fun BloomPreview() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class InitialsColorStateProvider : PreviewParameterProvider<Int> {
|
class InitialsColorIntProvider : PreviewParameterProvider<Int> {
|
||||||
override val values: Sequence<Int>
|
override val values: Sequence<Int>
|
||||||
get() = sequenceOf(0, 1, 2, 3, 4, 5, 6, 7)
|
get() = sequenceOf(0, 1, 2, 3, 4, 5, 6, 7)
|
||||||
}
|
}
|
||||||
|
|
@ -545,7 +545,7 @@ class InitialsColorStateProvider : PreviewParameterProvider<Int> {
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
@ShowkaseComposable(group = PreviewGroup.Bloom)
|
@ShowkaseComposable(group = PreviewGroup.Bloom)
|
||||||
internal fun BloomInitialsPreview(@PreviewParameter(InitialsColorStateProvider::class) color: Int) {
|
internal fun BloomInitialsPreview(@PreviewParameter(InitialsColorIntProvider::class) color: Int) {
|
||||||
ElementPreview {
|
ElementPreview {
|
||||||
val avatarColors = AvatarColorsProvider.provide("$color", ElementTheme.isLightTheme)
|
val avatarColors = AvatarColorsProvider.provide("$color", ElementTheme.isLightTheme)
|
||||||
val bitmap = initialsBitmap(text = "F", backgroundColor = avatarColors.background, textColor = avatarColors.foreground)
|
val bitmap = initialsBitmap(text = "F", backgroundColor = avatarColors.background, textColor = avatarColors.foreground)
|
||||||
|
|
|
||||||
|
|
@ -20,5 +20,5 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
open class BooleanProvider : PreviewParameterProvider<Boolean> {
|
open class BooleanProvider : PreviewParameterProvider<Boolean> {
|
||||||
override val values: Sequence<Boolean>
|
override val values: Sequence<Boolean>
|
||||||
get() = sequenceOf(false, true)
|
get() = sequenceOf(true, false)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ import org.robolectric.annotation.Config
|
||||||
|
|
||||||
@Suppress("LargeClass")
|
@Suppress("LargeClass")
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
class DefaultRoomLastMessageFormatterTests {
|
class DefaultRoomLastMessageFormatterTest {
|
||||||
|
|
||||||
private lateinit var context: Context
|
private lateinit var context: Context
|
||||||
private lateinit var fakeMatrixClient: FakeMatrixClient
|
private lateinit var fakeMatrixClient: FakeMatrixClient
|
||||||
|
|
@ -19,7 +19,7 @@ package io.element.android.libraries.matrix.api.auth
|
||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class AuthErrorCodeTests {
|
class AuthErrorCodeTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `errorCode finds UNKNOWN code`() {
|
fun `errorCode finds UNKNOWN code`() {
|
||||||
|
|
@ -23,7 +23,7 @@ import org.junit.runner.RunWith
|
||||||
import org.robolectric.RobolectricTestRunner
|
import org.robolectric.RobolectricTestRunner
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
class MatrixToConverterTests {
|
class MatrixToConverterTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `converting a matrix-to url does nothing`() {
|
fun `converting a matrix-to url does nothing`() {
|
||||||
|
|
@ -23,7 +23,7 @@ import io.element.android.tests.testutils.assertThrowsInDebug
|
||||||
import io.element.android.tests.testutils.isInDebug
|
import io.element.android.tests.testutils.isInDebug
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
|
||||||
class PermalinkBuilderTests {
|
class PermalinkBuilderTest {
|
||||||
|
|
||||||
fun `building a permalink for an invalid user id throws when verifying the id`() {
|
fun `building a permalink for an invalid user id throws when verifying the id`() {
|
||||||
assertThrowsInDebug {
|
assertThrowsInDebug {
|
||||||
|
|
@ -22,7 +22,7 @@ import org.junit.runner.RunWith
|
||||||
import org.robolectric.RobolectricTestRunner
|
import org.robolectric.RobolectricTestRunner
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
class PermalinkParserTests {
|
class PermalinkParserTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `parsing an invalid url returns a fallback link`() {
|
fun `parsing an invalid url returns a fallback link`() {
|
||||||
|
|
@ -22,7 +22,7 @@ import io.element.android.libraries.matrix.api.auth.AuthenticationException
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
import org.matrix.rustcomponents.sdk.AuthenticationException as RustAuthenticationException
|
import org.matrix.rustcomponents.sdk.AuthenticationException as RustAuthenticationException
|
||||||
|
|
||||||
class AuthenticationExceptionMappingTests {
|
class AuthenticationExceptionMappingTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `mapping an exception with no message returns 'Unknown error' message`() {
|
fun `mapping an exception with no message returns 'Unknown error' message`() {
|
||||||
|
|
@ -26,7 +26,7 @@ import org.junit.runner.RunWith
|
||||||
import org.robolectric.RobolectricTestRunner
|
import org.robolectric.RobolectricTestRunner
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner::class)
|
@RunWith(RobolectricTestRunner::class)
|
||||||
class PickerTypeTests {
|
class PickerTypeTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `ImageAndVideo - assert types`() {
|
fun `ImageAndVideo - assert types`() {
|
||||||
|
|
@ -19,7 +19,7 @@ package io.element.android.libraries.permissions.api
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
|
|
||||||
open class PermissionsViewStateProvider : PreviewParameterProvider<PermissionsState> {
|
open class PermissionsStateProvider : PreviewParameterProvider<PermissionsState> {
|
||||||
override val values: Sequence<PermissionsState>
|
override val values: Sequence<PermissionsState>
|
||||||
get() = sequenceOf(
|
get() = sequenceOf(
|
||||||
aPermissionsState(showDialog = true, permission = Manifest.permission.POST_NOTIFICATIONS),
|
aPermissionsState(showDialog = true, permission = Manifest.permission.POST_NOTIFICATIONS),
|
||||||
|
|
@ -57,7 +57,7 @@ private fun String.toDialogContent(): String {
|
||||||
|
|
||||||
@PreviewsDayNight
|
@PreviewsDayNight
|
||||||
@Composable
|
@Composable
|
||||||
internal fun PermissionsViewPreview(@PreviewParameter(PermissionsViewStateProvider::class) state: PermissionsState) = ElementPreview {
|
internal fun PermissionsViewPreview(@PreviewParameter(PermissionsStateProvider::class) state: PermissionsState) = ElementPreview {
|
||||||
PermissionsView(
|
PermissionsView(
|
||||||
state = state,
|
state = state,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue