exceptionfactory commented on code in PR #10613:
URL: https://github.com/apache/nifi/pull/10613#discussion_r2621505303


##########
nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/field/TestObjectLocalDateTimeFieldConverter.java:
##########
@@ -28,49 +29,75 @@
 
 public class TestObjectLocalDateTimeFieldConverter {
     private static final String FIELD_NAME = "test";
+
     private static final long MILLIS_TIMESTAMP_LONG = 1707238288351L;
-    private static final long MICROS_TIMESTAMP_LONG = 1707238288351567L;
-    private static final String MICROS_TIMESTAMP_STRING = 
Long.toString(MICROS_TIMESTAMP_LONG);
-    private static final double MICROS_TIMESTAMP_DOUBLE = ((double) 
MICROS_TIMESTAMP_LONG) / 1000000D;
-    private static final long NANOS_AFTER_SECOND = 351567000L;
+    private static final long NANO_SECONDS_FROM_TIMESTAMP = 
(MILLIS_TIMESTAMP_LONG % 1000) * 1_000_000L;
+    private static final long EXTRA_NANO_SECONDS = 351567L;
+
+    private static final BigDecimal MILLIS_TIMESTAMP = 
BigDecimal.valueOf(MILLIS_TIMESTAMP_LONG);
+    private static final BigDecimal MILLIS_TIMESTAMP_FRACTIONAL = 
MILLIS_TIMESTAMP.add(BigDecimal.valueOf(EXTRA_NANO_SECONDS, 6));
+
+    private static final String MILLIS_TIMESTAMP_STRING = 
Long.toString(MILLIS_TIMESTAMP_LONG);
+    private static final String MILLIS_TIMESTAMP_FRACTIONAL_STRING = 
MILLIS_TIMESTAMP_FRACTIONAL.toString();
+
     private static final Instant INSTANT_MILLIS_PRECISION = 
Instant.ofEpochMilli(MILLIS_TIMESTAMP_LONG);
-    // Create an instant to represent the same time as the microsecond 
precision timestamp. We add nanoseconds after second but then have to subtract 
the milliseconds after the second that are already
-    // present in the MILLIS_TIMESTAMP_LONG value.
-    private static final Instant INSTANT_MICROS_PRECISION = 
Instant.ofEpochMilli(MILLIS_TIMESTAMP_LONG).plusNanos(NANOS_AFTER_SECOND).minusMillis(MILLIS_TIMESTAMP_LONG
 % 1000);
+    private static final Instant INSTANT_MICROS_PRECISION = 
Instant.ofEpochMilli(MILLIS_TIMESTAMP_LONG).plusNanos(EXTRA_NANO_SECONDS);
+
     private static final LocalDateTime LOCAL_DATE_TIME_MILLIS_PRECISION = 
LocalDateTime.ofInstant(INSTANT_MILLIS_PRECISION, ZoneId.systemDefault());
     private static final LocalDateTime LOCAL_DATE_TIME_MICROS_PRECISION = 
LocalDateTime.ofInstant(INSTANT_MICROS_PRECISION, ZoneId.systemDefault());
 
     private final ObjectLocalDateTimeFieldConverter converter = new 
ObjectLocalDateTimeFieldConverter();
 
 
     @Test
-    public void testConvertTimestampMillis() {
+    public void testConvertTimestampLong() {
         final LocalDateTime result = 
converter.convertField(MILLIS_TIMESTAMP_LONG, Optional.empty(), FIELD_NAME);
         assertEquals(LOCAL_DATE_TIME_MILLIS_PRECISION, result);
     }
 
     @Test
-    public void testConvertTimestampMicros() {
-        final LocalDateTime result = 
converter.convertField(MICROS_TIMESTAMP_LONG, Optional.empty(), FIELD_NAME);
-        assertEquals(MILLIS_TIMESTAMP_LONG, 
result.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
+    public void testConvertTimestampString() {
+        final LocalDateTime result = 
converter.convertField(MILLIS_TIMESTAMP_STRING, Optional.empty(), FIELD_NAME);
+        assertEquals(LOCAL_DATE_TIME_MILLIS_PRECISION, result);
+    }
 
-        final Instant resultInstant = 
result.atZone(ZoneId.systemDefault()).toInstant();
-        assertEquals(NANOS_AFTER_SECOND, resultInstant.getNano());
+    @Test
+    public void testConvertTimestampBigDecimal() {
+        final LocalDateTime result = 
converter.convertField(MILLIS_TIMESTAMP_FRACTIONAL, Optional.empty(), 
FIELD_NAME);
+        assertEquals(LOCAL_DATE_TIME_MICROS_PRECISION, result);
+        assertEquals(NANO_SECONDS_FROM_TIMESTAMP + EXTRA_NANO_SECONDS, 
result.getNano());
     }
 
     @Test
-    public void testDoubleAsEpochSeconds() {
-        final LocalDateTime result = 
converter.convertField(MICROS_TIMESTAMP_DOUBLE, Optional.empty(), FIELD_NAME);
+    public void testConvertTimestampStringPrecise() {
+        final LocalDateTime result = 
converter.convertField(MILLIS_TIMESTAMP_FRACTIONAL_STRING, Optional.empty(), 
FIELD_NAME);
         assertEquals(LOCAL_DATE_TIME_MICROS_PRECISION, result);
-        assertEquals(NANOS_AFTER_SECOND, result.getNano(), 1D);
     }
 
     @Test
-    public void testDoubleAsEpochSecondsAsString() {
-        final LocalDateTime result = 
converter.convertField(MICROS_TIMESTAMP_STRING, Optional.empty(), FIELD_NAME);
+    public void testConvertTimestampDouble() {
+        // Less precise timestamp than other tests as double is less precise 
than BigDecimal
+        final double timestamp = 1764673335503.607;
+
+        final BigDecimal bd = new BigDecimal(Double.toString(timestamp));

Review Comment:
   Is there a particular reason for converting the `timestamp` double to a 
String, as opposed to just passing it to the `BigDecimal` constructor?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to