blob: 3dc8aebf61dd0bb48615f92e7a7306439393c20c [file] [log] [blame]
/*
* Copyright 2012 AndroidPlot.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.androidplot;
import android.content.Context;
import android.graphics.*;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import com.androidplot.mock.MockContext;
import com.androidplot.mock.MockPaint;
import com.androidplot.ui.SeriesAndFormatterList;
import com.androidplot.exception.PlotRenderException;
import com.androidplot.ui.SeriesRenderer;
import com.androidplot.ui.Formatter;
//import mockit.*;
import com.androidplot.ui.widget.TextLabelWidget;
import com.androidplot.util.Configurator;
import com.androidplot.util.FontUtils;
import com.androidplot.util.PixelUtils;
import mockit.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotSame;
import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@UsingMocksAndStubs({Log.class, View.class,Handler.class,Paint.class,Color.class,
RectF.class, Rect.class, FontUtils.class, Canvas.class,
PixelUtils.class,Context.class})
public class PlotTest {
static class MockPlotListener implements PlotListener {
@Override
public void onBeforeDraw(Plot source, Canvas canvas) {}
@Override
public void onAfterDraw(Plot source, Canvas canvas) {}
}
static class MockSeries implements Series {
@Override
public String getTitle() {
return null;
}
}
static class MockSeries2 implements Series {
@Override
public String getTitle() {
return null;
}
}
static class MockSeries3 implements Series {
@Override
public String getTitle() {
return null;
}
}
static class MockRenderer1 extends SeriesRenderer {
public MockRenderer1(Plot plot) {
super(plot);
}
@Override
public void onRender(Canvas canvas, RectF plotArea) throws PlotRenderException {
}
@Override
public void doDrawLegendIcon(Canvas canvas, RectF rect, Formatter formatter) {
}
}
static class MockRenderer2 extends SeriesRenderer {
public MockRenderer2(Plot plot) {
super(plot);
}
@Override
public void onRender(Canvas canvas, RectF plotArea) throws PlotRenderException {
}
@Override
public void doDrawLegendIcon(Canvas canvas, RectF rect, Formatter formatter) {
}
}
static class MockFormatter1 extends Formatter<MockPlot> {
@Override
public Class<? extends SeriesRenderer> getRendererClass() {
return MockRenderer1.class;
}
@Override
public SeriesRenderer getRendererInstance(MockPlot plot) {
return new MockRenderer1(plot);
}
}
static class MockFormatter2 extends Formatter<MockPlot> {
@Override
public Class<? extends SeriesRenderer> getRendererClass() {
return MockRenderer2.class;
}
@Override
public SeriesRenderer getRendererInstance(MockPlot plot) {
return new MockRenderer2(plot);
}
}
//@MockClass(realClass = Plot.class)
public static class MockPlot extends Plot<MockSeries, Formatter, SeriesRenderer> {
public MockPlot(Context context, String title) {
super(context, title);
}
@Override
protected void onPreInit() {
}
/*@Override
protected SeriesRenderer doGetRendererInstance(Class clazz) {
if(clazz == MockRenderer1.class) {
return new MockRenderer1(this);
} else if(clazz == MockRenderer2.class) {
return new MockRenderer2(this);
} else {
return null;
}
}*/
}
@Before
public void setUp() throws Exception {
Mockit.setUpMocks(MockPaint.class,MockContext.class);
}
@After
public void tearDown() throws Exception {
}
@Test
public void testAddSeries() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
//Plot plot = Mockit.setUpMock(Plot.class, new MockPlot(context, "MockPlot"));
//Plot plot = Mockit.setUpMock(new MockPlot());
Plot plot = new MockPlot(context, "MockPlot");
MockSeries m1 = new MockSeries();
Class cl = MockRenderer1.class;
plot.addSeries(m1, new MockFormatter1());
LinkedHashMap<Class<SeriesRenderer>, SeriesAndFormatterList<MockSeries,MockFormatter1>> registry = Deencapsulation.getField(plot, "seriesRegistry");
assertEquals(1, registry.size());
assertEquals(1, registry.get(cl).size());
plot.addSeries(m1, new MockFormatter1());
// duplicate Renderer added, registry size should not grow:
assertEquals(1, registry.size());
assertEquals(1, registry.get(cl).size());
MockSeries m2 = new MockSeries();
plot.addSeries(m2, new MockFormatter1());
// still should only be one renderer type:
assertEquals(1, registry.size());
// we added a new instance of cl to the renderer so there should be 2 in the subregistry:
assertEquals(2, registry.get(cl).size());
// lets add another renderer:
plot.addSeries(m1, new MockFormatter2());
assertEquals(2, registry.size());
}
@Test
public void testRemoveSeries() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
LinkedHashMap<Class<SeriesRenderer>, SeriesAndFormatterList<MockSeries,MockFormatter1>> registry = Deencapsulation.getField(plot, "seriesRegistry");
MockSeries m1 = new MockSeries();
MockSeries m2 = new MockSeries();
MockSeries m3 = new MockSeries();
plot.addSeries(m1, new MockFormatter1());
plot.addSeries(m2, new MockFormatter1());
plot.addSeries(m3, new MockFormatter1());
plot.addSeries(m1, new MockFormatter2());
plot.addSeries(m2, new MockFormatter2());
plot.addSeries(m3, new MockFormatter2());
// a quick sanity check:
assertEquals(2, registry.size());
assertEquals(3, registry.get(MockRenderer1.class).size());
assertEquals(3, registry.get(MockRenderer2.class).size());
plot.removeSeries(m1, MockRenderer1.class);
assertEquals(2, registry.get(MockRenderer1.class).size());
plot.removeSeries(m2, MockRenderer1.class);
assertEquals(1, registry.get(MockRenderer1.class).size());
plot.removeSeries(m2, MockRenderer1.class);
assertEquals(1, registry.get(MockRenderer1.class).size());
plot.removeSeries(m3, MockRenderer1.class);
// all the elements should be gone from MockRenderer1, thus the renderer should
// also be gone:
assertNull(registry.get(MockRenderer1.class));
// add em all back
plot.addSeries(m1, new MockFormatter1());
plot.addSeries(m2, new MockFormatter1());
plot.addSeries(m3, new MockFormatter1());
plot.addSeries(m1, new MockFormatter1());
plot.addSeries(m2, new MockFormatter1());
plot.addSeries(m3, new MockFormatter1());
// a quick sanity check:
assertEquals(2, registry.size());
assertEquals(3, registry.get(MockRenderer1.class).size());
assertEquals(3, registry.get(MockRenderer2.class).size());
// now lets try removing a series from all renderers:
plot.removeSeries(m1);
assertEquals(2, registry.get(MockRenderer1.class).size());
assertEquals(2, registry.get(MockRenderer2.class).size());
// and now lets remove the remaining series:
plot.removeSeries(m2);
plot.removeSeries(m3);
// nothing should be left:
assertNull(registry.get(MockRenderer1.class));
assertNull(registry.get(MockRenderer2.class));
}
@Test
public void testGetFormatter() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
LinkedHashMap<Class<SeriesRenderer>, SeriesAndFormatterList<MockSeries,MockFormatter1>> registry = Deencapsulation.getField(plot, "seriesRegistry");
MockSeries m1 = new MockSeries();
MockSeries m2 = new MockSeries();
MockSeries m3 = new MockSeries();
MockFormatter1 f1 = new MockFormatter1();
MockFormatter1 f2 = new MockFormatter1();
MockFormatter2 f3 = new MockFormatter2();
plot.addSeries(m1, f1);
plot.addSeries(m2, f2);
plot.addSeries(m3, new MockFormatter1());
plot.addSeries(m1, new MockFormatter1());
plot.addSeries(m2, f3);
plot.addSeries(m3, new MockFormatter1());
assertEquals(registry.get(MockRenderer1.class).getFormatter(m1), f1);
assertEquals(registry.get(MockRenderer1.class).getFormatter(m2), f2);
assertEquals(registry.get(MockRenderer2.class).getFormatter(m2), f3);
assertNotSame(registry.get(MockRenderer2.class).getFormatter(m2), f1);
}
@Test
public void testGetSeriesListForRenderer() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
//LinkedHashMap<Class<SeriesRenderer>, SeriesAndFormatterList<MockSeries,MockFormatter1>> registry = Deencapsulation.getField(plot, "seriesRegistry");
MockSeries m1 = new MockSeries();
MockSeries m2 = new MockSeries();
MockSeries m3 = new MockSeries();
plot.addSeries(m1, new MockFormatter1());
plot.addSeries(m2, new MockFormatter1());
plot.addSeries(m3, new MockFormatter1());
plot.addSeries(m1, new MockFormatter1());
plot.addSeries(m2, new MockFormatter1());
plot.addSeries(m3, new MockFormatter1());
List<MockSeries> m1List = plot.getSeriesListForRenderer(MockRenderer1.class);
assertEquals(3, m1List.size());
assertEquals(m1, m1List.get(0));
assertNotSame(m2, m1List.get(0));
assertEquals(m2, m1List.get(1));
assertEquals(m3, m1List.get(2));
}
@Test
public void testGetRendererList() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
//LinkedHashMap<Class<SeriesRenderer>, SeriesAndFormatterList<MockSeries,MockFormatter1>> registry = Deencapsulation.getField(plot, "seriesRegistry");
MockSeries m1 = new MockSeries();
MockSeries m2 = new MockSeries();
MockSeries m3 = new MockSeries();
plot.addSeries(m1, new MockFormatter1());
plot.addSeries(m2, new MockFormatter1());
plot.addSeries(m3, new MockFormatter1());
plot.addSeries(m1, new MockFormatter2());
plot.addSeries(m2, new MockFormatter2());
plot.addSeries(m3, new MockFormatter2());
List<SeriesRenderer> rList = plot.getRendererList();
assertEquals(2, rList.size());
assertEquals(MockRenderer1.class, rList.get(0).getClass());
assertEquals(MockRenderer2.class, rList.get(1).getClass());
}
@Test
public void testAddListener() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
ArrayList<PlotListener> listeners = Deencapsulation.getField(plot, "listeners");
//LinkedHashMap<Class<SeriesRenderer>, SeriesAndFormatterList<MockSeries,MockFormatter1>> registry = Deencapsulation.getField(plot, "seriesRegistry");
assertEquals(0, listeners.size());
MockPlotListener pl1 = new MockPlotListener();
MockPlotListener pl2 = new MockPlotListener();
plot.addListener(pl1);
assertEquals(1, listeners.size());
// should return false on a double entry attempt
assertFalse(plot.addListener(pl1));
// make sure the listener wasnt added anyway:
assertEquals(1, listeners.size());
plot.addListener(pl2);
assertEquals(2, listeners.size());
}
@Test
public void testRemoveListener() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
ArrayList<PlotListener> listeners = Deencapsulation.getField(plot, "listeners");
//LinkedHashMap<Class<SeriesRenderer>, SeriesAndFormatterList<MockSeries,MockFormatter1>> registry = Deencapsulation.getField(plot, "seriesRegistry");
assertEquals(0, listeners.size());
MockPlotListener pl1 = new MockPlotListener();
MockPlotListener pl2 = new MockPlotListener();
MockPlotListener pl3 = new MockPlotListener();
plot.addListener(pl1);
plot.addListener(pl2);
assertEquals(2, listeners.size());
assertFalse(plot.removeListener(pl3));
assertTrue(plot.removeListener(pl1));
assertEquals(1, listeners.size());
assertFalse(plot.removeListener(pl1));
assertEquals(1, listeners.size());
assertTrue(plot.removeListener(pl2));
assertEquals(0, listeners.size());
}
/*@Test
public void testGuessGetterName() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
Method m = Plot.class.getDeclaredMethod("guessGetterMethod", Object.class, String.class);
assertNotNull(m);
}
@Test
public void testGuessSetterName() throws Exception {
Context context = Mockit.setUpMock(new MockContext());
Plot plot = new MockPlot(context, "MockPlot");
Method m = Plot.class.getDeclaredMethod("guessSetterMethod", Object.class, String.class, Class.class);
assertNotNull(m);
}*/
@Test
public void testConfigure() throws Exception {
//Context context = Mockit.setUpMock(new MockContext.MockContext2());
Context context = new MockContext.MockContext2();
Plot plot = new MockPlot(context, "MockPlot");
HashMap<String, String> params = new HashMap<String, String>();
String param1 = "this is a test.";
//String param2 = Plot.RenderMode.USE_BACKGROUND_THREAD.toString();
String param2 = "use_background_thread";
String param3 = "#FF0000";
params.put("title", param1);
params.put("renderMode", param2);
params.put("backgroundPaint.color", param3);
//Method m = Plot.class.getDeclaredMethod("configure", params.getClass());
//m.setAccessible(true);
//m.invoke(plot, params);
Configurator.configure(context, plot, params);
assertEquals(param1, plot.getTitle());
assertEquals(Plot.RenderMode.USE_BACKGROUND_THREAD, plot.getRenderMode());
assertEquals(Color.parseColor(param3), plot.getBackgroundPaint().getColor());
}
}