blob: 0e5eb283a4c2b35af891c20a4fba647559c1beb9 [file]
/*
* Copyright (C) 2024, Christian Halstrick and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
import org.eclipse.jgit.junit.MockSystemReader;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class GitTimeParserTest {
MockSystemReader mockSystemReader;
@Before
public void setUp() {
mockSystemReader = new MockSystemReader();
SystemReader.setInstance(mockSystemReader);
}
@After
public void tearDown() {
SystemReader.setInstance(null);
}
@Test
public void yesterday() throws ParseException {
LocalDateTime parse = GitTimeParser.parse("yesterday");
LocalDateTime now = SystemReader.getInstance().civilNow();
assertEquals(Period.between(parse.toLocalDate(), now.toLocalDate()),
Period.ofDays(1));
}
@Test
public void never() throws ParseException {
LocalDateTime parse = GitTimeParser.parse("never");
assertEquals(LocalDateTime.MAX, parse);
}
@Test
public void now_pointInTime() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-21 15:35:00 +0100");
LocalDateTime parsedNow = GitTimeParser.parse("now", aTime);
assertEquals(aTime, parsedNow);
}
@Test
public void now_systemTime() throws ParseException {
LocalDateTime firstNow = GitTimeParser.parse("now");
assertEquals(SystemReader.getInstance().civilNow(), firstNow);
mockSystemReader.tick(10);
LocalDateTime secondNow = GitTimeParser.parse("now");
assertTrue(secondNow.isAfter(firstNow));
}
@Test
public void weeksAgo() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-21 15:35:00 +0100");
LocalDateTime parse = GitTimeParser.parse("2 weeks ago", aTime);
assertEquals(asLocalDateTime("2007-02-07 15:35:00 +0100"), parse);
}
@Test
public void daysAndWeeksAgo() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-21 15:35:00 +0100");
LocalDateTime twoWeeksAgoActual = GitTimeParser.parse("2 weeks ago",
aTime);
LocalDateTime twoWeeksAgoExpected = asLocalDateTime(
"2007-02-07 15:35:00 +0100");
assertEquals(twoWeeksAgoExpected, twoWeeksAgoActual);
LocalDateTime combinedWhitespace = GitTimeParser
.parse("3 days 2 weeks ago", aTime);
LocalDateTime combinedWhitespaceExpected = asLocalDateTime(
"2007-02-04 15:35:00 +0100");
assertEquals(combinedWhitespaceExpected, combinedWhitespace);
LocalDateTime combinedDots = GitTimeParser.parse("3.day.2.week.ago",
aTime);
LocalDateTime combinedDotsExpected = asLocalDateTime(
"2007-02-04 15:35:00 +0100");
assertEquals(combinedDotsExpected, combinedDots);
}
@Test
public void hoursAgo() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-21 17:35:00 +0100");
LocalDateTime twoHoursAgoActual = GitTimeParser.parse("2 hours ago",
aTime);
LocalDateTime twoHoursAgoExpected = asLocalDateTime(
"2007-02-21 15:35:00 +0100");
assertEquals(twoHoursAgoExpected, twoHoursAgoActual);
}
@Test
public void hoursAgo_acrossDay() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-21 00:35:00 +0100");
LocalDateTime twoHoursAgoActual = GitTimeParser.parse("2 hours ago",
aTime);
LocalDateTime twoHoursAgoExpected = asLocalDateTime(
"2007-02-20 22:35:00 +0100");
assertEquals(twoHoursAgoExpected, twoHoursAgoActual);
}
@Test
public void minutesHoursAgoCombined() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-04 15:35:00 +0100");
LocalDateTime combinedWhitespace = GitTimeParser
.parse("3 hours 2 minutes ago", aTime);
LocalDateTime combinedWhitespaceExpected = asLocalDateTime(
"2007-02-04 12:33:00 +0100");
assertEquals(combinedWhitespaceExpected, combinedWhitespace);
LocalDateTime combinedDots = GitTimeParser
.parse("3.hours.2.minutes.ago", aTime);
LocalDateTime combinedDotsExpected = asLocalDateTime(
"2007-02-04 12:33:00 +0100");
assertEquals(combinedDotsExpected, combinedDots);
}
@Test
public void minutesAgo() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-21 17:35:10 +0100");
LocalDateTime twoMinutesAgo = GitTimeParser.parse("2 minutes ago",
aTime);
LocalDateTime twoMinutesAgoExpected = asLocalDateTime(
"2007-02-21 17:33:10 +0100");
assertEquals(twoMinutesAgoExpected, twoMinutesAgo);
}
@Test
public void minutesAgo_acrossDay() throws ParseException {
LocalDateTime aTime = asLocalDateTime("2007-02-21 00:35:10 +0100");
LocalDateTime minutesAgoActual = GitTimeParser.parse("40 minutes ago",
aTime);
LocalDateTime minutesAgoExpected = asLocalDateTime(
"2007-02-20 23:55:10 +0100");
assertEquals(minutesAgoExpected, minutesAgoActual);
}
@Test
public void iso() throws ParseException {
String dateStr = "2007-02-21 15:35:00 +0100";
LocalDateTime actual = GitTimeParser.parse(dateStr);
LocalDateTime expected = asLocalDateTime(dateStr);
assertEquals(expected, actual);
}
@Test
public void rfc() throws ParseException {
String dateStr = "Wed, 21 Feb 2007 15:35:00 +0100";
LocalDateTime actual = GitTimeParser.parse(dateStr);
LocalDateTime expected = asLocalDateTime(dateStr,
"EEE, dd MMM yyyy HH:mm:ss Z");
assertEquals(expected, actual);
}
@Test
public void shortFmt() throws ParseException {
assertParsing("2007-02-21", "yyyy-MM-dd");
}
@Test
public void shortWithDots() throws ParseException {
assertParsing("2007.02.21", "yyyy.MM.dd");
}
@Test
public void shortWithSlash() throws ParseException {
assertParsing("02/21/2007", "MM/dd/yyyy");
}
@Test
public void shortWithDotsReverse() throws ParseException {
assertParsing("21.02.2007", "dd.MM.yyyy");
}
@Test
public void defaultFmt() throws ParseException {
assertParsing("Wed Feb 21 15:35:00 2007 +0100",
"EEE MMM dd HH:mm:ss yyyy Z");
}
@Test
public void local() throws ParseException {
assertParsing("Wed Feb 21 15:35:00 2007", "EEE MMM dd HH:mm:ss yyyy");
}
private static void assertParsing(String dateStr, String format)
throws ParseException {
LocalDateTime actual = GitTimeParser.parse(dateStr);
LocalDateTime expected = asLocalDateTime(dateStr, format);
assertEquals(expected, actual);
}
private static LocalDateTime asLocalDateTime(String dateStr) {
return asLocalDateTime(dateStr, "yyyy-MM-dd HH:mm:ss Z");
}
private static LocalDateTime asLocalDateTime(String dateStr,
String pattern) {
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern);
TemporalAccessor ta = fmt
.withZone(SystemReader.getInstance().getTimeZoneId())
.withLocale(SystemReader.getInstance().getLocale())
.parse(dateStr);
return ta.isSupported(ChronoField.HOUR_OF_DAY) ? LocalDateTime.from(ta)
: LocalDate.from(ta).atStartOfDay();
}
}