Back to Repositories

Validating Axis Value Computation and Label Distribution in MPAndroidChart

This test suite validates the axis rendering functionality in the MPAndroidChart library, focusing on the computation of axis values and label intervals. The tests ensure accurate scaling, labeling, and value distribution across different numerical ranges and configurations.

Test Coverage Overview

The test suite provides comprehensive coverage of the AxisRenderer class, specifically focusing on the computeAxis method. It validates:

  • Label count and interval calculations
  • Axis granularity settings
  • Handling of different numerical ranges (0-100, 0-0.01, -50-50)
  • Force label count behavior
  • Edge cases with small decimal values

Implementation Analysis

The testing approach uses JUnit to verify axis value computations through multiple test scenarios. The implementation employs precise floating-point comparisons with delta tolerances to handle decimal calculations. The test structure follows a clear pattern of setup, execution, and assertion for each axis configuration scenario.

Technical Details

Testing tools and configuration:

  • JUnit testing framework
  • Custom YAxis and YAxisRenderer implementations
  • assertEquals with delta values for floating-point comparisons
  • Multiple test cases within single test method
  • Null matrix and viewport parameters for isolated testing

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Comprehensive boundary testing
  • Precise floating-point comparisons
  • Systematic test case organization
  • Clear test method naming
  • Isolated component testing
  • Multiple assertion points for thorough validation

philjay/mpandroidchart

MPChartLib/src/test/java/com/github/mikephil/charting/test/AxisRendererTest.java

            
package com.github.mikephil.charting.test;

import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.renderer.AxisRenderer;
import com.github.mikephil.charting.renderer.YAxisRenderer;

import org.junit.Test;

import static junit.framework.Assert.assertEquals;

/**
 * Created by philipp on 31/05/16.
 */
public class AxisRendererTest {


    @Test
    public void testComputeAxisValues() {

        YAxis yAxis = new YAxis();
        yAxis.setLabelCount(6);
        AxisRenderer renderer = new YAxisRenderer(null, yAxis, null);

        renderer.computeAxis(0, 100, false);
        float[] entries = yAxis.mEntries;

        assertEquals(6, entries.length);
        assertEquals(20, entries[1] - entries[0], 0.01); // interval 20
        assertEquals(0, entries[0], 0.01);
        assertEquals(100, entries[entries.length - 1], 0.01);

        yAxis = new YAxis();
        yAxis.setLabelCount(6);
        yAxis.setGranularity(50f);
        renderer = new YAxisRenderer(null, yAxis, null);

        renderer.computeAxis(0, 100, false);
        entries = yAxis.mEntries;

        assertEquals(3, entries.length);
        assertEquals(50, entries[1] - entries[0], 0.01); // interval 50
        assertEquals(0, entries[0], 0.01);
        assertEquals(100, entries[entries.length - 1], 0.01);

        yAxis = new YAxis();
        yAxis.setLabelCount(5, true);
        renderer = new YAxisRenderer(null, yAxis, null);

        renderer.computeAxis(0, 100, false);
        entries = yAxis.mEntries;

        assertEquals(5, entries.length);
        assertEquals(25, entries[1] - entries[0], 0.01); // interval 25
        assertEquals(0, entries[0], 0.01);
        assertEquals(100, entries[entries.length - 1], 0.01);

        yAxis = new YAxis();
        yAxis.setLabelCount(5, true);
        renderer = new YAxisRenderer(null, yAxis, null);

        renderer.computeAxis(0, 0.01f, false);
        entries = yAxis.mEntries;

        assertEquals(5, entries.length);
        assertEquals(0.0025, entries[1] - entries[0], 0.0001);
        assertEquals(0, entries[0], 0.0001);
        assertEquals(0.01, entries[entries.length - 1], 0.0001);

        yAxis = new YAxis();
        yAxis.setLabelCount(5, false);
        renderer = new YAxisRenderer(null, yAxis, null);

        renderer.computeAxis(0, 0.01f, false);
        entries = yAxis.mEntries;

        assertEquals(5, entries.length);
        assertEquals(0.0020, entries[1] - entries[0], 0.0001);
        assertEquals(0, entries[0], 0.0001);
        assertEquals(0.0080, entries[entries.length - 1], 0.0001);

        yAxis = new YAxis();
        yAxis.setLabelCount(6);
        renderer = new YAxisRenderer(null, yAxis, null);

        renderer.computeAxis(-50, 50, false);
        entries = yAxis.mEntries;

        assertEquals(5, entries.length);
        assertEquals(-40, entries[0], 0.0001);
        assertEquals(0, entries[2], 0.0001);
        assertEquals(40, entries[entries.length - 1], 0.0001);

        yAxis = new YAxis();
        yAxis.setLabelCount(6);
        renderer = new YAxisRenderer(null, yAxis, null);

        renderer.computeAxis(-50, 100, false);
        entries = yAxis.mEntries;

        assertEquals(5, entries.length);
        assertEquals(-30, entries[0], 0.0001);
        assertEquals(30, entries[2], 0.0001);
        assertEquals(90, entries[entries.length - 1], 0.0001);
    }
}