You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2018/10/29 22:47:42 UTC

[incubator-plc4x] branch master updated: - Fixing bugs - Increasing test coverage

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/master by this push:
     new 6cf60a0  - Fixing bugs - Increasing test coverage
6cf60a0 is described below

commit 6cf60a0a99298140f0931d0276973e1119b48dcc
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Oct 29 23:47:36 2018 +0100

    - Fixing bugs
    - Increasing test coverage
---
 .../apache/plc4x/java/ads/model/AdsDataType.java   |  4 +-
 .../java/s7/netty/util/S7PlcFieldHandler.java      | 62 ++++++++++++++++------
 .../java/s7/netty/util/S7PlcFieldHandlerTest.java  | 20 +++----
 3 files changed, 59 insertions(+), 27 deletions(-)

diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
index c5fd420..771ccb7 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
@@ -50,8 +50,8 @@ public enum AdsDataType {
     UINT16(0, Integer.MAX_VALUE, 16),
     UINT32(0, produceUnsignedMaxValue(32), 32),
     UINT64(0, produceUnsignedMaxValue(64), 64),
-    FLOAT(Float.MIN_VALUE, Float.MAX_VALUE, 32),
-    DOUBLE(Double.MIN_VALUE, Double.MAX_VALUE, 64),
+    FLOAT(-Float.MAX_VALUE, Float.MAX_VALUE, 32),
+    DOUBLE(-Double.MAX_VALUE, Double.MAX_VALUE, 64),
     // https://infosys.beckhoff.com/english.php?content=../content/1033/tcplccontrol/html/tcplcctrl_plc_data_types_overview.htm&id
     // Standard Data Types
     /**
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
index 14ba6f9..cb5548e 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
@@ -219,78 +219,91 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         BigInteger maxValue;
         Class<? extends BaseDefaultFieldItem> fieldType;
         Class<?> valueType;
+        Object[] castedValues;
         switch (s7Field.getDataType()) {
             case BYTE:
                 minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
                 fieldType = DefaultByteFieldItem.class;
                 valueType = Byte[].class;
+                castedValues = new Byte[values.length];
                 break;
             case WORD:
                 minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
                 fieldType = DefaultShortFieldItem.class;
                 valueType = Short[].class;
+                castedValues = new Short[values.length];
                 break;
             case DWORD:
                 minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 valueType = Integer[].class;
+                castedValues = new Integer[values.length];
                 break;
             case LWORD:
                 minValue = BigInteger.valueOf(Long.MIN_VALUE);
                 maxValue = BigInteger.valueOf(Long.MAX_VALUE);
                 fieldType = DefaultLongFieldItem.class;
                 valueType = Long[].class;
+                castedValues = new Long[values.length];
                 break;
             case SINT:
                 minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
                 fieldType = DefaultByteFieldItem.class;
                 valueType = Byte[].class;
+                castedValues = new Byte[values.length];
                 break;
             case USINT:
                 minValue = BigInteger.valueOf((long) 0);
                 maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE * 2);
                 fieldType = DefaultShortFieldItem.class;
                 valueType = Short[].class;
+                castedValues = new Short[values.length];
                 break;
             case INT:
                 minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
                 fieldType = DefaultShortFieldItem.class;
                 valueType = Short[].class;
+                castedValues = new Short[values.length];
                 break;
             case UINT:
                 minValue = BigInteger.valueOf((long) 0);
                 maxValue = BigInteger.valueOf(((long) Short.MAX_VALUE) * 2);
                 fieldType = DefaultIntegerFieldItem.class;
                 valueType = Integer[].class;
+                castedValues = new Integer[values.length];
                 break;
             case DINT:
                 minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
                 fieldType = DefaultIntegerFieldItem.class;
                 valueType = Integer[].class;
+                castedValues = new Integer[values.length];
                 break;
             case UDINT:
                 minValue = BigInteger.valueOf((long) 0);
                 maxValue = BigInteger.valueOf(((long) Integer.MAX_VALUE) * 2);
                 fieldType = DefaultLongFieldItem.class;
                 valueType = Long[].class;
+                castedValues = new Long[values.length];
                 break;
             case LINT:
                 minValue = BigInteger.valueOf(Long.MIN_VALUE);
                 maxValue = BigInteger.valueOf(Long.MAX_VALUE);
                 fieldType = DefaultLongFieldItem.class;
                 valueType = Long[].class;
+                castedValues = new Long[values.length];
                 break;
             case ULINT:
                 minValue = BigInteger.valueOf((long) 0);
                 maxValue = BigInteger.valueOf(Long.MAX_VALUE).multiply(BigInteger.valueOf((long) 2));
                 fieldType = DefaultBigIntegerFieldItem.class;
                 valueType = BigInteger[].class;
+                castedValues = new BigInteger[values.length];
                 break;
             default:
                 throw new IllegalArgumentException(
@@ -298,16 +311,16 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         }
 
         // Check the constraints
-        for (Object val : values) {
+        for (int i = 0; i < values.length; i++) {
             BigInteger value;
-            if (val instanceof BigInteger) {
-                value = (BigInteger) val;
-            } else if ((val instanceof Byte) || (val instanceof Short) ||
-                (val instanceof Integer) || (val instanceof Long)) {
-                value = BigInteger.valueOf(((Number) val).longValue());
+            if (values[i] instanceof BigInteger) {
+                value = (BigInteger) values[i];
+            } else if ((values[i] instanceof Byte) || (values[i] instanceof Short) ||
+                (values[i] instanceof Integer) || (values[i] instanceof Long)) {
+                value = BigInteger.valueOf(((Number) values[i]).longValue());
             } else {
                 throw new IllegalArgumentException(
-                    "Value of type " + val.getClass().getName() +
+                    "Value of type " + values[i].getClass().getName() +
                         " is not assignable to " + s7Field.getDataType().name() + " fields.");
             }
             if (minValue.compareTo(value) > 0) {
@@ -320,11 +333,22 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
                     "Value of " + value.toString() + " exceeds allowed maximum for type "
                         + s7Field.getDataType().name() + " (max " + maxValue.toString() + ")");
             }
+            if(valueType == Byte[].class) {
+                castedValues[i] = value.byteValue();
+            } else if (valueType == Short[].class) {
+                castedValues[i] = value.shortValue();
+            } else if (valueType == Integer[].class) {
+                castedValues[i] = value.intValue();
+            } else if (valueType == Long[].class) {
+                castedValues[i] = value.longValue();
+            } else {
+                castedValues[i] = value;
+            }
         }
 
         // Create the field item.
         try {
-            return fieldType.getDeclaredConstructor(valueType).newInstance(new Object[]{values});
+            return fieldType.getDeclaredConstructor(valueType).newInstance(new Object[]{castedValues});
         } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
             throw new PlcRuntimeException("Error initializing field class " + fieldType.getSimpleName(), e);
         }
@@ -338,6 +362,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         Double maxValue;
         Class<? extends BaseDefaultFieldItem> fieldType;
         Class<?> valueType;
+        Object[] castedValues;
         switch (s7Field.getDataType()) {
             case REAL:
                 // Yes this is actually correct, if I set min to Float.MIN_VALUE (0.0 < Float.MIN_VALUE = true)
@@ -345,6 +370,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
                 maxValue = (double) Float.MAX_VALUE;
                 fieldType = DefaultFloatFieldItem.class;
                 valueType = Float[].class;
+                castedValues = new Float[values.length];
                 break;
             case LREAL:
                 // Yes this is actually correct, if I set min to Double.MIN_VALUE (0.0 < Double.MIN_VALUE = true)
@@ -352,6 +378,7 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
                 maxValue = Double.MAX_VALUE;
                 fieldType = DefaultDoubleFieldItem.class;
                 valueType = Double[].class;
+                castedValues = new Double[values.length];
                 break;
             default:
                 throw new IllegalArgumentException(
@@ -359,15 +386,15 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
         }
 
         // Check the constraints
-        for (Object val : values) {
+        for (int i = 0; i < values.length; i++) {
             Double value;
-            if (val instanceof Float) {
-                value = ((Float) val).doubleValue();
-            } else if (val instanceof Double) {
-                value = (Double) val;
+            if (values[i] instanceof Float) {
+                value = ((Float) values[i]).doubleValue();
+            } else if (values[i] instanceof Double) {
+                value = (Double) values[i];
             } else {
                 throw new IllegalArgumentException(
-                    "Value of type " + val.getClass().getName() +
+                    "Value of type " + values[i].getClass().getName() +
                         " is not assignable to " + s7Field.getDataType().name() + " fields.");
             }
             if (value < minValue) {
@@ -380,11 +407,16 @@ public class S7PlcFieldHandler extends DefaultPlcFieldHandler {
                     "Value of " + value + " exceeds allowed maximum for type "
                         + s7Field.getDataType().name() + " (max " + maxValue.toString() + ")");
             }
+            if(valueType == Float[].class) {
+                castedValues[i] = value.floatValue();
+            } else {
+                castedValues[i] = value;
+            }
         }
 
         // Create the field item.
         try {
-            return fieldType.getDeclaredConstructor(valueType).newInstance(new Object[]{values});
+            return fieldType.getDeclaredConstructor(valueType).newInstance(new Object[]{castedValues});
         } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
             throw new PlcRuntimeException("Error initializing field class " + fieldType.getSimpleName(), e);
         }
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
index fe7f541..589ebf2 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
@@ -46,7 +46,7 @@ class S7PlcFieldHandlerTest {
 
     private static S7PlcFieldHandler SUT = new S7PlcFieldHandler();
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @ValueSource(strings = {
         "%DB1.DBX1.0:BOOL",
         "%DB1.DBW1.0:WORD"
@@ -55,7 +55,7 @@ class S7PlcFieldHandlerTest {
         SUT.createField(fieldQuery);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeOneBitTypes(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -92,7 +92,7 @@ class S7PlcFieldHandlerTest {
         encode(name, field, values, expectedSuccess, SUT::encodeBoolean);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeOneByteIntegerTypes(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -115,7 +115,7 @@ class S7PlcFieldHandlerTest {
         encode(name, field, values, expectedSuccess, SUT::encodeByte);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeTwoByteIntegerTypes(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -137,7 +137,7 @@ class S7PlcFieldHandlerTest {
         encode(name, field, values, expectedSuccess, SUT::encodeShort);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeFourByteIntegerTypes(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -159,7 +159,7 @@ class S7PlcFieldHandlerTest {
         encode(name, field, values, expectedSuccess, SUT::encodeInteger);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeEightByteIntegerTypes(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -183,7 +183,7 @@ class S7PlcFieldHandlerTest {
         encode(name, field, values, expectedSuccess, SUT::encodeLong);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeFourByteFloatTypes(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -193,7 +193,7 @@ class S7PlcFieldHandlerTest {
         encode(name, field, values, expectedSuccess, SUT::encodeFloat);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeEightByteFloatTypes(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -203,7 +203,7 @@ class S7PlcFieldHandlerTest {
         encode(name, field, values, expectedSuccess, SUT::encodeDouble);
     }
 
-    //@ParameterizedTest
+    @ParameterizedTest
     @MethodSource("createInputArrays")
     void encodeString(String name, PlcField field, Object[] values) {
         Set<String> expectedSuccess = new HashSet<>(Arrays.asList(
@@ -279,7 +279,7 @@ class S7PlcFieldHandlerTest {
 
                 BaseDefaultFieldItem fieldItem;
                 try {
-                    fieldItem = javaType.fieldItemType.getDeclaredConstructor(testValues[0].getClass()).newInstance(new Object[]{testValues});
+                    fieldItem = javaType.fieldItemType.getDeclaredConstructor(Array.newInstance(testValues[0].getClass(), 0).getClass()).newInstance(new Object[]{testValues});
                 } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                     throw new PlcRuntimeException("Error initializing field class " + javaType.fieldItemType.getSimpleName(), e);
                 }