package com.wildplot.android.rendering; import android.graphics.Color; import com.wildplot.android.rendering.graphics.wrapper.ColorWrap; import com.wildplot.android.rendering.graphics.wrapper.FontMetricsWrap; import com.wildplot.android.rendering.graphics.wrapper.GraphicsWrap; import com.wildplot.android.rendering.graphics.wrapper.RectangleWrap; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyFloat; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.floatThat; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.when; @RunWith(PowerMockRunner.class) @PrepareForTest({RectangleWrap.class, GraphicsWrap.class, ColorWrap.class, android.graphics.Color.class}) public class PieChartTest { private static final double PRECISION = 1E-3F; @Mock GraphicsWrap graphics; @Mock PlotSheet plot; PieChart pieChart; @Before public void setUp() throws Exception { mockStatic(android.graphics.Color.class); when(Color.argb(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(0); when(plot.getFrameThickness()).thenReturn(new float[]{0, 0, 0, 0}); FontMetricsWrap fm = mock(FontMetricsWrap.class); when(fm.getHeight()).thenReturn(10f); when(fm.stringWidth(any(String.class))).thenReturn(30f); when(graphics.getFontMetrics()).thenReturn(fm); } @Test(expected = IllegalArgumentException.class) public void constructorShouldThrowIfSizesMismatch() throws Exception { new PieChart(plot, new double[]{1, 1}, new ColorWrap[]{ColorWrap.RED}); } @Test public void paintShouldNotDrawAnythingIfValuesAreZero() throws Exception { pieChart = new PieChart(plot, new double[]{0, 0}, new ColorWrap[]{ ColorWrap.RED, ColorWrap.GREEN}); pieChart.paint(graphics); verify(graphics, never()).fillArc(anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyFloat(), anyFloat()); } @Test public void paintShouldDrawFullRedCircleIfOneValue() throws Exception { pieChart = new PieChart(plot, new double[]{1.}, new ColorWrap[]{ ColorWrap.RED}); RectangleWrap r = createRectangleMock(100, 100); when(graphics.getClipBounds()).thenReturn(r); pieChart.paint(graphics); verify(graphics).setColor(ColorWrap.RED); verify(graphics).fillArc(anyFloat(), anyFloat(), anyFloat(), anyFloat(), floatThat(closeTo(-90F)), floatThat(closeTo(360F))); } @Test public void paintShouldDrawTwoSectorsWithGivenColors() throws Exception { pieChart = new PieChart(plot, new double[]{1, 1}, new ColorWrap[]{ ColorWrap.RED, ColorWrap.GREEN}); RectangleWrap r = createRectangleMock(100, 100); when(graphics.getClipBounds()).thenReturn(r); pieChart.paint(graphics); verify(graphics).setColor(ColorWrap.RED); verify(graphics).fillArc(anyFloat(), anyFloat(), anyFloat(), anyFloat(), floatThat(closeTo(-90F)), floatThat(closeTo(180F))); verify(graphics).setColor(ColorWrap.GREEN); verify(graphics).fillArc(anyFloat(), anyFloat(), anyFloat(), anyFloat(), floatThat(closeTo(90F)), floatThat(closeTo(180F))); } public static RectangleWrap createRectangleMock(int width, int height) { RectangleWrap r = mock(RectangleWrap.class); r.width = width; r.height = height; when(r.width()).thenReturn(width); when(r.height()).thenReturn(height); return r; } private static FloatMatcher closeTo(double v) { return FloatMatcher.closeTo(v, PRECISION); } }