diff --git a/src/main/java/com/williamcallahan/javachat/util/QueryVersionExtractor.java b/src/main/java/com/williamcallahan/javachat/util/QueryVersionExtractor.java index c0dbb0e1..8ab91c56 100644 --- a/src/main/java/com/williamcallahan/javachat/util/QueryVersionExtractor.java +++ b/src/main/java/com/williamcallahan/javachat/util/QueryVersionExtractor.java @@ -12,8 +12,9 @@ public final class QueryVersionExtractor { private static final int MINIMUM_PLAUSIBLE_JAVA_RELEASE = 8; private static final Pattern EXPLICIT_VERSION_PATTERN = Pattern.compile("\\b(?:java\\s*se|javase|java|jdk)[\\s-]*(\\d{1,3})\\b", Pattern.CASE_INSENSITIVE); - private static final Pattern EXPLICIT_QUANTITY_SUFFIX_PATTERN = - Pattern.compile("[\\s-]+(?:days?|hours?|minutes?|seconds?|times|lines?)\\b", Pattern.CASE_INSENSITIVE); + private static final Pattern EXPLICIT_QUANTITY_SUFFIX_PATTERN = Pattern.compile( + "[\\s-]+(?:days?|hours?|minutes?|seconds?|times|lines?|weeks?|months?|years?)\\b", + Pattern.CASE_INSENSITIVE); private static final Pattern SHORTHAND_VERSION_PATTERN = Pattern.compile( "^\\s*(?:,|and\\b|vs(?:\\.|\\b)|versus\\b|\\+|/|&)\\s*(\\d{1,3})\\b", Pattern.CASE_INSENSITIVE); diff --git a/src/test/java/com/williamcallahan/javachat/util/QueryVersionExtractorTest.java b/src/test/java/com/williamcallahan/javachat/util/QueryVersionExtractorTest.java index 26482cec..3491686a 100644 --- a/src/test/java/com/williamcallahan/javachat/util/QueryVersionExtractorTest.java +++ b/src/test/java/com/williamcallahan/javachat/util/QueryVersionExtractorTest.java @@ -40,7 +40,8 @@ void ignoresUnprefixedNumbersOutsideAComparisonChain() { @Test void rejectsExplicitQuantityPhrasesWithoutSuppressingReleaseRequests() { for (String quantityNoun : List.of( - "day", "days", "hour", "hours", "minute", "minutes", "second", "seconds", "times", "line", "lines")) { + "day", "days", "hour", "hours", "minute", "minutes", "second", "seconds", "times", "line", "lines", + "week", "weeks", "month", "months", "year", "years")) { assertEquals( List.of(), QueryVersionExtractor.extractVersionNumbers("Java 100 " + quantityNoun + " of practice")); @@ -50,6 +51,28 @@ void rejectsExplicitQuantityPhrasesWithoutSuppressingReleaseRequests() { assertEquals(List.of("21"), QueryVersionExtractor.extractVersionNumbers("Java 21 time API")); assertEquals(List.of("25"), QueryVersionExtractor.extractVersionNumbers("Java 25 examples")); assertEquals(List.of("21"), QueryVersionExtractor.extractVersionNumbers("Java 100 days of code in Java 21")); + assertEquals(List.of("21"), QueryVersionExtractor.extractVersionNumbers("Java 100 months of code in Java 21")); + } + + @Test + void rejectsTemporalQuantityPhrasingsWhereJavaPrecedesTheDigits() { + assertEquals(List.of(), QueryVersionExtractor.extractVersionNumbers("switched to Java 6 months ago")); + assertEquals(List.of(), QueryVersionExtractor.extractVersionNumbers("I have Java 5 years of experience")); + assertEquals(List.of(), QueryVersionExtractor.extractVersionNumbers("Java 5 years experience")); + assertEquals(List.of(), QueryVersionExtractor.extractVersionNumbers("been on Java 8 months")); + assertEquals(List.of(), QueryVersionExtractor.extractVersionNumbers("learned Java 4 weeks ago")); + assertEquals(List.of(), QueryVersionExtractor.extractVersionNumbers("ran Java 11 hours straight")); + assertEquals(List.of(), QueryVersionExtractor.extractVersionNumbers("practiced Java 3 years on the side")); + } + + @Test + void extractsReleaseRequestsAdjacentToNonQuantitySuffixWords() { + assertEquals(List.of("25"), QueryVersionExtractor.extractVersionNumbers("Java 25 monthly cadence")); + assertEquals(List.of("25"), QueryVersionExtractor.extractVersionNumbers("Java 25 yearly release schedule")); + assertEquals(List.of("25"), QueryVersionExtractor.extractVersionNumbers("Java 25 weekly digest")); + assertEquals(List.of("21"), QueryVersionExtractor.extractVersionNumbers("Java 21 API")); + assertEquals( + List.of("25", "21"), QueryVersionExtractor.extractVersionNumbers("Java 25 examples and Java 21 notes")); } @Test