Skip to content

Commit

Permalink
[reposense#1990] Move TimeUtil ParseException throwing to ArgsParser:…
Browse files Browse the repository at this point in the history
…:parse method (reposense#2075)

ArgsParser::parse uses the methods verifyDatesRangeIsCorrect
and verifySinceDateIsValid from TimeUtil to throw a 
ParseException if either of the checks fail. The throwing 
of an exception in a utility method is a side effect
that makes the methods less reusable.

Let's move the throwing of ParseException from TimeUtil 
into ArgsParser.
  • Loading branch information
nseah21 authored Dec 30, 2023
1 parent e42c14e commit d8ce443
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 31 deletions.
13 changes: 11 additions & 2 deletions src/main/java/reposense/parser/ArgsParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ public class ArgsParser {
private static final String MESSAGE_INVALID_CONFIG_JSON = "%s Ignoring the report config provided.";
private static final String MESSAGE_SINCE_D1_WITH_PERIOD = "You may be using --since d1 with the --period flag. "
+ "This may result in an incorrect date range being analysed.";
private static final String MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE =
"\"Since Date\" cannot be later than \"Until Date\".";
private static final String MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE =
"\"Since Date\" must not be later than today's date.";
private static final Path EMPTY_PATH = Paths.get("");
private static final Path DEFAULT_CONFIG_PATH = Paths.get(System.getProperty("user.dir")
+ File.separator + "config" + File.separator);
Expand Down Expand Up @@ -420,8 +424,13 @@ private static void addAnalysisDatesToBuilder(CliArguments.Builder builder, Name
? untilDate
: currentDate;

TimeUtil.verifySinceDateIsValid(sinceDate, currentDate);
TimeUtil.verifyDatesRangeIsCorrect(sinceDate, untilDate);
if (sinceDate.compareTo(currentDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE);
}

if (sinceDate.compareTo(untilDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE);
}

builder.sinceDate(sinceDate)
.isSinceDateProvided(isSinceDateProvided)
Expand Down
29 changes: 0 additions & 29 deletions src/main/java/reposense/util/TimeUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import reposense.parser.ParseException;
import reposense.parser.SinceDateArgumentType;
import reposense.system.LogsManager;

Expand All @@ -23,10 +22,6 @@ public class TimeUtil {

// "uuuu" is used for year since "yyyy" does not work with ResolverStyle.STRICT
private static final DateTimeFormatter CLI_ARGS_DATE_FORMAT = DateTimeFormatter.ofPattern("d/M/uuuu HH:mm:ss");
private static final String MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE =
"\"Since Date\" cannot be later than \"Until Date\".";
private static final String MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE =
"\"Since Date\" must not be later than today's date.";

private static final String EARLIEST_VALID_DATE = "1970-01-01T00:00:00";
private static final String LATEST_VALID_DATE = "2099-12-31T23:59:59";
Expand Down Expand Up @@ -168,30 +163,6 @@ public static boolean isEqualToArbitraryFirstDateConverted(LocalDateTime dateTim
return dateTime.equals(getArbitraryFirstCommitDateConverted(zoneId));
}

/**
* Verifies that {@code sinceDate} is earlier than {@code untilDate}.
*
* @throws ParseException if {@code sinceDate} supplied is later than {@code untilDate}.
*/
public static void verifyDatesRangeIsCorrect(LocalDateTime sinceDate, LocalDateTime untilDate)
throws ParseException {
if (sinceDate.compareTo(untilDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_UNTIL_DATE);
}
}

/**
* Verifies that {@code sinceDate} is no later than the date of report generation, given by {@code currentDate}.
*
* @throws ParseException if {@code sinceDate} supplied is later than date of report generation.
*/
public static void verifySinceDateIsValid(LocalDateTime sinceDate, LocalDateTime currentDate)
throws ParseException {
if (sinceDate.compareTo(currentDate) > 0) {
throw new ParseException(MESSAGE_SINCE_DATE_LATER_THAN_TODAY_DATE);
}
}

/**
* Extracts the first substring of {@code date} string that matches the {@code DATE_FORMAT_REGEX}.
*/
Expand Down
31 changes: 31 additions & 0 deletions src/test/java/reposense/parser/ArgsParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;

Expand Down Expand Up @@ -606,6 +607,36 @@ public void sinceDate_laterThanUntilDate_throwsParseException() {
Assertions.assertThrows(ParseException.class, () -> ArgsParser.parse(translateCommandline(input)));
}

@Test
public void sinceDate_laterThanCurrentDate_throwsParseException() {
LocalDateTime tomorrowDateTime = LocalDateTime.now()
.plusDays(1L);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String tomorrow = tomorrowDateTime.format(formatter);


String input = DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)
.build();
Assertions.assertThrows(ParseException.class, () -> ArgsParser.parse(translateCommandline(input)));
}

@Test
public void sinceDate_beforeUntilDateAndLaterThanCurrentDate_throwsParseException() {
LocalDateTime tomorrowDateTime = LocalDateTime.now()
.plusDays(1L);
LocalDateTime dayAfterDateTime = LocalDateTime.now()
.plusDays(2L);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
String tomorrow = tomorrowDateTime.format(formatter);
String dayAfter = dayAfterDateTime.format(formatter);

String input = DEFAULT_INPUT_BUILDER.addSinceDate(tomorrow)
.addUntilDate(dayAfter)
.build();
Assertions.assertThrows(ParseException.class, () -> ArgsParser.parse(translateCommandline(input)));
}

@Test
public void period_withBothSinceDateAndUntilDate_throwsParseException() {
String input = DEFAULT_INPUT_BUILDER.addPeriod("18d")
Expand Down

0 comments on commit d8ce443

Please sign in to comment.