From b798a8a415770cb73f0ed8728cd619322b3906ae Mon Sep 17 00:00:00 2001 From: jy95 Date: Sat, 4 Jan 2025 00:49:41 +0100 Subject: [PATCH] feat: FrequencyFrequencyMaxPeriodPeriodMax --- .../utils/miscellaneous/Translators.java | 6 +- .../FrequencyFrequencyMaxPeriodPeriodMax.java | 41 ++++++ ...quencyFrequencyMaxPeriodPeriodMaxTest.java | 129 ++++++++++++++++++ 3 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMax.java create mode 100644 src/test/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMaxTest.java diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/miscellaneous/Translators.java b/src/main/java/jy95/fhir/r4/dosage/utils/miscellaneous/Translators.java index d6bb8ca1d..d543fb118 100644 --- a/src/main/java/jy95/fhir/r4/dosage/utils/miscellaneous/Translators.java +++ b/src/main/java/jy95/fhir/r4/dosage/utils/miscellaneous/Translators.java @@ -39,7 +39,11 @@ public Translators(FDUConfig config) { Map.entry(DisplayOrder.BOUNDS_RANGE, new BoundsRange(config)), Map.entry(DisplayOrder.DURATION_DURATION_MAX, new DurationDurationMax(config)), Map.entry(DisplayOrder.FREQUENCY_FREQUENCY_MAX, new FrequencyFrequencyMax(config)), - Map.entry(DisplayOrder.PERIOD_PERIOD_MAX, new PeriodPeriodMax(config)) + Map.entry(DisplayOrder.PERIOD_PERIOD_MAX, new PeriodPeriodMax(config)), + Map.entry( + DisplayOrder.FREQUENCY_FREQUENCY_MAX_PERIOD_PERIOD_MAX, + new FrequencyFrequencyMaxPeriodPeriodMax(config) + ) ) ); this.bundleControl = new MultiResourceBundleControl( diff --git a/src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMax.java b/src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMax.java new file mode 100644 index 000000000..7314006bf --- /dev/null +++ b/src/main/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMax.java @@ -0,0 +1,41 @@ +package jy95.fhir.r4.dosage.utils.translators; + +import jy95.fhir.r4.dosage.utils.classes.AbstractTranslator; +import jy95.fhir.r4.dosage.utils.config.FDUConfig; +import org.hl7.fhir.r4.model.Dosage; + +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FrequencyFrequencyMaxPeriodPeriodMax extends AbstractTranslator { + + private final FrequencyFrequencyMax frequencyFrequencyMax; + private final PeriodPeriodMax periodPeriodMax; + + public FrequencyFrequencyMaxPeriodPeriodMax(FDUConfig config) { + super(config); + this.frequencyFrequencyMax = new FrequencyFrequencyMax(config); + this.periodPeriodMax = new PeriodPeriodMax(config); + } + + @Override + public CompletableFuture convert(Dosage dosage) { + var frequencyPart = frequencyFrequencyMax.isPresent(dosage) + ? frequencyFrequencyMax.convert(dosage) + : CompletableFuture.completedFuture(""); + + var periodPart = periodPeriodMax.isPresent(dosage) + ? periodPeriodMax.convert(dosage) + : CompletableFuture.completedFuture(""); + + return frequencyPart.thenCombineAsync(periodPart, (freq, period) -> Stream.of(freq, period) + .filter(part -> !part.isEmpty()) + .collect(Collectors.joining(" "))); + } + + @Override + public boolean isPresent(Dosage dosage) { + return frequencyFrequencyMax.isPresent(dosage) || periodPeriodMax.isPresent(dosage); + } +} diff --git a/src/test/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMaxTest.java b/src/test/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMaxTest.java new file mode 100644 index 000000000..0c954e495 --- /dev/null +++ b/src/test/java/jy95/fhir/r4/dosage/utils/translators/FrequencyFrequencyMaxPeriodPeriodMaxTest.java @@ -0,0 +1,129 @@ +package jy95.fhir.r4.dosage.utils.translators; + +import jy95.fhir.r4.dosage.utils.AbstractFhirTest; +import jy95.fhir.r4.dosage.utils.classes.FhirDosageUtils; +import jy95.fhir.r4.dosage.utils.types.DisplayOrder; +import org.hl7.fhir.r4.model.Dosage; +import org.hl7.fhir.r4.model.Timing; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.Locale; +import java.util.concurrent.ExecutionException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class FrequencyFrequencyMaxPeriodPeriodMaxTest extends AbstractFhirTest { + + @ParameterizedTest + @MethodSource("localeProvider") + void testNoFrequencyOrPeriod(Locale locale) throws ExecutionException, InterruptedException { + Dosage dosage = new Dosage(); + FhirDosageUtils dosageUtils = DayOfWeekTest.getDosageUtilsInstance( + locale, + DisplayOrder.FREQUENCY_FREQUENCY_MAX_PERIOD_PERIOD_MAX + ); + String result = dosageUtils.asHumanReadableText(dosage).get(); + assertEquals("", result); + } + + @ParameterizedTest + @MethodSource("localeProvider") + void testWithFrequencyOnly(Locale locale) throws ExecutionException, InterruptedException { + FhirDosageUtils dosageUtils = DayOfWeekTest.getDosageUtilsInstance( + locale, + DisplayOrder.FREQUENCY_FREQUENCY_MAX_PERIOD_PERIOD_MAX + ); + Dosage dosage = new Dosage(); + Timing timing = new Timing(); + Timing.TimingRepeatComponent repeatComponent = new Timing.TimingRepeatComponent(); + repeatComponent.setFrequency(3); + + timing.setRepeat(repeatComponent); + dosage.setTiming(timing); + + String result = dosageUtils.asHumanReadableText(dosage).get(); + String expectedResult = getExpectedText1(locale); + assertEquals(expectedResult, result); + } + + @ParameterizedTest + @MethodSource("localeProvider") + void testWithPeriodOnly(Locale locale) throws ExecutionException, InterruptedException { + FhirDosageUtils dosageUtils = DayOfWeekTest.getDosageUtilsInstance( + locale, + DisplayOrder.FREQUENCY_FREQUENCY_MAX_PERIOD_PERIOD_MAX + ); + Dosage dosage = new Dosage(); + Timing timing = new Timing(); + Timing.TimingRepeatComponent repeatComponent = new Timing.TimingRepeatComponent(); + repeatComponent.setPeriod(2); + repeatComponent.setPeriodUnit(Timing.UnitsOfTime.D); + + timing.setRepeat(repeatComponent); + dosage.setTiming(timing); + + String result = dosageUtils.asHumanReadableText(dosage).get(); + String expectedResult = getExpectedText2(locale); + assertEquals(expectedResult, result); + } + + @ParameterizedTest + @MethodSource("localeProvider") + void testBothFrequencyAndPeriod(Locale locale) throws ExecutionException, InterruptedException { + FhirDosageUtils dosageUtils = DayOfWeekTest.getDosageUtilsInstance( + locale, + DisplayOrder.FREQUENCY_FREQUENCY_MAX_PERIOD_PERIOD_MAX + ); + Dosage dosage = new Dosage(); + Timing timing = new Timing(); + Timing.TimingRepeatComponent repeatComponent = new Timing.TimingRepeatComponent(); + repeatComponent.setPeriod(2); + repeatComponent.setPeriodUnit(Timing.UnitsOfTime.D); + repeatComponent.setFrequency(3); + + timing.setRepeat(repeatComponent); + dosage.setTiming(timing); + + String result = dosageUtils.asHumanReadableText(dosage).get(); + String expectedResult = getExpectedText3(locale); + assertEquals(expectedResult, result); + } + + private String getExpectedText1(Locale locale) { + if (locale.equals(Locale.ENGLISH)) { + return "3 times"; + } else if (locale.equals(Locale.FRENCH)) { + return "3 fois"; + } else if (locale.equals(Locale.GERMAN)) { + return "3 Mal"; + } else { + return "3 keer"; + } + } + + private String getExpectedText2(Locale locale) { + if (locale.equals(Locale.ENGLISH)) { + return "every 2 days"; + } else if (locale.equals(Locale.FRENCH)) { + return "chaque 2 jours"; + } else if (locale.equals(Locale.GERMAN)) { + return "alle 2 Tage"; + } else { + return "per 2 dagen"; + } + } + + private String getExpectedText3(Locale locale) { + if (locale.equals(Locale.ENGLISH)) { + return "3 times every 2 days"; + } else if (locale.equals(Locale.FRENCH)) { + return "3 fois chaque 2 jours"; + } else if (locale.equals(Locale.GERMAN)) { + return "3 Mal alle 2 Tage"; + } else { + return "3 keer per 2 dagen"; + } + } + +}