Skip to content

Commit efc5b6d

Browse files
authored
Merge pull request #496 from lutovich/1.6-negative-ns
Fix `IsoDuration#toString()` for negative ns
2 parents dd25f6c + 8558575 commit efc5b6d

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

driver/src/main/java/org/neo4j/driver/internal/InternalIsoDuration.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ public int hashCode()
192192
@Override
193193
public String toString()
194194
{
195-
String nanosecondsString = nanoseconds == 0 ? "" : String.format( ".%09d", nanoseconds );
196-
return String.format( "P%sM%sDT%s%sS", months, days, seconds, nanosecondsString );
195+
String secondsSign = seconds < 0 || nanoseconds < 0 ? "-" : "";
196+
String nanosecondsString = nanoseconds == 0 ? "" : String.format( ".%09d", Math.abs( nanoseconds ) );
197+
return String.format( "P%sM%sDT%s%s%sS", months, days, secondsSign, Math.abs( seconds ), nanosecondsString );
197198
}
198199
}

driver/src/test/java/org/neo4j/driver/v1/integration/TemporalTypesIT.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import java.util.function.Supplier;
3232

3333
import org.neo4j.driver.v1.Record;
34+
import org.neo4j.driver.v1.StatementResult;
3435
import org.neo4j.driver.v1.Value;
3536
import org.neo4j.driver.v1.types.IsoDuration;
3637
import org.neo4j.driver.v1.util.Function;
@@ -43,6 +44,7 @@
4344
import static org.junit.Assume.assumeTrue;
4445
import static org.neo4j.driver.internal.util.ServerVersion.v3_4_0;
4546
import static org.neo4j.driver.v1.Values.isoDuration;
47+
import static org.neo4j.driver.v1.Values.parameters;
4648

4749
public class TemporalTypesIT
4850
{
@@ -245,6 +247,29 @@ public void shouldSendAndReceiveRandomDuration()
245247
testSendAndReceiveRandomValues( TemporalUtil::randomDuration, Value::asIsoDuration );
246248
}
247249

250+
@Test
251+
public void shouldFormatDurationToString()
252+
{
253+
testDurationToString( 1, 0, "P0M0DT1S" );
254+
testDurationToString( -1, 0, "P0M0DT-1S" );
255+
256+
testDurationToString( 0, 5, "P0M0DT0.000000005S" );
257+
testDurationToString( 0, -5, "P0M0DT-0.000000005S" );
258+
testDurationToString( 0, 999_999_999, "P0M0DT0.999999999S" );
259+
testDurationToString( 0, -999_999_999, "P0M0DT-0.999999999S" );
260+
261+
testDurationToString( 1, 5, "P0M0DT1.000000005S" );
262+
testDurationToString( -1, -5, "P0M0DT-1.000000005S" );
263+
testDurationToString( 1, -5, "P0M0DT0.999999995S" );
264+
testDurationToString( -1, 5, "P0M0DT-0.999999995S" );
265+
testDurationToString( 1, 999999999, "P0M0DT1.999999999S" );
266+
testDurationToString( -1, -999999999, "P0M0DT-1.999999999S" );
267+
testDurationToString( 1, -999999999, "P0M0DT0.000000001S" );
268+
testDurationToString( -1, 999999999, "P0M0DT-0.000000001S" );
269+
270+
testDurationToString( -78036, -143000000, "P0M0DT-78036.143000000S" );
271+
}
272+
248273
private <T> void testSendAndReceiveRandomValues( Supplier<T> supplier, Function<Value,T> converter )
249274
{
250275
for ( int i = 0; i < RANDOM_VALUES_TO_TEST; i++ )
@@ -274,6 +299,13 @@ private <T> void testSendAndReceiveValue( T value, Function<Value,T> converter )
274299
assertEquals( value, converter.apply( record.get( 0 ) ) );
275300
}
276301

302+
private void testDurationToString( long seconds, int nanoseconds, String expectedValue )
303+
{
304+
StatementResult result = session.run( "RETURN duration({seconds: $s, nanoseconds: $n})", parameters( "s", seconds, "n", nanoseconds ) );
305+
IsoDuration duration = result.single().get( 0 ).asIsoDuration();
306+
assertEquals( expectedValue, duration.toString() );
307+
}
308+
277309
private static IsoDuration newDuration( long months, long days, long seconds, int nanoseconds )
278310
{
279311
return isoDuration( months, days, seconds, nanoseconds ).asIsoDuration();

0 commit comments

Comments
 (0)