diff --git a/core/src/main/java/sergio/sastre/composable/preview/scanner/core/preview/mappers/ComposablePreviewWithPreviewParameterMapper.kt b/core/src/main/java/sergio/sastre/composable/preview/scanner/core/preview/mappers/ComposablePreviewWithPreviewParameterMapper.kt index d42323b..0777977 100644 --- a/core/src/main/java/sergio/sastre/composable/preview/scanner/core/preview/mappers/ComposablePreviewWithPreviewParameterMapper.kt +++ b/core/src/main/java/sergio/sastre/composable/preview/scanner/core/preview/mappers/ComposablePreviewWithPreviewParameterMapper.kt @@ -5,6 +5,7 @@ import sergio.sastre.composable.preview.scanner.core.preview.ComposablePreview import sergio.sastre.composable.preview.scanner.core.preview.ProvideComposablePreview import java.lang.reflect.Method import kotlin.math.max +import kotlin.math.min import kotlin.reflect.KFunction import kotlin.reflect.KParameter import kotlin.reflect.full.declaredMemberFunctions @@ -95,11 +96,14 @@ data class ComposablePreviewWithPreviewParameterMapper( val limit = getPropertyValue(previewParameterAnnotation, "limit") as? Int ?: Int.MAX_VALUE + val count = getPropertyValue(providerInstance, "count") as? Int + val displayedValuesCount = count?.let { min(it, limit) } ?: limit + val getDisplayNameMethod = providerInstance::class.declaredMemberFunctions.getDisplayNameFunction() return values - .take(max(0, limit)) + .take(max(0, displayedValuesCount)) .mapIndexed { index, value -> provideComposablePreview( composablePreviewMapper = this, diff --git a/tests/src/main/java/sergio/sastre/composable/preview/scanner/android/previewparameterscount/Composables.kt b/tests/src/main/java/sergio/sastre/composable/preview/scanner/android/previewparameterscount/Composables.kt new file mode 100644 index 0000000..54f632f --- /dev/null +++ b/tests/src/main/java/sergio/sastre/composable/preview/scanner/android/previewparameterscount/Composables.kt @@ -0,0 +1,65 @@ +package sergio.sastre.composable.preview.scanner.android.previewparameterscount + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter +import androidx.compose.ui.tooling.preview.PreviewParameterProvider + +val stringValues: Sequence = sequenceOf("Jim", "Jens", null) +class StringMinusCountParameterProvider( + override val values: Sequence = stringValues, + override val count: Int = -1, +) : PreviewParameterProvider + +class StringCountGreaterThanValuesSizeParameterProvider( + override val values: Sequence = stringValues, + override val count: Int = stringValues.count() + 1, +) : PreviewParameterProvider + +class StringCountGreaterThanLimitParameterProvider( + override val values: Sequence = stringValues, + override val count: Int = 2, +) : PreviewParameterProvider + +class StringCountLessThanLimitParameterProvider( + override val values: Sequence = stringValues, + override val count: Int = 1, +) : PreviewParameterProvider + +@Composable +fun Example(name: String?){ + Text(name.toString()) +} + +@Preview(group = "count < 0") +@Composable +fun ExamplePreviewProviderInParameterConstructor( + @PreviewParameter(provider = StringMinusCountParameterProvider ::class) name: String? +){ + Example(name) +} + +@Preview(group = "count > values size") +@Composable +fun ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor( + @PreviewParameter(provider = StringCountGreaterThanValuesSizeParameterProvider ::class) name: String? +){ + Example(name) +} + +@Preview(group = "count > limit and limit = 1") +@Composable +fun ExamplePreviewCountGreaterThanLimitProviderInParameterConstructor( + @PreviewParameter(provider = StringCountGreaterThanLimitParameterProvider ::class, limit = 1) name: String? +){ + Example(name) +} + +@Preview(group = "count < limit and limit = 2") +@Composable +fun ExamplePreviewCountLessThanLimitProviderInParameterConstructor( + @PreviewParameter(provider = StringCountLessThanLimitParameterProvider ::class, limit = 2) name: String? +){ + Example(name) +} \ No newline at end of file diff --git a/tests/src/test/java/sergio/sastre/composable/preview/scanner/tests/api/main/scanner/AndroidComposablePreviewScannerTest.kt b/tests/src/test/java/sergio/sastre/composable/preview/scanner/tests/api/main/scanner/AndroidComposablePreviewScannerTest.kt index 979d3d9..b7fece8 100644 --- a/tests/src/test/java/sergio/sastre/composable/preview/scanner/tests/api/main/scanner/AndroidComposablePreviewScannerTest.kt +++ b/tests/src/test/java/sergio/sastre/composable/preview/scanner/tests/api/main/scanner/AndroidComposablePreviewScannerTest.kt @@ -17,6 +17,10 @@ import sergio.sastre.composable.preview.scanner.android.customextraannotation.Fo import sergio.sastre.composable.preview.scanner.android.customextraannotation.ScreenshotTestConfig import sergio.sastre.composable.preview.scanner.android.excluded.ExcludeScreenshot import sergio.sastre.composable.preview.scanner.android.included.IncludeScreenshot +import sergio.sastre.composable.preview.scanner.android.previewparameterscount.StringCountGreaterThanLimitParameterProvider +import sergio.sastre.composable.preview.scanner.android.previewparameterscount.StringCountGreaterThanValuesSizeParameterProvider +import sergio.sastre.composable.preview.scanner.android.previewparameterscount.StringCountLessThanLimitParameterProvider +import sergio.sastre.composable.preview.scanner.android.previewparameterscount.StringMinusCountParameterProvider import sergio.sastre.composable.preview.scanner.core.scanresult.RequiresLargeHeap import sergio.sastre.composable.preview.scanner.core.preview.getAnnotation import sergio.sastre.composable.preview.scanner.core.scanresult.filter.exceptions.RepeatableAnnotationNotSupportedException @@ -401,6 +405,68 @@ class AndroidComposablePreviewScannerTest { } } + @Test + fun `GIVEN preview parameters with count less than 0 THEN it does not return previews`() { + val stringProvider = StringMinusCountParameterProvider() + + val previewsWithParameterProviderInConstructor = + AndroidComposablePreviewScanner() + .scanPackageTrees("sergio.sastre.composable.preview.scanner.android.previewparameterscount") + .filterPreviews { it.group == "count < 0" } + .getPreviews() + + assert(stringProvider.count <= 0) + assert(previewsWithParameterProviderInConstructor.isEmpty()) + } + + @Test + fun `GIVEN preview parameters with count greater than values size THEN it does return as many previews as values size`() { + val stringProvider = StringCountGreaterThanValuesSizeParameterProvider() + val count = stringProvider.count + val valuesSize = stringProvider.values.count() + assert(count > valuesSize) + + val previewsWithParameterProviderInConstructor = + AndroidComposablePreviewScanner() + .scanPackageTrees("sergio.sastre.composable.preview.scanner.android.previewparameterscount") + .filterPreviews { it.group == "count > values size" } + .getPreviews() + + assert(previewsWithParameterProviderInConstructor.size == valuesSize) + } + + @Test + fun `GIVEN preview parameters with count greater than limit THEN it does not return as many previews as limit`() { + val stringProvider = StringCountGreaterThanLimitParameterProvider() + val limit = 1 + val count = stringProvider.count + assert(count > limit) + + val previewsWithParameterProviderInConstructor = + AndroidComposablePreviewScanner() + .scanPackageTrees("sergio.sastre.composable.preview.scanner.android.previewparameterscount") + .filterPreviews { it.group == "count > limit and limit = 1" } + .getPreviews() + + assert(previewsWithParameterProviderInConstructor.size == limit) + } + + @Test + fun `GIVEN preview parameters with count less than limit THEN it does not return as many previews as count`() { + val stringProvider = StringCountLessThanLimitParameterProvider() + val limit = 2 + val count = stringProvider.count + assert(count < limit) + + val previewsWithParameterProviderInConstructor = + AndroidComposablePreviewScanner() + .scanPackageTrees("sergio.sastre.composable.preview.scanner.android.previewparameterscount") + .filterPreviews { it.group == "count < limit and limit = 2" } + .getPreviews() + + assert(previewsWithParameterProviderInConstructor.size == count) + } + @Test fun `GIVEN preview parameters with StringProvider and MultiplePreviews THEN it creates one preview for every combination`() { val stringProviderValuesSize = AndroidStringProvider().values.toList().size diff --git a/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanLimitProviderInParameterConstructor.count_>_limit_and_limit_=_1_String_0.png b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanLimitProviderInParameterConstructor.count_>_limit_and_limit_=_1_String_0.png new file mode 100644 index 0000000..a5aa938 Binary files /dev/null and b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanLimitProviderInParameterConstructor.count_>_limit_and_limit_=_1_String_0.png differ diff --git a/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_0.png b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_0.png new file mode 100644 index 0000000..a5aa938 Binary files /dev/null and b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_0.png differ diff --git a/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_1.png b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_1.png new file mode 100644 index 0000000..4d26e64 Binary files /dev/null and b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_1.png differ diff --git a/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_2.png b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_2.png new file mode 100644 index 0000000..93a989d Binary files /dev/null and b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_2.png differ diff --git a/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountLessThanLimitProviderInParameterConstructor.count_<_limit_and_limit_=_2_String_0.png b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountLessThanLimitProviderInParameterConstructor.count_<_limit_and_limit_=_2_String_0.png new file mode 100644 index 0000000..a5aa938 Binary files /dev/null and b/tests/src/test/screenshots/android/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountLessThanLimitProviderInParameterConstructor.count_<_limit_and_limit_=_2_String_0.png differ diff --git a/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanLimitProviderInParameterConstructor.count_>_limit_and_limit_=_1_String_0.png b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanLimitProviderInParameterConstructor.count_>_limit_and_limit_=_1_String_0.png new file mode 100644 index 0000000..a5aa938 Binary files /dev/null and b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanLimitProviderInParameterConstructor.count_>_limit_and_limit_=_1_String_0.png differ diff --git a/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_0.png b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_0.png new file mode 100644 index 0000000..a5aa938 Binary files /dev/null and b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_0.png differ diff --git a/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_1.png b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_1.png new file mode 100644 index 0000000..4d26e64 Binary files /dev/null and b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_1.png differ diff --git a/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_2.png b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_2.png new file mode 100644 index 0000000..93a989d Binary files /dev/null and b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountGreaterThanValuesSizeProviderInParameterConstructor.count_>_values_size_String_2.png differ diff --git a/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountLessThanLimitProviderInParameterConstructor.count_<_limit_and_limit_=_2_String_0.png b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountLessThanLimitProviderInParameterConstructor.count_<_limit_and_limit_=_2_String_0.png new file mode 100644 index 0000000..a5aa938 Binary files /dev/null and b/tests/src/test/screenshots/sourceset/sergio.sastre.composable.preview.scanner.android.previewparameterscount.ComposablesKt.ExamplePreviewCountLessThanLimitProviderInParameterConstructor.count_<_limit_and_limit_=_2_String_0.png differ diff --git a/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanlimitproviderinparameterconstructor.count_%3e_limit_and_limit_=_1_string_0.png b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanlimitproviderinparameterconstructor.count_%3e_limit_and_limit_=_1_string_0.png new file mode 100644 index 0000000..4ae6b95 Binary files /dev/null and b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanlimitproviderinparameterconstructor.count_%3e_limit_and_limit_=_1_string_0.png differ diff --git a/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_0.png b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_0.png new file mode 100644 index 0000000..4ae6b95 Binary files /dev/null and b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_0.png differ diff --git a/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_1.png b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_1.png new file mode 100644 index 0000000..672b3e1 Binary files /dev/null and b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_1.png differ diff --git a/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_2.png b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_2.png new file mode 100644 index 0000000..6d986f8 Binary files /dev/null and b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountgreaterthanvaluessizeproviderinparameterconstructor.count_%3e_values_size_string_2.png differ diff --git a/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountlessthanlimitproviderinparameterconstructor.count_%3c_limit_and_limit_=_2_string_0.png b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountlessthanlimitproviderinparameterconstructor.count_%3c_limit_and_limit_=_2_string_0.png new file mode 100644 index 0000000..4ae6b95 Binary files /dev/null and b/tests/src/test/snapshots/images/Paparazzi_Preview_Test_android.previewparameterscount.composableskt.examplepreviewcountlessthanlimitproviderinparameterconstructor.count_%3c_limit_and_limit_=_2_string_0.png differ