From c6a69e81aee4569f24f9713d4b8ff0d4ad6d6df6 Mon Sep 17 00:00:00 2001 From: dotasek Date: Thu, 23 Jun 2022 12:32:02 -0400 Subject: [PATCH 1/2] Failing test + gentle refactor --- .../org/hl7/fhir/utilities/TimeTracker.java | 14 +++---- .../java/org/hl7/fhir/utilities/TimeUtil.java | 29 ++++++++++++++ .../org/hl7/fhir/utilities/Utilities.java | 28 +------------- .../org/hl7/fhir/utilities/TimeUtilTest.java | 38 +++++++++++++++++++ 4 files changed, 73 insertions(+), 36 deletions(-) create mode 100644 org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeUtil.java create mode 100644 org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/TimeUtilTest.java diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java index def73143d..2a1cf233a 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java @@ -1,11 +1,7 @@ package org.hl7.fhir.utilities; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; - -import org.hl7.fhir.utilities.TimeTracker.Counter; public class TimeTracker { @@ -72,29 +68,29 @@ public class TimeTracker { CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); for (Counter c : records) { if (c.count == 1) { - b.append(c.name+": "+Utilities.presentDuration(c.length)); + b.append(c.name+": "+ TimeUtil.presentDuration(c.length)); } } for (Counter c : records) { if (c.count > 1) { - b.append(c.name+": "+Utilities.presentDuration(c.length)+" (#"+c.count+")"); + b.append(c.name+": "+ TimeUtil.presentDuration(c.length)+" (#"+c.count+")"); } } return "Times: "+b.toString(); } public String clock() { - return Utilities.presentDuration(System.nanoTime() - globalStart); + return TimeUtil.presentDuration(System.nanoTime() - globalStart); } public String instant() { - return Utilities.presentDuration(System.nanoTime() - globalStart); + return TimeUtil.presentDuration(System.nanoTime() - globalStart); } public String milestone() { long start = milestone == 0 ? globalStart : milestone ; milestone = System.nanoTime(); - return Utilities.presentDuration(milestone - start); + return TimeUtil.presentDuration(milestone - start); } } diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeUtil.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeUtil.java new file mode 100644 index 000000000..578c72d87 --- /dev/null +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeUtil.java @@ -0,0 +1,29 @@ +package org.hl7.fhir.utilities; + +import java.util.concurrent.TimeUnit; + +public class TimeUtil { + public static String presentDuration(long duration) { + duration = duration / 1000000; + String res = ""; // ; + long days = TimeUnit.MILLISECONDS.toDays(duration); + long hours = TimeUnit.MILLISECONDS.toHours(duration) - + TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration)); + long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) - + TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration)); + long seconds = TimeUnit.MILLISECONDS.toSeconds(duration) - + TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)); + long millis = TimeUnit.MILLISECONDS.toMillis(duration) - + TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); + + if (days > 0) + res = String.format("%dd %02d:%02d:%02d.%04d", days, hours, minutes, seconds, millis); + else if (hours > 0) + res = String.format("%02d:%02d:%02d.%04d", hours, minutes, seconds, millis); + else // + res = String.format("%02d:%02d.%04d", minutes, seconds, millis); +// else +// res = String.format("%02d.%04d", seconds, millis); + return res; + } +} diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java index 5f29390ad..8bb68f5b7 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/Utilities.java @@ -22,14 +22,12 @@ import java.nio.file.StandardCopyOption; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; -import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.UUID; -import java.util.concurrent.TimeUnit; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -92,7 +90,7 @@ public class Utilities { * * @param word the word that is to be pluralized. * @return the pluralized form of the word, or the word itself if it could not be pluralized - * @see #singularize(Object) + * @see Inflector#singularize(Object) */ public static String pluralizeMe(String word) { Inflector inf = new Inflector(); @@ -1423,30 +1421,6 @@ public class Utilities { return byteArrays; } - - public static String presentDuration(long duration) { - duration = duration / 1000000; - String res = ""; // ; - long days = TimeUnit.MILLISECONDS.toDays(duration); - long hours = TimeUnit.MILLISECONDS.toHours(duration) - - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration)); - long minutes = TimeUnit.MILLISECONDS.toMinutes(duration) - - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration)); - long seconds = TimeUnit.MILLISECONDS.toSeconds(duration) - - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)); - long millis = TimeUnit.MILLISECONDS.toMillis(duration) - - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); - - if (days > 0) - res = String.format("%dd %02d:%02d:%02d.%04d", days, hours, minutes, seconds, millis); - else if (hours > 0) - res = String.format("%02d:%02d:%02d.%04d", hours, minutes, seconds, millis); - else // - res = String.format("%02d:%02d.%04d", minutes, seconds, millis); -// else -// res = String.format("%02d.%04d", seconds, millis); - return res; - } public static void unzip(InputStream zip, Path target) throws IOException { try (ZipInputStream zis = new ZipInputStream(zip)) { diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/TimeUtilTest.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/TimeUtilTest.java new file mode 100644 index 000000000..75dec18b5 --- /dev/null +++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/TimeUtilTest.java @@ -0,0 +1,38 @@ +package org.hl7.fhir.utilities; + +import org.hl7.fhir.utilities.xml.XMLUtil; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import java.io.IOException; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +public class TimeUtilTest { + + + public static Stream data() throws ParserConfigurationException, SAXException, IOException { + List objects = new ArrayList<>(); + objects.add(Arguments.of("PT0.001S", "00:00.001")); + return objects.stream(); + } + + @ParameterizedTest + @MethodSource("data") + public void testPresentDuration(String iso8601String, String expectedPresentation) { + assertEquals(TimeUtil.presentDuration(Duration.parse(iso8601String).toNanos()), expectedPresentation); + } + + +} From 552127464c9210f90b5ba19922c11f229653f493 Mon Sep 17 00:00:00 2001 From: dotasek Date: Thu, 23 Jun 2022 12:39:35 -0400 Subject: [PATCH 2/2] Rename again + pass tests --- .../{TimeUtil.java => DurationUtil.java} | 8 ++++---- .../org/hl7/fhir/utilities/TimeTracker.java | 10 +++++----- ...TimeUtilTest.java => DurationUtilTest.java} | 18 ++++++++++++------ 3 files changed, 21 insertions(+), 15 deletions(-) rename org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/{TimeUtil.java => DurationUtil.java} (82%) rename org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/{TimeUtilTest.java => DurationUtilTest.java} (53%) diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeUtil.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/DurationUtil.java similarity index 82% rename from org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeUtil.java rename to org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/DurationUtil.java index 578c72d87..1123a225e 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeUtil.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/DurationUtil.java @@ -2,7 +2,7 @@ package org.hl7.fhir.utilities; import java.util.concurrent.TimeUnit; -public class TimeUtil { +public class DurationUtil { public static String presentDuration(long duration) { duration = duration / 1000000; String res = ""; // ; @@ -17,11 +17,11 @@ public class TimeUtil { TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days > 0) - res = String.format("%dd %02d:%02d:%02d.%04d", days, hours, minutes, seconds, millis); + res = String.format("%dd %02d:%02d:%02d.%03d", days, hours, minutes, seconds, millis); else if (hours > 0) - res = String.format("%02d:%02d:%02d.%04d", hours, minutes, seconds, millis); + res = String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, millis); else // - res = String.format("%02d:%02d.%04d", minutes, seconds, millis); + res = String.format("%02d:%02d.%03d", minutes, seconds, millis); // else // res = String.format("%02d.%04d", seconds, millis); return res; diff --git a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java index 2a1cf233a..79c236907 100644 --- a/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java +++ b/org.hl7.fhir.utilities/src/main/java/org/hl7/fhir/utilities/TimeTracker.java @@ -68,29 +68,29 @@ public class TimeTracker { CommaSeparatedStringBuilder b = new CommaSeparatedStringBuilder(); for (Counter c : records) { if (c.count == 1) { - b.append(c.name+": "+ TimeUtil.presentDuration(c.length)); + b.append(c.name+": "+ DurationUtil.presentDuration(c.length)); } } for (Counter c : records) { if (c.count > 1) { - b.append(c.name+": "+ TimeUtil.presentDuration(c.length)+" (#"+c.count+")"); + b.append(c.name+": "+ DurationUtil.presentDuration(c.length)+" (#"+c.count+")"); } } return "Times: "+b.toString(); } public String clock() { - return TimeUtil.presentDuration(System.nanoTime() - globalStart); + return DurationUtil.presentDuration(System.nanoTime() - globalStart); } public String instant() { - return TimeUtil.presentDuration(System.nanoTime() - globalStart); + return DurationUtil.presentDuration(System.nanoTime() - globalStart); } public String milestone() { long start = milestone == 0 ? globalStart : milestone ; milestone = System.nanoTime(); - return TimeUtil.presentDuration(milestone - start); + return DurationUtil.presentDuration(milestone - start); } } diff --git a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/TimeUtilTest.java b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/DurationUtilTest.java similarity index 53% rename from org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/TimeUtilTest.java rename to org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/DurationUtilTest.java index 75dec18b5..838ae860f 100644 --- a/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/TimeUtilTest.java +++ b/org.hl7.fhir.utilities/src/test/java/org/hl7/fhir/utilities/DurationUtilTest.java @@ -1,12 +1,8 @@ package org.hl7.fhir.utilities; -import org.hl7.fhir.utilities.xml.XMLUtil; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.w3c.dom.Document; -import org.w3c.dom.Element; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; @@ -19,19 +15,29 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; -public class TimeUtilTest { +public class DurationUtilTest { public static Stream data() throws ParserConfigurationException, SAXException, IOException { List objects = new ArrayList<>(); objects.add(Arguments.of("PT0.001S", "00:00.001")); + objects.add(Arguments.of("PT0.012S", "00:00.012")); + objects.add(Arguments.of("PT0.123S", "00:00.123")); + objects.add(Arguments.of("PT0.999S", "00:00.999")); + objects.add(Arguments.of("PT1.001S", "00:01.001")); + objects.add(Arguments.of("PT1M1.001S", "01:01.001")); + objects.add(Arguments.of("PT59M1.001S", "59:01.001")); + objects.add(Arguments.of("PT1H1M1.001S", "01:01:01.001")); + objects.add(Arguments.of("PT23H1M1.001S", "23:01:01.001")); + objects.add(Arguments.of("P1DT23H1M1.001S", "1d 23:01:01.001")); + objects.add(Arguments.of("P12DT23H1M1.001S", "12d 23:01:01.001")); return objects.stream(); } @ParameterizedTest @MethodSource("data") public void testPresentDuration(String iso8601String, String expectedPresentation) { - assertEquals(TimeUtil.presentDuration(Duration.parse(iso8601String).toNanos()), expectedPresentation); + assertEquals(expectedPresentation, DurationUtil.presentDuration(Duration.parse(iso8601String).toNanos())); }