From 5eed634846f7b1f07a4dfb729e1dc95e0be307ab Mon Sep 17 00:00:00 2001 From: psi Date: Wed, 22 Feb 2017 13:40:34 +0100 Subject: [PATCH 1/5] Introduce a new StepMode Why: Increment by value -> no good when zooming Increment by pixel -> no good when zooming subdivide -> depending on data chooses ticks at wired locations e.g (1.3 , 2.3, 3,3 instead of 1, 2, 3) Workaround: When you know your data: supply an array of predefined increments (by value) for StepModel to choose from to best fit the desired number of lines. For example: Start zoomed out with ticks every 100 and as you zoom in switch to 50,10,1 --- .idea/copyright/profiles_settings.xml | 6 +-- .../java/com/androidplot/xy/StepMode.java | 4 +- .../java/com/androidplot/xy/StepModel.java | 47 ++++++++++++++++++- .../com/androidplot/xy/XYGraphWidget.java | 2 +- .../main/java/com/androidplot/xy/XYPlot.java | 12 +++++ .../com/androidplot/xy/XYStepCalculator.java | 1 + build.gradle | 2 +- demoapp-wearable/build.gradle | 2 +- .../demos/TouchZoomExampleActivity.java | 10 +++- 9 files changed, 74 insertions(+), 12 deletions(-) diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml index 8f7b02e7..e7bedf33 100644 --- a/.idea/copyright/profiles_settings.xml +++ b/.idea/copyright/profiles_settings.xml @@ -1,7 +1,3 @@ - - - - - + \ No newline at end of file diff --git a/androidplot-core/src/main/java/com/androidplot/xy/StepMode.java b/androidplot-core/src/main/java/com/androidplot/xy/StepMode.java index d5db2c9d..00f60747 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/StepMode.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/StepMode.java @@ -20,9 +20,11 @@ * INCREMENTAL_VALUE - (default) draw a tick every n values. * INCREMENTAL_PIXEL - draw a tick every n pixels. * SUBDIVIDE - draw n number of evenly spaced lines. + * INCREMENT_BY_FIT choose increment from a list of possible values */ public enum StepMode { SUBDIVIDE, // default INCREMENT_BY_VAL, - INCREMENT_BY_PIXELS + INCREMENT_BY_PIXELS, + INCREMENT_BY_FIT } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java b/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java index 0334cb17..854cda7e 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java @@ -24,10 +24,26 @@ public class StepModel { public StepModel(StepMode mode, double value) { setMode(mode); setValue(value); + setSteps(null); + } + + public StepModel(double[] increments, double numLines) { + setMode(StepMode.INCREMENT_BY_FIT); + setValue(numLines); + setSteps(increments); } private StepMode mode; - private double value; + private double value; // increment by x value, pixels or number of sub division + private double[] steps; // for fit mode: possible increments (by value) to choose from + + public double[] getSteps() { + return steps; + } + + public void setSteps(double[] steps) { + this.steps = steps; + } public StepMode getMode() { return mode; @@ -44,4 +60,33 @@ public double getValue() { public void setValue(double value) { this.value = value; } + + /* + depending on the currently displayed range (by value) choose increment so that + the number of lines is closest to value + */ + public double getFitValue(double range) { + + // no possible increments where supplied (e.g. switched into this mode without calling setSteps(...) + // TODO: throw exception this should not be done + if (steps == null) + return getValue(); + + double curStep = steps[0]; + + double oldDistance = Math.abs((range / curStep)-value ); + + // determine which step size comes closest to the desired number of steps + for (double step : steps) { + + double newDistance = Math.abs((range / step)-value ); + + // closer than previos stepping? + if (newDistance < oldDistance){ + curStep = step; + oldDistance = newDistance; + } + } + return curStep; + } } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java index 7f9114b4..f0f6ef38 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYGraphWidget.java @@ -546,7 +546,7 @@ protected void drawLineLabel(Canvas canvas, Edge edge, Number val, float x, floa } /** - * Draws the drid and domain/range labels for the plot. + * Draws the grid and domain/range labels for the plot. * * @param canvas */ diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java b/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java index 9f72cf18..1ec34300 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java @@ -806,6 +806,12 @@ public void setDomainStepMode(StepMode domainStepMode) { } public double getDomainStepValue() { + + // increment by fit needs to know the current range + if (domainStepModel.getMode() == StepMode.INCREMENT_BY_FIT) { + return domainStepModel.getFitValue(getBounds().getxRegion().length().doubleValue()); + } + return domainStepModel.getValue(); } @@ -827,6 +833,12 @@ public void setRangeStepMode(StepMode rangeStepMode) { } public double getRangeStepValue() { + + // increment by fit needs to know the current range + if (rangeStepModel.getMode() == StepMode.INCREMENT_BY_FIT) { + return rangeStepModel.getFitValue(getBounds().getyRegion().length().doubleValue()); + } + return rangeStepModel.getValue(); } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYStepCalculator.java b/androidplot-core/src/main/java/com/androidplot/xy/XYStepCalculator.java index d90d9172..34de518d 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYStepCalculator.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYStepCalculator.java @@ -59,6 +59,7 @@ public static Step getStep(StepMode typeXY, double stepValue, Region realBounds, double stepCount = 0; switch(typeXY) { case INCREMENT_BY_VAL: + case INCREMENT_BY_FIT: stepVal = stepValue; stepPix = stepValue / realBounds.ratio(pixelBounds).doubleValue(); stepCount = pixelBounds.length().doubleValue() / stepPix; diff --git a/build.gradle b/build.gradle index 51463dd9..7b66a54d 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7' classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.5.0' diff --git a/demoapp-wearable/build.gradle b/demoapp-wearable/build.gradle index 98d5307d..378ac36b 100644 --- a/demoapp-wearable/build.gradle +++ b/demoapp-wearable/build.gradle @@ -19,7 +19,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' + classpath 'com.android.tools.build:gradle:2.2.3' } } apply plugin: 'com.android.application' diff --git a/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java b/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java index ebf493d3..900c82cf 100644 --- a/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java @@ -53,8 +53,14 @@ public void onClick(View view) { // move dynamically with the data when the users pans or zooms: plot.setUserDomainOrigin(0); plot.setUserRangeOrigin(0); - plot.setDomainStep(StepMode.INCREMENT_BY_VAL, 500); - plot.setRangeStep(StepMode.INCREMENT_BY_VAL, 100); + + // predefine the stepping of both axis + // increment will be chosen from list to best fit 5 grid lines + double[] inc_domain = new double[]{10,50,100,500}; + double[] inc_range = new double[]{1,5,10,20,50,100}; + plot.setDomainStepModel(new StepModel(inc_domain,5)); + plot.setRangeStepModel( new StepModel(inc_range,5)); + panSpinner = (Spinner) findViewById(R.id.pan_spinner); zoomSpinner = (Spinner) findViewById(R.id.zoom_spinner); From 654d6e2336ab1ced691961aec4cc32683a53a94c Mon Sep 17 00:00:00 2001 From: psi Date: Thu, 23 Feb 2017 12:16:38 +0100 Subject: [PATCH 2/5] Introduce a new StepMode Why: Increment by value -> no good when zooming Increment by pixel -> no good when zooming subdivide -> depending on data chooses ticks at wired locations e.g (1.3 , 2.3, 3,3 instead of 1, 2, 3) Workaround: When you know your data: supply an array of predefined increments (by value) for StepModel to choose from to best fit the desired number of lines. For example: Start zoomed out with ticks every 100 and as you zoom in switch to 50,10,1 --- .../java/com/androidplot/xy/StepModel.java | 47 +------------ .../java/com/androidplot/xy/StepModelFit.java | 68 +++++++++++++++++++ .../main/java/com/androidplot/xy/XYPlot.java | 12 ---- .../demos/TouchZoomExampleActivity.java | 4 +- 4 files changed, 71 insertions(+), 60 deletions(-) create mode 100644 androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java diff --git a/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java b/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java index 854cda7e..0334cb17 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/StepModel.java @@ -24,26 +24,10 @@ public class StepModel { public StepModel(StepMode mode, double value) { setMode(mode); setValue(value); - setSteps(null); - } - - public StepModel(double[] increments, double numLines) { - setMode(StepMode.INCREMENT_BY_FIT); - setValue(numLines); - setSteps(increments); } private StepMode mode; - private double value; // increment by x value, pixels or number of sub division - private double[] steps; // for fit mode: possible increments (by value) to choose from - - public double[] getSteps() { - return steps; - } - - public void setSteps(double[] steps) { - this.steps = steps; - } + private double value; public StepMode getMode() { return mode; @@ -60,33 +44,4 @@ public double getValue() { public void setValue(double value) { this.value = value; } - - /* - depending on the currently displayed range (by value) choose increment so that - the number of lines is closest to value - */ - public double getFitValue(double range) { - - // no possible increments where supplied (e.g. switched into this mode without calling setSteps(...) - // TODO: throw exception this should not be done - if (steps == null) - return getValue(); - - double curStep = steps[0]; - - double oldDistance = Math.abs((range / curStep)-value ); - - // determine which step size comes closest to the desired number of steps - for (double step : steps) { - - double newDistance = Math.abs((range / step)-value ); - - // closer than previos stepping? - if (newDistance < oldDistance){ - curStep = step; - oldDistance = newDistance; - } - } - return curStep; - } } diff --git a/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java new file mode 100644 index 00000000..a12cfb96 --- /dev/null +++ b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java @@ -0,0 +1,68 @@ +package com.androidplot.xy; + +import com.androidplot.Region; + +/** + * Created by psi on 23.02.2017. + * + * Subclass of StepModel that chooses from predefined step values + * + * Depending on the currently displayed range (by value) choose increment so that + * the number of lines is closest to StepModel.value + */ + +public class StepModelFit extends StepModel { + + private double[] steps; + private Region scale; + + public StepModelFit(Region axisRegion, double[] increments, double numLines) { + super(StepMode.INCREMENT_BY_FIT, numLines); + + setSteps(increments); + setScale(axisRegion); + } + + public double[] getSteps() { + return steps; + } + + public void setSteps(double[] steps) { + this.steps = steps; + } + + public Region getScale() { + return scale; + } + + public void setScale(Region scale) { + this.scale = scale; + } + + // does not return StepModel.value instead calculates best fit + @Override + public double getValue() { + + // no possible increments where supplied (e.g. switched into this mode without calling setSteps(...) + // TODO: throw exception this should not be done + if (steps == null) + return super.getValue(); + + double curStep = steps[0]; + + double oldDistance = Math.abs((scale.length().doubleValue() / curStep)-super.getValue() ); + + // determine which step size comes closest to the desired number of steps + for (double step : steps) { + + double newDistance = Math.abs((scale.length().doubleValue() / step)-super.getValue() ); + + // closer than previos stepping? + if (newDistance < oldDistance){ + curStep = step; + oldDistance = newDistance; + } + } + return curStep; + } +} diff --git a/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java b/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java index 1ec34300..9f72cf18 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/XYPlot.java @@ -806,12 +806,6 @@ public void setDomainStepMode(StepMode domainStepMode) { } public double getDomainStepValue() { - - // increment by fit needs to know the current range - if (domainStepModel.getMode() == StepMode.INCREMENT_BY_FIT) { - return domainStepModel.getFitValue(getBounds().getxRegion().length().doubleValue()); - } - return domainStepModel.getValue(); } @@ -833,12 +827,6 @@ public void setRangeStepMode(StepMode rangeStepMode) { } public double getRangeStepValue() { - - // increment by fit needs to know the current range - if (rangeStepModel.getMode() == StepMode.INCREMENT_BY_FIT) { - return rangeStepModel.getFitValue(getBounds().getyRegion().length().doubleValue()); - } - return rangeStepModel.getValue(); } diff --git a/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java b/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java index 900c82cf..b473f7d6 100644 --- a/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java @@ -58,8 +58,8 @@ public void onClick(View view) { // increment will be chosen from list to best fit 5 grid lines double[] inc_domain = new double[]{10,50,100,500}; double[] inc_range = new double[]{1,5,10,20,50,100}; - plot.setDomainStepModel(new StepModel(inc_domain,5)); - plot.setRangeStepModel( new StepModel(inc_range,5)); + plot.setDomainStepModel(new StepModelFit(plot.getBounds().getxRegion(),inc_domain,5)); + plot.setRangeStepModel( new StepModelFit(plot.getBounds().getyRegion(),inc_range,5)); panSpinner = (Spinner) findViewById(R.id.pan_spinner); From 370fbdbb492d3341518b82281c54ffd62aa84a9e Mon Sep 17 00:00:00 2001 From: psi Date: Thu, 23 Feb 2017 13:05:13 +0100 Subject: [PATCH 3/5] comments --- .../src/main/java/com/androidplot/xy/StepModelFit.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java index a12cfb96..f9eb1cdf 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java @@ -13,8 +13,8 @@ public class StepModelFit extends StepModel { - private double[] steps; - private Region scale; + private double[] steps; // list of steps to choose from + private Region scale; // axis region on display public StepModelFit(Region axisRegion, double[] increments, double numLines) { super(StepMode.INCREMENT_BY_FIT, numLines); @@ -38,13 +38,12 @@ public Region getScale() { public void setScale(Region scale) { this.scale = scale; } - + // does not return StepModel.value instead calculates best fit @Override public double getValue() { // no possible increments where supplied (e.g. switched into this mode without calling setSteps(...) - // TODO: throw exception this should not be done if (steps == null) return super.getValue(); @@ -57,7 +56,7 @@ public double getValue() { double newDistance = Math.abs((scale.length().doubleValue() / step)-super.getValue() ); - // closer than previos stepping? + // closer than previous stepping? if (newDistance < oldDistance){ curStep = step; oldDistance = newDistance; From 7edf573f37189978357603a2b3b747e85b29fbb4 Mon Sep 17 00:00:00 2001 From: psi Date: Sat, 25 Feb 2017 12:55:26 +0100 Subject: [PATCH 4/5] restore messed up build files --- .idea/copyright/profiles_settings.xml | 6 +++++- .../main/java/com/androidplot/xy/StepModelFit.java | 12 ++++-------- build.gradle | 2 +- demoapp-wearable/build.gradle | 2 +- .../androidplot/demos/TouchZoomExampleActivity.java | 7 ++++--- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml index e7bedf33..8f7b02e7 100644 --- a/.idea/copyright/profiles_settings.xml +++ b/.idea/copyright/profiles_settings.xml @@ -1,3 +1,7 @@ - + + + + + \ No newline at end of file diff --git a/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java index f9eb1cdf..75e9d7e9 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java @@ -3,14 +3,10 @@ import com.androidplot.Region; /** - * Created by psi on 23.02.2017. - * - * Subclass of StepModel that chooses from predefined step values - * - * Depending on the currently displayed range (by value) choose increment so that - * the number of lines is closest to StepModel.value + * Subclass of StepModel that chooses from predefined step values. Depending on the currently + * displayed range (by value) choose increment so that the number of lines + * is closest to StepModel.value */ - public class StepModelFit extends StepModel { private double[] steps; // list of steps to choose from @@ -48,10 +44,10 @@ public double getValue() { return super.getValue(); double curStep = steps[0]; - double oldDistance = Math.abs((scale.length().doubleValue() / curStep)-super.getValue() ); // determine which step size comes closest to the desired number of steps + // since steps[] is a small array brute force search is ok for (double step : steps) { double newDistance = Math.abs((scale.length().doubleValue() / step)-super.getValue() ); diff --git a/build.gradle b/build.gradle index 7b66a54d..51463dd9 100644 --- a/build.gradle +++ b/build.gradle @@ -38,7 +38,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:2.2.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7' classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.5.0' diff --git a/demoapp-wearable/build.gradle b/demoapp-wearable/build.gradle index 378ac36b..98d5307d 100644 --- a/demoapp-wearable/build.gradle +++ b/demoapp-wearable/build.gradle @@ -19,7 +19,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:1.2.3' } } apply plugin: 'com.android.application' diff --git a/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java b/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java index b473f7d6..6d7cd9e0 100644 --- a/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java +++ b/demoapp/src/main/java/com/androidplot/demos/TouchZoomExampleActivity.java @@ -31,6 +31,7 @@ public class TouchZoomExampleActivity extends Activity { private static final int SERIES_SIZE = 3000; private static final int SERIES_ALPHA = 255; + private static final int NUM_GRIDLINES = 5; private XYPlot plot; private PanZoom panZoom; private Button resetButton; @@ -55,11 +56,11 @@ public void onClick(View view) { plot.setUserRangeOrigin(0); // predefine the stepping of both axis - // increment will be chosen from list to best fit 5 grid lines + // increment will be chosen from list to best fit NUM_GRIDLINES grid lines double[] inc_domain = new double[]{10,50,100,500}; double[] inc_range = new double[]{1,5,10,20,50,100}; - plot.setDomainStepModel(new StepModelFit(plot.getBounds().getxRegion(),inc_domain,5)); - plot.setRangeStepModel( new StepModelFit(plot.getBounds().getyRegion(),inc_range,5)); + plot.setDomainStepModel(new StepModelFit(plot.getBounds().getxRegion(),inc_domain,NUM_GRIDLINES)); + plot.setRangeStepModel( new StepModelFit(plot.getBounds().getyRegion(),inc_range,NUM_GRIDLINES)); panSpinner = (Spinner) findViewById(R.id.pan_spinner); From 99b0c6218b2f197fed720448cb8831e6233a47eb Mon Sep 17 00:00:00 2001 From: psi Date: Sat, 25 Feb 2017 14:08:17 +0100 Subject: [PATCH 5/5] sanity check for StepModelFit.setSteps added unit test for StepModelFit --- .../java/com/androidplot/xy/StepModelFit.java | 26 +++++++- .../com/androidplot/xy/StepModelFitTest.java | 61 +++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 androidplot-core/src/test/java/com/androidplot/xy/StepModelFitTest.java diff --git a/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java index 75e9d7e9..d2b12f0b 100644 --- a/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java +++ b/androidplot-core/src/main/java/com/androidplot/xy/StepModelFit.java @@ -2,6 +2,8 @@ import com.androidplot.Region; +import java.util.Arrays; + /** * Subclass of StepModel that chooses from predefined step values. Depending on the currently * displayed range (by value) choose increment so that the number of lines @@ -24,6 +26,16 @@ public double[] getSteps() { } public void setSteps(double[] steps) { + + // sanity checks: no null, 0 or negative + if (steps == null || steps.length == 0) + return; + + for (double step : steps) { + if (step <= 0.0d) + return; + } + this.steps = steps; } @@ -39,8 +51,9 @@ public void setScale(Region scale) { @Override public double getValue() { - // no possible increments where supplied (e.g. switched into this mode without calling setSteps(...) - if (steps == null) + // no possible increments where supplied + // or no region defined + if (steps == null || scale == null || !scale.isDefined()) return super.getValue(); double curStep = steps[0]; @@ -60,4 +73,13 @@ public double getValue() { } return curStep; } + + @Override + public String toString() { + return "StepModelFit{" + + "steps=" + Arrays.toString(steps) + + ", scale=" + scale + + ", current stepping=" + getValue() + + '}'; + } } diff --git a/androidplot-core/src/test/java/com/androidplot/xy/StepModelFitTest.java b/androidplot-core/src/test/java/com/androidplot/xy/StepModelFitTest.java new file mode 100644 index 00000000..5f34fd52 --- /dev/null +++ b/androidplot-core/src/test/java/com/androidplot/xy/StepModelFitTest.java @@ -0,0 +1,61 @@ +package com.androidplot.xy; + +import com.androidplot.Region; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class StepModelFitTest { + + Region regionSmall = new Region(0,11); + Region regionBig = new Region(-111,420); + Region regionZero = new Region(0, 0); + Region regionUndef = new Region(0, null); + + double[] stpSmall = {1,2,5}, stpBig = {1,10,100}, nonsense = {0}; + + @Before + public void setUp() throws Exception { + + } + + @After + public void tearDown() throws Exception { + + } + + @Test + public void getValue() throws Exception { + + StepModelFit model = new StepModelFit(regionSmall,stpSmall,3); + + assertEquals(5.0, model.getValue(), 0.0); + model.setValue(5.0); + assertEquals(2.0, model.getValue(), 0.0); + model.setValue(7.0); + assertEquals(2.0, model.getValue(), 0.0); + + model.setSteps(stpBig); + assertEquals(1.0, model.getValue(), 0.0); + + model.setScale(regionBig); + assertEquals(100.0, model.getValue(), 0.0); + model.setValue(1000.0); + assertEquals(1.0, model.getValue(), 0.0); + + // bad parameters + model.setSteps(nonsense); + assertArrayEquals(stpBig,model.getSteps(), 0.0); + + model.setScale(regionZero); + assertEquals(stpBig[0], model.getValue(), 0.0); + + model.setScale(regionUndef); + model.setValue(1.1); + assertEquals(1.1, model.getValue(), 0.0); + } + +} \ No newline at end of file