You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yacy_search_server/test/java/net/yacy/document/DateDetectionTest.java

167 lines
7.0 KiB

package net.yacy.document;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Set;
import java.util.TimeZone;
import org.junit.Test;
import net.yacy.document.DateDetection.HolidayMap;
public class DateDetectionTest {
/**
* Test of parseLine method, of class DateDetection.
*/
@Test
public void testParseLine() {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
cal.clear(); // get rid of sec, millisec
cal.set(2016, Calendar.JANUARY, 1); // set the target date
// test some date input representations
Set<String> testtext = new LinkedHashSet<>();
testtext.add("2016-01-01");
testtext.add("2016/01/01");
testtext.add("1.1.2016");
testtext.add("1. Januar 2016");
testtext.add("2016, January 1.");
testtext.add("beginning text 1.1.2016");
testtext.add("line break\n1.1.2016");
for (String text : testtext) {
Date d = DateDetection.parseLine(text, 0);
// this formatter is used to create Solr search queries, use it to compare equality
String cs = cal.getTime().toInstant().toString();
String ds = d.toInstant().toString();
assertEquals(text, cs, ds);
}
// test holidays
cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
int currentyear = cal.get(Calendar.YEAR); // instance is initilized to NOW
cal.clear(); // get rid of sec, millisec
cal.set(currentyear, Calendar.JANUARY, 1); // use Calendar const (month is 0 based)
testtext.clear();
testtext.add("Neujahr");
testtext.add("New Year's Day");
for (String text : testtext) {
Date d = DateDetection.parseLine(text, 0);
// this formatter is used to create Solr search queries, use it to compare equality
String cs = cal.getTime().toInstant().toString();
String ds = d.toInstant().toString();
assertEquals(text, cs, ds);
}
// test relative dates
cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
currentyear = cal.get(Calendar.YEAR); // instance is init to NOW
int currentmonth = cal.get(Calendar.MONTH);
int currentday = cal.get(Calendar.DAY_OF_MONTH);
cal.clear(); // get rid of sec, millisec
cal.set(currentyear, currentmonth, currentday); // use Calendar const (month is 0 based)
cal.add(Calendar.DAY_OF_MONTH, 1);
testtext.clear();
testtext.add("morgen");
testtext.add("tomorrow");
for (String text : testtext) {
Date d = DateDetection.parseLine(text, 0);
// this formatter is used to create Solr search queries, use it to compare equality
String cs = cal.getTime().toInstant().toString();
String ds = d.toInstant().toString();
assertEquals(text, cs, ds);
}
}
/**
* Negative test of parseLine method, of class DateDetection
* with cases that represent NOT a date
*/
@Test
public void testParseLineNoDate() {
// test input representations
Set<String> testtext = new LinkedHashSet<>();
testtext.add("3.1.2.0102"); // example of a program version string
// testtext.add("3.1.20.0102"); // date end-capture not working (on modification conflict with YMD parser)
testtext.add("v3.1.21");
testtext.add("v3.1.22.");
for (String text : testtext) {
Date d = DateDetection.parseLine(text, 0);
assertNull("not a date: " + text, d);
}
}
/**
* Compare the dates associated to the holiday name in the map with the expected result
* @param holidays holidays map for a given year
* @param holidayName the holiday name (key in the map) to check
* @param expected the expected formatted dates
*/
private void checkFormattedDates(final HolidayMap holidays, final String holidayName, final String[] expected) {
/* Simple format for easier assertions reading */
final SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
final Date[] actual = holidays.get(holidayName);
String[] actualFormatted = new String[actual.length];
for (int i = 0; i < actual.length; i++) {
actualFormatted[i] = format.format(actual[i]);
}
assertArrayEquals(holidayName, expected, actualFormatted);
}
/**
* Check generated holidays dates with some references dates
*/
@Test
public void testGetHolidays() {
HolidayMap holidays = DateDetection.getHolidays(2015);
/* Dates initially hardcoded in DateDetection class */
checkFormattedDates(holidays, "Ostersonntag", new String[] { "2014/04/20", "2015/04/05", "2016/03/27" });
checkFormattedDates(holidays, "Weiberfastnacht", new String[] { "2014/02/27", "2015/02/12", "2016/02/04" });
checkFormattedDates(holidays, "Rosenmontag", new String[] { "2014/03/03", "2015/02/16", "2016/02/08" });
checkFormattedDates(holidays, "Karsamstag", new String[] { "2014/04/19", "2015/04/04", "2016/03/26" });
checkFormattedDates(holidays, "Ostern",
new String[] { "2014/04/20", "2015/04/05", "2016/03/27", "2014/04/21", "2015/04/06", "2016/03/28" });
checkFormattedDates(holidays, "Muttertag", new String[] { "2014/05/11", "2015/05/10", "2016/05/08" });
checkFormattedDates(holidays, "Volkstrauertag", new String[] { "2014/11/16", "2015/11/15", "2016/11/13" });
checkFormattedDates(holidays, "Totensonntag", new String[] { "2014/11/23", "2015/11/22", "2016/11/20" });
checkFormattedDates(holidays, "1. Advent", new String[] { "2014/11/30", "2015/11/29", "2016/11/27" });
checkFormattedDates(holidays, "2. Advent", new String[] { "2014/12/07", "2015/12/06", "2016/12/04" });
checkFormattedDates(holidays, "3. Advent", new String[] { "2014/12/14", "2015/12/13", "2016/12/11" });
checkFormattedDates(holidays, "4. Advent", new String[] { "2014/12/21", "2015/12/20", "2016/12/18" });
/* Some more recent examples */
holidays = DateDetection.getHolidays(2018);
checkFormattedDates(holidays, "Ostersonntag", new String[] { "2017/04/16", "2018/04/01", "2019/04/21"});
checkFormattedDates(holidays, "Weiberfastnacht", new String[] { "2017/02/23", "2018/02/08", "2019/02/28" });
checkFormattedDates(holidays, "Rosenmontag", new String[] { "2017/02/27", "2018/02/12", "2019/03/04" });
checkFormattedDates(holidays, "Muttertag", new String[] { "2017/05/14", "2018/05/13", "2019/05/12" });
checkFormattedDates(holidays, "1. Advent", new String[] { "2017/12/03", "2018/12/02", "2019/12/01" });
}
}