From 3b473329ea8cd29251331d63377962d597e62bae Mon Sep 17 00:00:00 2001 From: OliE Date: Mon, 26 Feb 2018 17:33:54 +0100 Subject: [PATCH] use generic java reflection to divide and add scale measurements --- .../core/datatypes/ScaleMeasurement.java | 47 ++++++++++++------- .../com/health/openscale/MeasurementTest.java | 34 ++++++++++++-- 2 files changed, 59 insertions(+), 22 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java index a0e93c3e..07154319 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java +++ b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java @@ -106,25 +106,38 @@ public class ScaleMeasurement implements Cloneable { } public void add(final ScaleMeasurement summand) { - weight += summand.getWeight(); - fat += summand.getFat(); - water += summand.getWater(); - muscle += summand.getMuscle(); - lbw += summand.getLbw(); - bone += summand.getBone(); - waist += summand.getWaist(); - hip += summand.getHip(); + try { + Field[] fields = getClass().getDeclaredFields(); + + for (Field field : fields) { + field.setAccessible(true); + Object value = field.get(this); + + if (value != null && Float.class.isAssignableFrom(value.getClass())) { + field.set(this, (float)value + (float)field.get(summand)); + } + field.setAccessible(false); + } + } catch (IllegalAccessException e) { + Log.e("ScaleMeasurement", "Error: " + e.getMessage()); + } } public void divide(final float divisor) { - weight /= divisor; - fat /= divisor; - water /= divisor; - muscle /= divisor; - lbw /= divisor; - bone /= divisor; - waist /= divisor; - hip /= divisor; + try { + Field[] fields = getClass().getDeclaredFields(); + + for (Field field : fields) { + field.setAccessible(true); + Object value = field.get(this); + if (value != null && Float.class.isAssignableFrom(value.getClass())) { + field.set(this, (float)value / divisor); + } + field.setAccessible(false); + } + } catch (IllegalAccessException e) { + Log.e("ScaleMeasurement", "Error: " + e.getMessage()); + } } public void merge(ScaleMeasurement measurements) { @@ -134,7 +147,7 @@ public class ScaleMeasurement implements Cloneable { for (Field field : fields) { field.setAccessible(true); Object value = field.get(measurements); - if (Float.class.isAssignableFrom(value.getClass())) { + if (value != null && Float.class.isAssignableFrom(value.getClass())) { if ((float)field.get(this) == 0.0f) { field.set(this, value); } diff --git a/android_app/app/src/test/java/com/health/openscale/MeasurementTest.java b/android_app/app/src/test/java/com/health/openscale/MeasurementTest.java index 4bfb1627..908e0407 100644 --- a/android_app/app/src/test/java/com/health/openscale/MeasurementTest.java +++ b/android_app/app/src/test/java/com/health/openscale/MeasurementTest.java @@ -17,18 +17,18 @@ package com.health.openscale; import com.health.openscale.core.datatypes.ScaleMeasurement; +import org.junit.Before; import org.junit.Test; import static junit.framework.Assert.assertEquals; public class MeasurementTest { private static final double DELTA = 1e-15; + private ScaleMeasurement measurementA = new ScaleMeasurement(); + private ScaleMeasurement measurementB = new ScaleMeasurement(); - @Test - public void mergeTest() throws InstantiationException, IllegalAccessException { - ScaleMeasurement measurementA = new ScaleMeasurement(); - ScaleMeasurement measurementB = new ScaleMeasurement(); - + @Before + public void initData() { measurementA.setWeight(80.0f); measurementA.setBone(3.0f); measurementA.setMuscle(55.0f); @@ -37,7 +37,10 @@ public class MeasurementTest { measurementB.setBone(10.0f); measurementB.setHip(5.0f); measurementB.setWater(12.0f); + } + @Test + public void mergeTest() { measurementA.merge(measurementB); assertEquals(80.0f, measurementA.getWeight(), DELTA); @@ -46,4 +49,25 @@ public class MeasurementTest { assertEquals( 12.0f, measurementA.getWater(), DELTA); assertEquals( 55.0f, measurementA.getMuscle(), DELTA); } + + @Test + public void divideTest() { + measurementA.divide(2.0f); + + assertEquals(40.0f, measurementA.getWeight(), DELTA); + assertEquals(1.5f, measurementA.getBone(), DELTA); + assertEquals(27.5f, measurementA.getMuscle(), DELTA); + assertEquals(0.0f, measurementA.getWater(), DELTA); + } + + @Test + public void addTest() { + measurementA.add(measurementB); + + assertEquals(170.0f, measurementA.getWeight(), DELTA); + assertEquals(13.0f, measurementA.getBone(), DELTA); + assertEquals(55.0f, measurementA.getMuscle(), DELTA); + assertEquals(12.0f, measurementA.getWater(), DELTA); + assertEquals(5.0f, measurementA.getHip(), DELTA); + } }