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}