diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java index cb1bdaee12..5dd8ddf0e0 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcDATE_AND_TIME.java @@ -18,17 +18,19 @@ */ package org.apache.plc4x.java.spi.values; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.types.PlcValueType; import org.apache.plc4x.java.spi.codegen.WithOption; import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import java.math.BigDecimal; +import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.time.ZoneOffset; public class PlcDATE_AND_TIME extends PlcIECValue { @@ -36,30 +38,86 @@ public class PlcDATE_AND_TIME extends PlcIECValue { public static PlcDATE_AND_TIME of(Object value) { if (value instanceof LocalDateTime) { return new PlcDATE_AND_TIME((LocalDateTime) value); + } else if (value instanceof Byte) { + return new PlcDATE_AND_TIME((Byte) value); + } else if (value instanceof Short) { + return new PlcDATE_AND_TIME((Short) value); + } else if (value instanceof Integer) { + return new PlcDATE_AND_TIME((Integer) value); } else if (value instanceof Long) { - return new PlcDATE_AND_TIME(LocalDateTime.ofInstant( - Instant.ofEpochSecond((long) value), ZoneOffset.UTC)); + return new PlcDATE_AND_TIME((Long) value); + } else if (value instanceof Float) { + return new PlcDATE_AND_TIME((Float) value); + } else if (value instanceof Double) { + return new PlcDATE_AND_TIME((Double) value); + } else if (value instanceof BigInteger) { + return new PlcDATE_AND_TIME((BigInteger) value); + } else if (value instanceof BigDecimal) { + return new PlcDATE_AND_TIME((BigDecimal) value); + } else { + return new PlcDATE_AND_TIME(LocalDateTime.parse(value.toString())); } - throw new PlcRuntimeException("Invalid value type"); } public static PlcDATE_AND_TIME ofSecondsSinceEpoch(long secondsSinceEpoch) { return new PlcDATE_AND_TIME(LocalDateTime.ofEpochSecond(secondsSinceEpoch, 0, - ZoneOffset.UTC)); + OffsetDateTime.now().getOffset())); } public static PlcDATE_AND_TIME ofSegments(int year, int month, int day, int hour, int minutes, int seconds, int nanoseconds) { return new PlcDATE_AND_TIME(LocalDateTime.of(year, month, day, hour, minutes, seconds, nanoseconds)); } - public PlcDATE_AND_TIME(LocalDateTime value) { - this.value = value; + public PlcDATE_AND_TIME(Byte secondsSinceEpoch) { + this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch, 0, + OffsetDateTime.now().getOffset()); + this.isNullable = false; + } + + public PlcDATE_AND_TIME(Short secondsSinceEpoch) { + this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch, 0, + OffsetDateTime.now().getOffset()); this.isNullable = false; } - public PlcDATE_AND_TIME(long secondsSinceEpoch) { + public PlcDATE_AND_TIME(Integer secondsSinceEpoch) { this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch, 0, - ZoneOffset.UTC); + OffsetDateTime.now().getOffset()); + this.isNullable = false; + } + + public PlcDATE_AND_TIME(Long secondsSinceEpoch) { + this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch, 0, + OffsetDateTime.now().getOffset()); + this.isNullable = false; + } + + public PlcDATE_AND_TIME(Float secondsSinceEpoch) { + this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, + OffsetDateTime.now().getOffset()); + this.isNullable = false; + } + + public PlcDATE_AND_TIME(Double secondsSinceEpoch) { + this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, + OffsetDateTime.now().getOffset()); + this.isNullable = false; + } + + public PlcDATE_AND_TIME(BigInteger secondsSinceEpoch) { + this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, + OffsetDateTime.now().getOffset()); + this.isNullable = false; + } + + public PlcDATE_AND_TIME(BigDecimal secondsSinceEpoch) { + this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, + OffsetDateTime.now().getOffset()); + this.isNullable = false; + } + + public PlcDATE_AND_TIME(LocalDateTime value) { + this.value = value; this.isNullable = false; } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLDATE.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLDATE.java index 8dee03b5e4..bbac8b9c4d 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLDATE.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLDATE.java @@ -73,56 +73,56 @@ public PlcLDATE(LocalDate value) { public PlcLDATE(Byte secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond((long) secondsSinceEpoch, 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } public PlcLDATE(Short secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond((long) secondsSinceEpoch, 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } public PlcLDATE(Integer secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond((long) secondsSinceEpoch, 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } public PlcLDATE(Long secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond((long) secondsSinceEpoch, 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } public PlcLDATE(Float secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } public PlcLDATE(Double secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } public PlcLDATE(BigInteger secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } public PlcLDATE(BigDecimal secondsSinceEpoch) { // REMARK: Yes, I'm using LocalDataTime.ofInstant as LocalDate.ofInstant is marked "JDK 1.9" this.value = LocalDateTime.ofEpochSecond(secondsSinceEpoch.longValue(), 0, - OffsetDateTime.now().getOffset() ).toLocalDate(); + OffsetDateTime.now().getOffset()).toLocalDate(); this.isNullable = false; } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME_OF_DAY.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME_OF_DAY.java index 07f1ea828f..f9c1f45b6b 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME_OF_DAY.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcLTIME_OF_DAY.java @@ -18,12 +18,12 @@ */ package org.apache.plc4x.java.spi.values; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.types.PlcValueType; import org.apache.plc4x.java.spi.codegen.WithOption; import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import java.math.BigDecimal; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.time.LocalTime; @@ -33,13 +33,25 @@ public class PlcLTIME_OF_DAY extends PlcIECValue { public static PlcLTIME_OF_DAY of(Object value) { if (value instanceof LocalTime) { return new PlcLTIME_OF_DAY((LocalTime) value); + } else if (value instanceof Byte) { + return new PlcLTIME_OF_DAY((Byte) value); + } else if (value instanceof Short) { + return new PlcLTIME_OF_DAY((Short) value); + } else if (value instanceof Integer) { + return new PlcLTIME_OF_DAY((Integer) value); } else if (value instanceof Long) { - return new PlcLTIME_OF_DAY(LocalTime.ofSecondOfDay(((Long) value) / 1000)); + return new PlcLTIME_OF_DAY((Long) value); + } else if (value instanceof Float) { + return new PlcLTIME_OF_DAY((Float) value); + } else if (value instanceof Double) { + return new PlcLTIME_OF_DAY((Double) value); } else if (value instanceof BigInteger) { - // TODO: Not 100% correct, we're loosing precision here - return new PlcLTIME_OF_DAY(LocalTime.ofSecondOfDay(((BigInteger) value).longValue() / 1000)); + return new PlcLTIME_OF_DAY((BigInteger) value); + } else if (value instanceof BigDecimal) { + return new PlcLTIME_OF_DAY((BigDecimal) value); + } else { + return new PlcLTIME_OF_DAY(LocalTime.parse(value.toString())); } - throw new PlcRuntimeException("Invalid value type"); } public static PlcLTIME_OF_DAY ofNanosecondsSinceMidnight(BigInteger nanosecondsSinceMidnight) { @@ -47,19 +59,48 @@ public static PlcLTIME_OF_DAY ofNanosecondsSinceMidnight(BigInteger nanosecondsS return new PlcLTIME_OF_DAY(LocalTime.ofNanoOfDay(nanosecondsSinceMidnight.longValue())); } - public PlcLTIME_OF_DAY(LocalTime value) { - this.value = value; + public PlcLTIME_OF_DAY(Byte millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay((long) millisecondsSinceMidnight * 1000000); this.isNullable = false; } - public PlcLTIME_OF_DAY(Long nanosecondsSinceMidnight) { - this.value = LocalTime.ofNanoOfDay(nanosecondsSinceMidnight); + public PlcLTIME_OF_DAY(Short millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay((long) millisecondsSinceMidnight * 1000000); this.isNullable = false; } - public PlcLTIME_OF_DAY(BigInteger nanosecondsSinceMidnight) { - // TODO: Not 100% correct, we're loosing precision here - this.value = LocalTime.ofNanoOfDay(nanosecondsSinceMidnight.longValue()); + public PlcLTIME_OF_DAY(Integer millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay((long) millisecondsSinceMidnight * 1000000); + this.isNullable = false; + } + + public PlcLTIME_OF_DAY(Long millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay(millisecondsSinceMidnight * 1000000); + this.isNullable = false; + } + + public PlcLTIME_OF_DAY(Float millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay(millisecondsSinceMidnight.longValue() * 1000000); + this.isNullable = false; + } + + public PlcLTIME_OF_DAY(Double millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay(millisecondsSinceMidnight.longValue() * 1000000); + this.isNullable = false; + } + + public PlcLTIME_OF_DAY(BigInteger millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay(millisecondsSinceMidnight.longValue() * 1000000); + this.isNullable = false; + } + + public PlcLTIME_OF_DAY(BigDecimal millisecondsSinceMidnight) { + this.value = LocalTime.ofNanoOfDay(millisecondsSinceMidnight.longValue() * 1000000); + this.isNullable = false; + } + + public PlcLTIME_OF_DAY(LocalTime value) { + this.value = value; this.isNullable = false; } diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java index 28bf8487a1..75fe8f08e8 100644 --- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java +++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/PlcTIME_OF_DAY.java @@ -18,12 +18,13 @@ */ package org.apache.plc4x.java.spi.values; -import org.apache.plc4x.java.api.exceptions.PlcRuntimeException; import org.apache.plc4x.java.api.types.PlcValueType; import org.apache.plc4x.java.spi.codegen.WithOption; import org.apache.plc4x.java.spi.generation.SerializationException; import org.apache.plc4x.java.spi.generation.WriteBuffer; +import java.math.BigDecimal; +import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.time.LocalTime; @@ -32,23 +33,73 @@ public class PlcTIME_OF_DAY extends PlcIECValue { public static PlcTIME_OF_DAY of(Object value) { if (value instanceof LocalTime) { return new PlcTIME_OF_DAY((LocalTime) value); - } else if(value instanceof Long) { + } else if (value instanceof Byte) { + return new PlcTIME_OF_DAY((Byte) value); + } else if (value instanceof Short) { + return new PlcTIME_OF_DAY((Short) value); + } else if (value instanceof Integer) { + return new PlcTIME_OF_DAY((Integer) value); + } else if (value instanceof Long) { return new PlcTIME_OF_DAY((Long) value); + } else if (value instanceof Float) { + return new PlcTIME_OF_DAY((Float) value); + } else if (value instanceof Double) { + return new PlcTIME_OF_DAY((Double) value); + } else if (value instanceof BigInteger) { + return new PlcTIME_OF_DAY((BigInteger) value); + } else if (value instanceof BigDecimal) { + return new PlcTIME_OF_DAY((BigDecimal) value); + } else { + return new PlcTIME_OF_DAY(LocalTime.parse(value.toString())); } - throw new PlcRuntimeException("Invalid value type"); } public static PlcTIME_OF_DAY ofMillisecondsSinceMidnight(long millisecondsSinceMidnight) { return new PlcTIME_OF_DAY(LocalTime.ofNanoOfDay(millisecondsSinceMidnight * 1000_000)); } - public PlcTIME_OF_DAY(LocalTime value) { - this.value = value; + public PlcTIME_OF_DAY(Byte secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight); this.isNullable = false; } - public PlcTIME_OF_DAY(long millisecondsSinceMidnight) { - this.value = LocalTime.ofNanoOfDay(millisecondsSinceMidnight * 1000_000); + public PlcTIME_OF_DAY(Short secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight); + this.isNullable = false; + } + + public PlcTIME_OF_DAY(Integer secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight); + this.isNullable = false; + } + + public PlcTIME_OF_DAY(Long secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight); + this.isNullable = false; + } + + public PlcTIME_OF_DAY(Float secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight.longValue()); + this.isNullable = false; + } + + public PlcTIME_OF_DAY(Double secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight.longValue()); + this.isNullable = false; + } + + public PlcTIME_OF_DAY(BigInteger secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight.longValue()); + this.isNullable = false; + } + + public PlcTIME_OF_DAY(BigDecimal secondsSinceMidnight) { + this.value = LocalTime.ofSecondOfDay(secondsSinceMidnight.longValue()); + this.isNullable = false; + } + + public PlcTIME_OF_DAY(LocalTime value) { + this.value = value; this.isNullable = false; } diff --git a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandlerTest.java b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandlerTest.java index 95b1df5455..0ce835b275 100644 --- a/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandlerTest.java +++ b/plc4j/spi/src/test/java/org/apache/plc4x/java/spi/values/DefaultPlcValueHandlerTest.java @@ -34,6 +34,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.util.Collections; import java.util.List; import java.util.StringJoiner; @@ -317,7 +318,7 @@ private static Stream getSingleElementPlcValues() { Arguments.of(new MockTag("mock", PlcValueType.WSTRING), BigDecimal.valueOf(42.34), new PlcWSTRING("42.34")), Arguments.of(new MockTag("mock", PlcValueType.WSTRING), "Lamm", new PlcWSTRING("Lamm")), - // TIME values + // TIME values (Numeric values are interpreted as milliseconds) Arguments.of(new MockTag("mock", PlcValueType.TIME), Duration.ofMillis(1234), new PlcTIME(Duration.parse("PT1.234S"))), Arguments.of(new MockTag("mock", PlcValueType.TIME), (byte) 123, new PlcTIME(Duration.parse("PT0.123S"))), Arguments.of(new MockTag("mock", PlcValueType.TIME), (short) 1234, new PlcTIME(Duration.parse("PT1.234S"))), @@ -329,7 +330,7 @@ private static Stream getSingleElementPlcValues() { Arguments.of(new MockTag("mock", PlcValueType.TIME), BigDecimal.valueOf(12345678901L), new PlcTIME(Duration.parse("PT3429H21M18.901S"))), Arguments.of(new MockTag("mock", PlcValueType.TIME), "PT3429H21M18.901S", new PlcTIME(Duration.parse("PT3429H21M18.901S"))), - // LTIME values + // LTIME values (Numeric values are interpreted as nanoseconds) Arguments.of(new MockTag("mock", PlcValueType.LTIME), Duration.ofMillis(1234), new PlcLTIME(Duration.parse("PT1.234S"))), Arguments.of(new MockTag("mock", PlcValueType.LTIME), (byte) 123, new PlcLTIME(Duration.parse("PT0.000000123S"))), Arguments.of(new MockTag("mock", PlcValueType.LTIME), (short) 1234, new PlcLTIME(Duration.parse("PT0.000001234S"))), @@ -341,7 +342,7 @@ private static Stream getSingleElementPlcValues() { Arguments.of(new MockTag("mock", PlcValueType.LTIME), BigDecimal.valueOf(12345678901L), new PlcLTIME(Duration.parse("PT12.345678901S"))), Arguments.of(new MockTag("mock", PlcValueType.LTIME), "PT12.345678901S", new PlcLTIME(Duration.parse("PT12.345678901S"))), - // DATE values + // DATE values (Numeric values are interpreted as days since epoch) Arguments.of(new MockTag("mock", PlcValueType.DATE), LocalDate.ofEpochDay(1234), new PlcDATE(LocalDate.ofEpochDay(1234))), Arguments.of(new MockTag("mock", PlcValueType.DATE), (byte) 123, new PlcDATE(LocalDate.ofEpochDay(123))), Arguments.of(new MockTag("mock", PlcValueType.DATE), (short) 1234, new PlcDATE(LocalDate.ofEpochDay(1234))), @@ -353,7 +354,7 @@ private static Stream getSingleElementPlcValues() { Arguments.of(new MockTag("mock", PlcValueType.DATE), BigDecimal.valueOf(12345678901L), new PlcDATE(LocalDate.ofEpochDay(12345678901L))), Arguments.of(new MockTag("mock", PlcValueType.DATE), LocalDate.parse("+33803290-10-08"), new PlcDATE(LocalDate.ofEpochDay(12345678901L))), - // LDATE values + // LDATE values (Numeric values are interpreted as seconds since epoch) Arguments.of(new MockTag("mock", PlcValueType.LDATE), LocalDate.ofEpochDay(1234), new PlcLDATE(LocalDate.ofEpochDay(1234))), Arguments.of(new MockTag("mock", PlcValueType.LDATE), (byte) 123, new PlcLDATE(LocalDate.parse("1970-01-01"))), Arguments.of(new MockTag("mock", PlcValueType.LDATE), (short) 12345, new PlcLDATE(LocalDate.parse("1970-01-01"))), @@ -365,16 +366,43 @@ private static Stream getSingleElementPlcValues() { Arguments.of(new MockTag("mock", PlcValueType.LDATE), BigDecimal.valueOf(12345678901L), new PlcLDATE(LocalDate.parse("2361-03-21"))), Arguments.of(new MockTag("mock", PlcValueType.LDATE), "1978-03-28", new PlcLDATE(LocalDate.parse("1978-03-28"))), - // TIME_OF_DAY values - Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), 1, new PlcTIME_OF_DAY(LocalTime.of(9, 11))), - - // LTIME_OF_DAY values - Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), 1, new PlcLTIME_OF_DAY(LocalTime.of(1, 2, 3))), - - // DATE_AND_TIME values - Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), 1, new PlcDATE_AND_TIME(LocalDateTime.of(1978, 3, 28, 1, 2, 3))), - - // DATE_AND_LTIME values + // TIME_OF_DAY values (Numeric values are interpreted as seconds since midnight) + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), LocalTime.ofSecondOfDay(1234), new PlcTIME_OF_DAY(LocalTime.parse("00:20:34"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), (byte) 123, new PlcTIME_OF_DAY(LocalTime.parse("00:02:03"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), (short) 12345, new PlcTIME_OF_DAY(LocalTime.parse("03:25:45"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), 67890, new PlcTIME_OF_DAY(LocalTime.parse("18:51:30"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), 67890L, new PlcTIME_OF_DAY(LocalTime.parse("18:51:30"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), (float) 67890.56, new PlcTIME_OF_DAY(LocalTime.parse("18:51:30"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), (double) 67890.9, new PlcTIME_OF_DAY(LocalTime.parse("18:51:30"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), BigInteger.valueOf(67890L), new PlcTIME_OF_DAY(LocalTime.parse("18:51:30"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), BigDecimal.valueOf(67890L), new PlcTIME_OF_DAY(LocalTime.parse("18:51:30"))), + Arguments.of(new MockTag("mock", PlcValueType.TIME_OF_DAY), "12:34:56", new PlcTIME_OF_DAY(LocalTime.parse("12:34:56"))), + + // LTIME_OF_DAY values (Numeric values are interpreted as milliseconds since midnight) + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), LocalTime.ofSecondOfDay(1234), new PlcLTIME_OF_DAY(LocalTime.parse("00:20:34"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), (byte) 123, new PlcLTIME_OF_DAY(LocalTime.parse("00:00:00.123"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), (short) 12345, new PlcLTIME_OF_DAY(LocalTime.parse("00:00:12.345"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), 12345678, new PlcLTIME_OF_DAY(LocalTime.parse("03:25:45.678"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), 12345678L, new PlcLTIME_OF_DAY(LocalTime.parse("03:25:45.678"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), (float) 123456.56, new PlcLTIME_OF_DAY(LocalTime.parse("00:02:03.456"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), (double) 12345678.9, new PlcLTIME_OF_DAY(LocalTime.parse("03:25:45.678"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), BigInteger.valueOf(12345678L), new PlcLTIME_OF_DAY(LocalTime.parse("03:25:45.678"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), BigDecimal.valueOf(12345678L), new PlcLTIME_OF_DAY(LocalTime.parse("03:25:45.678"))), + Arguments.of(new MockTag("mock", PlcValueType.LTIME_OF_DAY), "12:34:56", new PlcLTIME_OF_DAY(LocalTime.parse("12:34:56"))), + + // DATE_AND_TIME values (Numeric values are interpreted as seconds since epoch) + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), LocalDateTime.ofEpochSecond(1234, 0, OffsetDateTime.now().getOffset()), new PlcDATE_AND_TIME(LocalDateTime.parse("1970-01-01T02:20:34"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), (byte) 123, new PlcDATE_AND_TIME(LocalDateTime.parse("1970-01-01T02:02:03"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), (short) 12345, new PlcDATE_AND_TIME(LocalDateTime.parse("1970-01-01T05:25:45"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), 12345678, new PlcDATE_AND_TIME(LocalDateTime.parse("1970-05-23T23:21:18"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), 12345678L, new PlcDATE_AND_TIME(LocalDateTime.parse("1970-05-23T23:21:18"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), (float) 123456.56, new PlcDATE_AND_TIME(LocalDateTime.parse("1970-01-02T12:17:36"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), (double) 12345678.9, new PlcDATE_AND_TIME(LocalDateTime.parse("1970-05-23T23:21:18"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), BigInteger.valueOf(12345678L), new PlcDATE_AND_TIME(LocalDateTime.parse("1970-05-23T23:21:18"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), BigDecimal.valueOf(12345678L), new PlcDATE_AND_TIME(LocalDateTime.parse("1970-05-23T23:21:18"))), + Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_TIME), "1978-03-28T12:34:56", new PlcDATE_AND_TIME(LocalDateTime.parse("1978-03-28T12:34:56"))), + + // DATE_AND_LTIME values (Numeric values are interpreted as milliseconds since epoch) Arguments.of(new MockTag("mock", PlcValueType.DATE_AND_LTIME), 1, new PlcDATE_AND_LTIME(LocalDateTime.of(1978, 3, 28, 3, 2, 1))), // LDATE_AND_TIME values