001/*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 *     http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014package org.gbif.api.util;
015
016import java.io.IOException;
017import java.time.LocalDate;
018import java.time.LocalDateTime;
019import java.time.OffsetDateTime;
020import java.time.Year;
021import java.time.YearMonth;
022import java.time.ZoneOffset;
023import java.time.temporal.Temporal;
024
025import org.junit.jupiter.api.Test;
026
027import static org.junit.jupiter.api.Assertions.assertEquals;
028import static org.junit.jupiter.api.Assertions.assertNotNull;
029import static org.junit.jupiter.api.Assertions.assertThrows;
030
031/**
032 * Test case for class IsoDateParsingUtils.
033 */
034public class IsoDateParsingUtilsTest {
035
036  /**
037   * Test case for method {@link IsoDateParsingUtils#parseDateRange(String)}.
038   * Upper limit has an invalid date format.
039   */
040  @Test
041  public void isParseWrongDateRangeFormatTest() {
042    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDateRange("2010-01,2000-10-33 00:00:00"));
043  }
044
045  /**
046   * Test case for method {@link IsoDateParsingUtils#parseDateRange(String)}.
047   * Lower limit > upper limit.
048   */
049  @Test
050  public void isParseWrongDateRangeTest() {
051    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDateRange("2010-01,2000-10"));
052  }
053
054  /**
055   * Test case for method {@link IsoDateParsingUtils#parseDate(String)}.
056   */
057  @Test
058  public void isParseWrongDateTest() {
059    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDate("2010-01-01-10"));
060  }
061
062  @Test
063  public void isParseNonExistingDateTest() {
064    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDate("2010-21-01"));
065  }
066
067  @Test
068  public void isParseNonExistingDateTest2() {
069    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDate("2010-02-29"));
070  }
071
072  @Test
073  public void isParseWrongDateWithTrailingStringTest() {
074    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDate("2010 year"));
075  }
076
077  @Test
078  public void isParseWrongYearTest() {
079    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDate("10"));
080  }
081
082  @Test
083  public void isParseWrongYearTest2() {
084    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDate("10-10"));
085  }
086
087  /**
088   * Test case for method {@link IsoDateParsingUtils#parseDate(String)}.
089   */
090  @Test
091  public void isParseWrongDateTimTest() {
092    assertThrows(IllegalArgumentException.class, () -> IsoDateParsingUtils.parseDate("2010-01-01 22:00:00"));
093  }
094
095  /**
096   * Test case for method {@link IsoDateParsingUtils#parseDateRange(String)}.
097   */
098  @Test
099  public void parseDateRangeTest() {
100    assertNotNull(IsoDateParsingUtils.parseDateRange("2000-01,2010"));
101    assertNotNull(IsoDateParsingUtils.parseDateRange("1900-09-23,2000"));
102    assertNotNull(IsoDateParsingUtils.parseDateRange("1999-10,1999-12"));
103    assertNotNull(IsoDateParsingUtils.parseDateRange("1999-10,*"));
104    assertNotNull(IsoDateParsingUtils.parseDateRange("*,1999-12"));
105    assertNotNull(IsoDateParsingUtils.parseDateRange("2000-10,*"));
106    assertNotNull(IsoDateParsingUtils.parseDateRange("2021"));
107    assertNotNull(IsoDateParsingUtils.parseDateRange("2021-10"));
108    assertNotNull(IsoDateParsingUtils.parseDateRange("2021-10-25"));
109  }
110
111  /**
112   * Test case for method {@link IsoDateParsingUtils#parseDate(String)}.
113   */
114  @Test
115  public void parseDateTest() {
116    assertNotNull(IsoDateParsingUtils.parseDate("2000-01"));
117    assertNotNull(IsoDateParsingUtils.parseDate("2000"));
118    assertNotNull(IsoDateParsingUtils.parseDate("2000-01-01"));
119    assertNotNull(IsoDateParsingUtils.parseDate("2000-01-1"));
120    assertNotNull(IsoDateParsingUtils.parseDate("2000-1-01"));
121    assertNotNull(IsoDateParsingUtils.parseDate("2000-1-1"));
122  }
123
124  @Test
125  public void checkResults() {
126    assertEquals(LocalDate.parse("2021-10-25"), IsoDateParsingUtils.parseDate("2021-10-25"));
127
128    assertEquals(LocalDate.parse("2021-10-01"), IsoDateParsingUtils.parseDateRange("2021-10").lowerEndpoint());
129    assertEquals(LocalDate.parse("2021-11-01"), IsoDateParsingUtils.parseDateRange("2021-10").upperEndpoint());
130
131    assertEquals(LocalDate.parse("2000-05-01"), IsoDateParsingUtils.parseDateRange("2000-05,2010").lowerEndpoint());
132    assertEquals(LocalDate.parse("2011-01-01"), IsoDateParsingUtils.parseDateRange("2000-05,2010").upperEndpoint());
133  }
134
135  @Test
136  public void testParseTemporal() throws IOException {
137    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_123_456, ZoneOffset.UTC), "2009-02-04T05:06:07.789123456Z");
138    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_123_450, ZoneOffset.UTC), "2009-02-04T05:06:07.78912345Z");
139    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_123_400, ZoneOffset.UTC), "2009-02-04T05:06:07.7891234Z");
140    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_123_000, ZoneOffset.UTC), "2009-02-04T05:06:07.789123Z");
141    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_120_000, ZoneOffset.UTC), "2009-02-04T05:06:07.78912Z");
142    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_100_000, ZoneOffset.UTC), "2009-02-04T05:06:07.7891Z");
143    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000, ZoneOffset.UTC), "2009-02-04T05:06:07.789Z");
144    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 780_000_000, ZoneOffset.UTC), "2009-02-04T05:06:07.78Z");
145    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 700_000_000, ZoneOffset.UTC), "2009-02-04T05:06:07.7Z");
146
147    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000, ZoneOffset.ofHoursMinutesSeconds(5, 30, 45)), "2009-02-04T05:06:07.789+05:30:45");
148    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000, ZoneOffset.ofHoursMinutes(5, 30)), "2009-02-04T05:06:07.789+05:30:00");
149    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000, ZoneOffset.ofHours(5)), "2009-02-04T05:06:07.789+05:00:00");
150    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000, ZoneOffset.ofHours(5)), "2009-02-04T05:06:07.789+05:00");
151    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000, ZoneOffset.ofHoursMinutes(5, 30)), "2009-02-04T05:06:07.789+0530");
152    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000, ZoneOffset.ofHours(5)), "2009-02-04T05:06:07.789+05");
153
154    assertParseTemporal(LocalDateTime.of(2009, 2, 4, 5, 6, 7, 789_000_000), "2009-02-04T05:06:07.789");
155
156    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 0, ZoneOffset.UTC), "2009-02-04T05:06:07Z");
157    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 7, 0, ZoneOffset.ofHours(5)), "2009-02-04T05:06:07+05:00");
158    assertParseTemporal(LocalDateTime.of(2009, 2, 4, 5, 6, 7, 0), "2009-02-04T05:06:07");
159
160    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 0, 0, ZoneOffset.UTC), "2009-02-04T05:06Z");
161    assertParseTemporal(OffsetDateTime.of(2009, 2, 4, 5, 6, 0, 0, ZoneOffset.ofHours(5)), "2009-02-04T05:06+05:00");
162    assertParseTemporal(LocalDateTime.of(2009, 2, 4, 5, 6), "2009-02-04T05:06");
163
164    assertParseTemporal(LocalDate.of(2009, 2, 4), "2009-02-04");
165
166    assertParseTemporal(YearMonth.of(2009, 2), "2009-02");
167
168    assertParseTemporal(Year.of(2009), "2009");
169  }
170
171  private void assertParseTemporal(Temporal expected, String text) throws IOException {
172    Temporal parsed = IsoDateParsingUtils.parseTemporal(text);
173    assertEquals(expected, parsed);
174  }
175}