1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-09-01 20:33:31 +02:00

use generic java reflection to divide and add scale measurements

This commit is contained in:
OliE
2018-02-26 17:33:54 +01:00
parent b2656bbbfc
commit 3b473329ea
2 changed files with 59 additions and 22 deletions

View File

@@ -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);
}

View File

@@ -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);
}
}