package dev.dtrentin.chart.render import dev.dtrentin.chart.model.ChartConfig import dev.dtrentin.chart.model.DataConfig import dev.dtrentin.chart.model.YRange import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue class AxisRendererTest { // T9: resolveYRange writes into out param (Fixed range). @Test fun resolveYRange_writesIntoOutArray_fixed() { val cfg = ChartConfig(data = DataConfig(yRange = YRange.Fixed(min = -5f, max = 12f))) val out = FloatArray(2) AxisRenderer.resolveYRange(cfg, dataMin = -100f, dataMax = 100f, outYRange = out) assertEquals(-5f, out[0]) assertEquals(12f, out[1]) } // T9: resolveYRange writes into out param (Auto with padding). @Test fun resolveYRange_writesIntoOutArray_autoWithPadding() { val cfg = ChartConfig(data = DataConfig(yRange = YRange.Auto(paddingFraction = 0.1f))) val out = FloatArray(2) AxisRenderer.resolveYRange(cfg, dataMin = 0f, dataMax = 10f, outYRange = out) // padding = (10 - 0) * 0.1 = 1 → expect [-1, 11]. assertEquals(-1f, out[0]) assertEquals(11f, out[1]) } // T9: resolveYRange handles flat data — uses range floor 1e-6 to avoid div-by-zero. // With paddingFraction 0.1 and floor 1e-6, the effective padding is 1e-7. Below Float // resolution at value 5f, so out[0] == out[1] == 5f is permitted (downstream renderers // re-apply their own (yMax-yMin).coerceAtLeast(1e-6f)). Just assert no NaN/Infinity. @Test fun resolveYRange_flatData_writesFiniteValues() { val cfg = ChartConfig(data = DataConfig(yRange = YRange.Auto(paddingFraction = 0.1f))) val out = FloatArray(2) AxisRenderer.resolveYRange(cfg, dataMin = 5f, dataMax = 5f, outYRange = out) assertTrue(out[0].isFinite()) assertTrue(out[1].isFinite()) assertTrue(out[1] >= out[0]) } }