From a74706056d3ceb7b9591cbba1b033c6cdadd1745 Mon Sep 17 00:00:00 2001 From: HDCode Date: Sat, 21 Mar 2026 12:25:59 +0100 Subject: [PATCH] feat(bar): add per-bar colors support --- .../app/screenshot/BarChartScreenshotTest.kt | 22 ++++++++- ...CustomBarColorsPreview_Dark_9cfa4316_0.png | Bin 0 -> 50250 bytes ...view_Light Tablet Landscape_5e637cf0_0.png | Bin 0 -> 50438 bytes ...rColorsPreview_Light Tablet_9301444c_0.png | Bin 0 -> 47722 bytes ...ustomBarColorsPreview_Light_bb9fafb0_0.png | Bin 0 -> 50942 bytes .../charts/app/demo/bar/BarChartStyleItems.kt | 5 ++ .../charts/app/demo/bar/BarDemo.kt | 2 + .../github/dautovicharis/charts/BarChart.kt | 3 +- .../charts/internal/BarValidation.kt | 12 ++++- .../charts/internal/barchart/BarChart.kt | 31 +++++++++++- .../internal/barchart/BarChartContent.kt | 6 ++- .../internal/barchart/BarChartDrawing.kt | 6 ++- .../internal/barchart/BarChartHelpers.kt | 16 ++++++ .../charts/style/BarChartStyle.kt | 6 +++ .../dautovicharis/charts/ui/BarChartTest.kt | 46 ++++++++++++++++++ .../unit/helpers/BarChartHelpersTest.kt | 23 +++++++++ .../fixtures/ChartTestStyleFixtures.kt | 9 ++++ 17 files changed, 178 insertions(+), 9 deletions(-) create mode 100644 androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Dark_9cfa4316_0.png create mode 100644 androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light Tablet Landscape_5e637cf0_0.png create mode 100644 androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light Tablet_9301444c_0.png create mode 100644 androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light_bb9fafb0_0.png diff --git a/androidApp/src/screenshotTest/kotlin/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTest.kt b/androidApp/src/screenshotTest/kotlin/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTest.kt index a1193c40..96524a5b 100644 --- a/androidApp/src/screenshotTest/kotlin/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTest.kt +++ b/androidApp/src/screenshotTest/kotlin/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTest.kt @@ -27,14 +27,34 @@ fun BarChartDefaultPreview() { @Composable fun BarChartCustomPreview() { ScreenshotSurface { + val dataSet = SCREENSHOT_BAR_SAMPLE_USE_CASE.initialBarDataSet() BarChart( - dataSet = SCREENSHOT_BAR_SAMPLE_USE_CASE.initialBarDataSet(), + dataSet = dataSet, style = ChartTestStyleFixtures.barCustomStyle(chartViewStyle = ChartViewDefaults.style()), animateOnStart = SCREENSHOT_ANIMATE_ON_START, ) } } +@PreviewTest +@ScreenshotPreview +@Composable +fun BarChartCustomBarColorsPreview() { + ScreenshotSurface { + val dataSet = SCREENSHOT_BAR_SAMPLE_USE_CASE.initialBarDataSet() + BarChart( + dataSet = dataSet, + style = + ChartTestStyleFixtures.barCustomStyle( + chartViewStyle = ChartViewDefaults.style(), + barCount = dataSet.data.item.points.size, + useBarColors = true, + ), + animateOnStart = SCREENSHOT_ANIMATE_ON_START, + ) + } +} + @PreviewTest @ScreenshotPreview @Composable diff --git a/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Dark_9cfa4316_0.png b/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Dark_9cfa4316_0.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3e0d59282e6ef225ed3d841c5d65c38708e644 GIT binary patch literal 50250 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%0AEVk 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 literal 0 HcmV?d00001 diff --git a/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light Tablet Landscape_5e637cf0_0.png b/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light Tablet Landscape_5e637cf0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..cef3f19b2cc84c9cf5b7fbe124d9c3bffa85a880 GIT binary patch literal 50438 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
sUs2U5^|bG+4?|IpTq7V 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 A7XSbN literal 0 HcmV?d00001 diff --git a/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light Tablet_9301444c_0.png b/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light Tablet_9301444c_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2e48d1583ab99f2588dc6634a853f5a6f02b5d GIT binary patch literal 47722 zcmeIbd03NI+b@c>7F!2YEFhyZS`kEs$QZ2xDk4^^pgS)Ne^63VT6N^`p_58V%N&)IlPLQ9alPZkhGfoVZLj2S4lMCKux44v{^0Gz4Qmg5c>Cnqj@(DN zI}+F0886R$v~n-c8k2*b_IX}6E~N7treZErEv{-FXICAkavO1KVN+Gdv!h>7z2H3+ ze7)0MvS&+xJ}AXar#(co$yv8E6b(VExTd_;3V2ocF5sdk0TBT^b$gQf&tumkp1RE%8DR4r|RlD=I ziB@OBaHGB*9l3>eE=djMKRjb{%6muDYVq4qshh`k+@9{in!qzT%Sxbx$B??9=MYfE zAm6S^H*pR*0+m+|S%0@4CwB= FlU>Ja!Aug;kCQcF^qy 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 Za#7rM@R literal 0 HcmV?d00001 diff --git a/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light_bb9fafb0_0.png b/androidApp/src/screenshotTestDebug/reference/io/github/dautovicharis/charts/app/screenshot/BarChartScreenshotTestKt/BarChartCustomBarColorsPreview_Light_bb9fafb0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..c09b11379c076bd39972ec1adb366bf7a3f3d5f3 GIT binary patch literal 50942 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 literal 0 HcmV?d00001 diff --git a/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarChartStyleItems.kt b/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarChartStyleItems.kt index fa118767..f36ec993 100644 --- a/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarChartStyleItems.kt +++ b/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarChartStyleItems.kt @@ -23,17 +23,21 @@ object BarChartStyleItems { @Composable fun customStyle( + barCount: Int, minValue: Float, maxValue: Float, aspectRatioPreset: ChartAspectRatioPreset = ChartAspectRatioPreset.Square, ) = ChartTestStyleFixtures.barCustomStyle( chartViewStyle = chartViewStyle(aspectRatioPreset), + barCount = barCount, + useBarColors = true, minValue = minValue, maxValue = maxValue, ) @Composable fun custom( + barCount: Int, minValue: Float, maxValue: Float, aspectRatioPreset: ChartAspectRatioPreset = ChartAspectRatioPreset.Square, @@ -41,6 +45,7 @@ object BarChartStyleItems { ChartStyleItems( currentStyle = customStyle( + barCount = barCount, minValue = minValue, maxValue = maxValue, aspectRatioPreset = aspectRatioPreset, diff --git a/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarDemo.kt b/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarDemo.kt index b4810376..91d7ed17 100644 --- a/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarDemo.kt +++ b/app/src/commonMain/kotlin/io/github/dautovicharis/charts/app/demo/bar/BarDemo.kt @@ -57,6 +57,7 @@ fun BarChartDemo( ChartPreset.Default -> BarChartStyleItems.default(aspectRatioPreset) ChartPreset.Custom -> BarChartStyleItems.custom( + barCount = dataSet.data.item.points.size, minValue = controlsState.minValue.toFloat(), maxValue = controlsState.maxValue.toFloat(), aspectRatioPreset = aspectRatioPreset, @@ -120,6 +121,7 @@ fun BarChartDemo( dataSet = dataSet, style = BarChartStyleItems.customStyle( + barCount = dataSet.data.item.points.size, minValue = controlsState.minValue.toFloat(), maxValue = controlsState.maxValue.toFloat(), aspectRatioPreset = aspectRatioPreset, diff --git a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/BarChart.kt b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/BarChart.kt index 966f57c9..d2220554 100644 --- a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/BarChart.kt +++ b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/BarChart.kt @@ -30,9 +30,10 @@ fun BarChart( selectedBarIndex: Int = NO_SELECTION, ) { val errors = - remember(dataSet) { + remember(dataSet, style.barColors) { validateBarData( data = dataSet.data.item, + colorsSize = style.barColors.size, ) } diff --git a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/BarValidation.kt b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/BarValidation.kt index c8f3c87a..630886c4 100644 --- a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/BarValidation.kt +++ b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/BarValidation.kt @@ -1,10 +1,14 @@ package io.github.dautovicharis.charts.internal import io.github.dautovicharis.charts.internal.ValidationErrors.MIN_REQUIRED_BAR +import io.github.dautovicharis.charts.internal.ValidationErrors.RULE_COLORS_SIZE_MISMATCH import io.github.dautovicharis.charts.internal.common.model.ChartData @InternalChartsApi -fun validateBarData(data: ChartData): List { +fun validateBarData( + data: ChartData, + colorsSize: Int = 0, +): List { val validationErrors = mutableListOf() val pointsSize = data.points.size @@ -15,6 +19,12 @@ fun validateBarData(data: ChartData): List { return validationErrors } + if (colorsSize > 0 && colorsSize != pointsSize) { + val validationError = + RULE_COLORS_SIZE_MISMATCH.format(colorsSize, pointsSize) + validationErrors.add(validationError) + } + data.points.forEachIndexed { index, value -> if (value.isNaN()) { val validationError = ValidationErrors.RULE_DATA_POINT_NOT_NUMBER.format(index) diff --git a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChart.kt b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChart.kt index d634f85e..ddf1f636 100644 --- a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChart.kt +++ b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChart.kt @@ -42,7 +42,11 @@ internal fun BarChart( selectedBarIndex: Int = NO_SELECTION, onValueChanged: (Int) -> Unit = {}, ) { - val barColor = style.barColor.copy(alpha = style.barAlpha) + val baseBarColor = style.barColor.copy(alpha = style.barAlpha) + val sourceBarColors = + remember(style.barColors, style.barAlpha) { + style.barColors.map { color -> color.copy(alpha = style.barAlpha) } + } val isPreview = LocalInspectionMode.current val sourceDataSize = chartData.points.size BoxWithConstraints(modifier = style.modifier) { @@ -87,6 +91,17 @@ internal fun BarChart( } var denseExpanded by rememberDenseExpandedState(isDenseModeAvailable = isDenseData) val compactDenseMode = isDenseData && !denseExpanded + val compactBarCenterIndices = + remember(sourceDataSize, compactDenseMode, maxFitBars) { + if (compactDenseMode) { + compactDensityCenterIndices( + sourcePointsCount = sourceDataSize, + targetPoints = maxFitBars, + ) + } else { + emptyList() + } + } val renderData = remember(chartData, compactDenseMode, maxFitBars) { if (compactDenseMode) { @@ -98,6 +113,17 @@ internal fun BarChart( chartData } } + val renderBarColors = + remember(sourceBarColors, compactBarCenterIndices, compactDenseMode, baseBarColor) { + when { + sourceBarColors.isEmpty() -> emptyList() + !compactDenseMode -> sourceBarColors + else -> + compactBarCenterIndices.map { centerIndex -> + sourceBarColors.getOrElse(centerIndex) { baseBarColor } + } + } + } val dataSize = renderData.points.size val hasFixedRange = style.minValue != null || style.maxValue != null val (fixedMin, fixedMax) = @@ -214,7 +240,8 @@ internal fun BarChart( interactionEnabled = interactionEnabled, dragSelectionEnabled = !isScrollable, animatedValues = animatedValues, - barColor = barColor, + barColors = renderBarColors, + defaultBarColor = baseBarColor, fixedMin = fixedMin, fixedMax = fixedMax, isScrollable = isScrollable, diff --git a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartContent.kt b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartContent.kt index a871bc84..d8c99cf9 100644 --- a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartContent.kt +++ b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartContent.kt @@ -40,7 +40,8 @@ internal fun BarChartContent( interactionEnabled: Boolean, dragSelectionEnabled: Boolean, animatedValues: List>, - barColor: Color, + barColors: List, + defaultBarColor: Color, fixedMin: Double, fixedMax: Double, isScrollable: Boolean, @@ -282,7 +283,8 @@ internal fun BarChartContent( animatedValues = animatedValues, visibleRange = visibleRange, selectedIndex = selectedIndex, - barColor = barColor, + barColors = barColors, + defaultBarColor = defaultBarColor, maxValue = fixedMax, minValue = fixedMin, barWidthPx = barWidthPx, diff --git a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartDrawing.kt b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartDrawing.kt index e0950f06..9aa9dc68 100644 --- a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartDrawing.kt +++ b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartDrawing.kt @@ -16,7 +16,8 @@ internal fun DrawScope.drawBars( animatedValues: List>, visibleRange: IntRange, selectedIndex: Int, - barColor: Color, + barColors: List, + defaultBarColor: Color, maxValue: Double, minValue: Double, barWidthPx: Float, @@ -70,9 +71,10 @@ internal fun DrawScope.drawBars( val barHeight = abs(value) * size.height val top = if (value >= 0f) clampedBaselineY - barHeight else clampedBaselineY val left = unitWidth * index + val resolvedBarColor = barColors.getOrNull(index) ?: defaultBarColor drawRect( - color = barColor, + color = resolvedBarColor, topLeft = Offset(x = left, y = top), size = androidx.compose.ui.geometry.Size( diff --git a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartHelpers.kt b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartHelpers.kt index b259624f..ac45205b 100644 --- a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartHelpers.kt +++ b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/internal/barchart/BarChartHelpers.kt @@ -101,6 +101,22 @@ internal fun aggregateForCompactDensity( return aggregatedPoints.toChartData(labels = aggregatedLabels) } +internal fun compactDensityCenterIndices( + sourcePointsCount: Int, + targetPoints: Int = BAR_DENSE_THRESHOLD, +): List { + if (sourcePointsCount <= 0) return emptyList() + if (targetPoints <= 1 || sourcePointsCount <= targetPoints) { + return List(sourcePointsCount) { index -> index } + } + + val bucketSize = bucketSizeForTargetCore(totalPoints = sourcePointsCount, targetPoints = targetPoints) + val bucketRanges = buildBucketRangesCore(totalPoints = sourcePointsCount, bucketSize = bucketSize) + return bucketRanges.map { range -> + range.first + ((range.last - range.first) / 2) + } +} + internal fun maxBarsThatFit( viewportWidthPx: Float, spacingPx: Float, diff --git a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/style/BarChartStyle.kt b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/style/BarChartStyle.kt index 1882fac8..08bbec09 100644 --- a/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/style/BarChartStyle.kt +++ b/charts-bar/src/commonMain/kotlin/io/github/dautovicharis/charts/style/BarChartStyle.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.unit.sp * @property modifier The modifier to be applied to the chart. * @property chartViewStyle The style to be applied to the chart view. * @property barColor The color to be used for the bars in the chart. + * @property barColors Optional explicit colors used for individual bars. * @property barAlpha The alpha value applied to rendered bars. * @property space The space between the bars in the chart. * @property minValue Optional fixed minimum value for the chart scale. @@ -46,6 +47,7 @@ class BarChartStyle( val modifier: Modifier, val chartViewStyle: ChartViewStyle, val barColor: Color, + val barColors: List, val barAlpha: Float, val space: Dp, val minValue: Float?, @@ -77,6 +79,7 @@ class BarChartStyle( override fun getProperties(): List> = listOf( BarChartStyle::barColor.name to barColor, + BarChartStyle::barColors.name to barColors, BarChartStyle::barAlpha.name to barAlpha, BarChartStyle::space.name to space, BarChartStyle::minValue.name to (minValue ?: "auto"), @@ -127,6 +130,7 @@ object BarChartDefaults { * Returns a BarChartStyle with the provided parameters or their default values. * * @param barColor The color to be used for the bars in the chart. Defaults to the primary color of the MaterialTheme. + * @param barColors Optional explicit colors used for individual bars. Defaults to an empty list. * @param barAlpha The alpha value applied to rendered bars. Defaults to 0.4f in light theme and 0.6f in dark theme. * @param space The space between the bars in the chart. Defaults to 10.dp. * @param minValue Optional fixed minimum value for the chart scale. Defaults to null. @@ -156,6 +160,7 @@ object BarChartDefaults { @Composable fun style( barColor: Color = MaterialTheme.colorScheme.primary, + barColors: List = emptyList(), barAlpha: Float = defaultChartAlpha(), space: Dp = 10.dp, minValue: Float? = null, @@ -187,6 +192,7 @@ object BarChartDefaults { return BarChartStyle( modifier = modifier, barColor = barColor, + barColors = barColors, barAlpha = barAlpha.coerceIn(0f, 1f), space = space, minValue = minValue, diff --git a/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/ui/BarChartTest.kt b/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/ui/BarChartTest.kt index 7d023ec7..190ba1ee 100644 --- a/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/ui/BarChartTest.kt +++ b/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/ui/BarChartTest.kt @@ -1,5 +1,6 @@ package io.github.dautovicharis.charts.ui +import androidx.compose.ui.graphics.Color import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.isDisplayed @@ -9,6 +10,7 @@ import androidx.compose.ui.test.runComposeUiTest import io.github.dautovicharis.charts.BarChart import io.github.dautovicharis.charts.internal.TestTags import io.github.dautovicharis.charts.internal.ValidationErrors.MIN_REQUIRED_BAR +import io.github.dautovicharis.charts.internal.ValidationErrors.RULE_COLORS_SIZE_MISMATCH import io.github.dautovicharis.charts.internal.ValidationErrors.RULE_DATA_POINTS_LESS_THAN_MIN import io.github.dautovicharis.charts.internal.common.model.ChartDataType import io.github.dautovicharis.charts.internal.format @@ -16,6 +18,7 @@ import io.github.dautovicharis.charts.mock.MockTest.TITLE import io.github.dautovicharis.charts.mock.MockTest.dataSet import io.github.dautovicharis.charts.model.ChartDataSet import io.github.dautovicharis.charts.model.toChartDataSet +import io.github.dautovicharis.charts.style.BarChartDefaults import kotlin.test.Test import kotlin.test.assertTrue @@ -104,4 +107,47 @@ class BarChartTest { assertTrue(lastLabelBounds.right <= axisBounds.right - 1f) } + + @OptIn(ExperimentalTestApi::class) + @Test + fun barChart_withMatchingBarColors_displaysChart() = + runComposeUiTest { + setContent { + val style = + BarChartDefaults.style( + barColors = listOf(Color.Red, Color.Green, Color.Blue, Color.Cyan), + ) + BarChart( + dataSet = dataSet, + style = style, + ) + } + + onNodeWithTag(TestTags.BAR_CHART).isDisplayed() + } + + @OptIn(ExperimentalTestApi::class) + @Test + fun barChart_withInvalidBarColors_displaysError() = + runComposeUiTest { + val expectedError = + RULE_COLORS_SIZE_MISMATCH.format( + 2, + dataSet.data.item.points.size, + ) + + setContent { + val style = + BarChartDefaults.style( + barColors = listOf(Color.Red, Color.Green), + ) + BarChart( + dataSet = dataSet, + style = style, + ) + } + + onNodeWithTag(TestTags.CHART_ERROR).isDisplayed() + onNodeWithText("${expectedError}\n").isDisplayed() + } } diff --git a/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/unit/helpers/BarChartHelpersTest.kt b/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/unit/helpers/BarChartHelpersTest.kt index 7f10d51d..b1953f85 100644 --- a/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/unit/helpers/BarChartHelpersTest.kt +++ b/charts-bar/src/commonTest/kotlin/io/github/dautovicharis/charts/unit/helpers/BarChartHelpersTest.kt @@ -4,6 +4,7 @@ import androidx.compose.ui.geometry.Offset import androidx.compose.ui.unit.IntSize import io.github.dautovicharis.charts.internal.barchart.YAxisTick import io.github.dautovicharis.charts.internal.barchart.buildYAxisTicks +import io.github.dautovicharis.charts.internal.barchart.compactDensityCenterIndices import io.github.dautovicharis.charts.internal.barchart.contentWidth import io.github.dautovicharis.charts.internal.barchart.estimateXAxisLabelFootprintPx import io.github.dautovicharis.charts.internal.barchart.estimateYAxisLabelWidthPx @@ -135,6 +136,28 @@ class BarChartHelpersTest { assertEquals(expected = 25, actual = capacity) } + @Test + fun compactDensityCenterIndices_nonDense_returnsIdentityIndices() { + val centers = + compactDensityCenterIndices( + sourcePointsCount = 8, + targetPoints = 12, + ) + + assertEquals(expected = listOf(0, 1, 2, 3, 4, 5, 6, 7), actual = centers) + } + + @Test + fun compactDensityCenterIndices_dense_returnsBucketCenters() { + val centers = + compactDensityCenterIndices( + sourcePointsCount = 10, + targetPoints = 4, + ) + + assertEquals(expected = listOf(1, 4, 7, 9), actual = centers) + } + @Test fun getSelectedIndexForContentX_clampsNegativeAndOverflowCoordinates() { val unit = unitWidth(barWidthPx = 8f, spacingPx = 2f) diff --git a/charts-demo-shared/src/commonMain/kotlin/io/github/dautovicharis/charts/demoshared/fixtures/ChartTestStyleFixtures.kt b/charts-demo-shared/src/commonMain/kotlin/io/github/dautovicharis/charts/demoshared/fixtures/ChartTestStyleFixtures.kt index 11370a6f..615b6026 100644 --- a/charts-demo-shared/src/commonMain/kotlin/io/github/dautovicharis/charts/demoshared/fixtures/ChartTestStyleFixtures.kt +++ b/charts-demo-shared/src/commonMain/kotlin/io/github/dautovicharis/charts/demoshared/fixtures/ChartTestStyleFixtures.kt @@ -78,13 +78,22 @@ object ChartTestStyleFixtures { @Composable fun barCustomStyle( chartViewStyle: ChartViewStyle, + barCount: Int = 1, + useBarColors: Boolean = false, minValue: Float? = null, maxValue: Float? = null, ): BarChartStyle { val chartColors = LocalChartColors.current + val barColors = + if (useBarColors) { + chartColors.seriesColors(barCount.coerceAtLeast(1)) + } else { + emptyList() + } return BarChartDefaults.style( chartViewStyle = chartViewStyle, barColor = chartColors.seriesColor(4), + barColors = barColors, minValue = minValue, maxValue = maxValue, gridColor = chartColors.gridLine,