AgeCalculator changesJava-618 Restore RootCauseFinder code
This commit is contained in:
parent
cdd14b23f7
commit
d973864c8b
|
@ -0,0 +1,95 @@
|
||||||
|
package com.baeldung.exceptions;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.Period;
|
||||||
|
import java.time.format.DateTimeParseException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class to find root cause exceptions.
|
||||||
|
*/
|
||||||
|
public class RootCauseFinder {
|
||||||
|
|
||||||
|
public static Throwable findCauseUsingPlainJava(Throwable throwable) {
|
||||||
|
Objects.requireNonNull(throwable);
|
||||||
|
Throwable rootCause = throwable;
|
||||||
|
while (rootCause.getCause() != null) {
|
||||||
|
rootCause = rootCause.getCause();
|
||||||
|
}
|
||||||
|
return rootCause;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the age of a person from a given date.
|
||||||
|
*/
|
||||||
|
static class AgeCalculator {
|
||||||
|
|
||||||
|
private AgeCalculator() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int calculateAge(String birthDate) throws CalculationException {
|
||||||
|
if (birthDate == null || birthDate.isEmpty()) {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return Period
|
||||||
|
.between(parseDate(birthDate), LocalDate.now())
|
||||||
|
.getYears();
|
||||||
|
} catch (DateParseException ex) {
|
||||||
|
throw new CalculationException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static LocalDate parseDate(String birthDateAsString) throws DateParseException {
|
||||||
|
|
||||||
|
LocalDate birthDate;
|
||||||
|
try {
|
||||||
|
birthDate = LocalDate.parse(birthDateAsString);
|
||||||
|
} catch (DateTimeParseException ex) {
|
||||||
|
throw new InvalidFormatException(birthDateAsString, ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (birthDate.isAfter(LocalDate.now())) {
|
||||||
|
throw new DateOutOfRangeException(birthDateAsString);
|
||||||
|
}
|
||||||
|
|
||||||
|
return birthDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static class CalculationException extends Exception {
|
||||||
|
|
||||||
|
CalculationException(DateParseException ex) {
|
||||||
|
super(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class DateParseException extends Exception {
|
||||||
|
|
||||||
|
DateParseException(String input) {
|
||||||
|
super(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
DateParseException(String input, Throwable thr) {
|
||||||
|
super(input, thr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class InvalidFormatException extends DateParseException {
|
||||||
|
|
||||||
|
InvalidFormatException(String input, Throwable thr) {
|
||||||
|
super("Invalid date format: " + input, thr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class DateOutOfRangeException extends DateParseException {
|
||||||
|
|
||||||
|
DateOutOfRangeException(String date) {
|
||||||
|
super("Date out of range: " + date);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,96 @@
|
||||||
|
package com.baeldung.exceptions;
|
||||||
|
|
||||||
|
import com.google.common.base.Throwables;
|
||||||
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.format.DateTimeParseException;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
|
|
||||||
|
import static com.baeldung.exceptions.RootCauseFinder.*;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the {@link RootCauseFinder}.
|
||||||
|
*/
|
||||||
|
public class RootCauseFinderTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenBirthDate_whenCalculatingAge_thenAgeReturned() {
|
||||||
|
try {
|
||||||
|
int age = AgeCalculator.calculateAge("1990-01-01");
|
||||||
|
Assertions.assertEquals(1990, LocalDate
|
||||||
|
.now()
|
||||||
|
.minus(age, ChronoUnit.YEARS)
|
||||||
|
.getYear());
|
||||||
|
} catch (CalculationException e) {
|
||||||
|
Assertions.fail(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
|
||||||
|
try {
|
||||||
|
AgeCalculator.calculateAge("010102");
|
||||||
|
} catch (CalculationException ex) {
|
||||||
|
assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenOutOfRangeDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
|
||||||
|
try {
|
||||||
|
AgeCalculator.calculateAge("2020-04-04");
|
||||||
|
} catch (CalculationException ex) {
|
||||||
|
assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenNullDate_whenFindingRootCauseUsingJava_thenRootCauseFound() {
|
||||||
|
try {
|
||||||
|
AgeCalculator.calculateAge(null);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenWrongFormatDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
|
||||||
|
try {
|
||||||
|
AgeCalculator.calculateAge("010102");
|
||||||
|
} catch (CalculationException ex) {
|
||||||
|
assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateTimeParseException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenOutOfRangeDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() {
|
||||||
|
try {
|
||||||
|
AgeCalculator.calculateAge("2020-04-04");
|
||||||
|
} catch (CalculationException ex) {
|
||||||
|
assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateOutOfRangeException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenWrongFormatDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
|
||||||
|
try {
|
||||||
|
AgeCalculator.calculateAge("010102");
|
||||||
|
} catch (CalculationException ex) {
|
||||||
|
assertTrue(Throwables.getRootCause(ex) instanceof DateTimeParseException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenOutOfRangeDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() {
|
||||||
|
try {
|
||||||
|
AgeCalculator.calculateAge("2020-04-04");
|
||||||
|
} catch (CalculationException ex) {
|
||||||
|
assertTrue(Throwables.getRootCause(ex) instanceof DateOutOfRangeException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue