// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataquality.converters;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.time.LocalDate;
import java.time.Month;
import java.time.chrono.Chronology;
import java.time.chrono.HijrahChronology;
import java.time.chrono.IsoChronology;
import java.time.chrono.JapaneseChronology;
import java.time.chrono.MinguoChronology;
import java.time.chrono.ThaiBuddhistChronology;
import java.util.Locale;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Test;
/**
* Test for class {@link DateCalendarConverter}.
*
* @author msjian
* @version 2017.02.08
*/
public class DateCalendarConverterTest {
private static final Logger LOGGER = Logger.getLogger(DateCalendarConverterTest.class);
private static final String pattern = "yyyy-MM-dd"; //$NON-NLS-1$
private static final String IsoStr = "1996-10-29"; //$NON-NLS-1$
private static final String HijrahStr = "1417-06-16"; //$NON-NLS-1$
private static final String JapaneseStr = "0008-10-29";//$NON-NLS-1$
private static final String MinguoStr = "0085-10-29"; //$NON-NLS-1$
private static final String ThaiBuddhistStr = "2539-10-29"; //$NON-NLS-1$
private static final String pattern1 = "yyyy/MM/dd"; //$NON-NLS-1$
private static final String IsoStr1 = "1996/10/29"; //$NON-NLS-1$
private static final String HijrahStr1 = "1417/06/16"; //$NON-NLS-1$
private static final String JapaneseStr1 = "0008/10/29";//$NON-NLS-1$
private static final String MinguoStr1 = "0085/10/29"; //$NON-NLS-1$
private static final String ThaiBuddhistStr1 = "2539/10/29"; //$NON-NLS-1$
private static final String pattern2 = "yy/MM/dd"; //$NON-NLS-1$
private static final String IsoStr2 = "96/10/29"; //$NON-NLS-1$
private static final String pattern3 = "MM/dd/yyyy"; //$NON-NLS-1$
private static final String IsoStr3 = "10/29/1996"; //$NON-NLS-1$
private static final String pattern4 = "yyyyMMdd"; //$NON-NLS-1$
private static final String IsoStr4 = "19961029"; //$NON-NLS-1$
private static final String JapaneseStr4 = "00081029";//$NON-NLS-1$
private static final String pattern5 = "M/d/yyyy GGGGG"; //$NON-NLS-1$
private static final String IsoStr5 = "10/29/1996 A"; //$NON-NLS-1$
private static final String HijrahStr5 = "6/16/1417 1"; //$NON-NLS-1$
private static final String JapaneseStr5 = "10/29/0008 H";//$NON-NLS-1$
private static final String MinguoStr5 = "10/29/0085 1"; //$NON-NLS-1$
private static final String ThaiBuddhistStr5 = "10/29/2539 B.E."; //$NON-NLS-1$
private static final String pattern6 = "yyyy MM dd"; //$NON-NLS-1$
private static final String HijrahStr2 = "1417 06 16"; //$NON-NLS-1$
private static final String patternEnglishDate = "dd/MMM/yyyy";
private static final String patternFrenchDate = "dd/MMM/yyyy";
private static final String patternChineseDate = "dd MMM yyyy";
private static final String englishDate = "01/Sep/2015";
private static final String frenchDate = "01/sept./2015";
private static final String expectedChineseDate = "01 九月 0104";
@Test
public void testConvert_IsoDateTo() {
assertEquals(HijrahStr, new DateCalendarConverter(IsoChronology.INSTANCE, HijrahChronology.INSTANCE).convert(IsoStr));
assertEquals(JapaneseStr, new DateCalendarConverter(IsoChronology.INSTANCE, JapaneseChronology.INSTANCE).convert(IsoStr));
assertEquals(MinguoStr, new DateCalendarConverter(IsoChronology.INSTANCE, MinguoChronology.INSTANCE).convert(IsoStr));
assertEquals(ThaiBuddhistStr,
new DateCalendarConverter(IsoChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE).convert(IsoStr));
assertEquals(IsoStr2,
new DateCalendarConverter(pattern, pattern2, IsoChronology.INSTANCE, IsoChronology.INSTANCE).convert(IsoStr));
assertEquals(IsoStr3,
new DateCalendarConverter(pattern, pattern3, IsoChronology.INSTANCE, IsoChronology.INSTANCE).convert(IsoStr));
assertEquals(IsoStr4,
new DateCalendarConverter(pattern, pattern4, IsoChronology.INSTANCE, IsoChronology.INSTANCE).convert(IsoStr));
assertEquals(IsoStr5,
new DateCalendarConverter(pattern, pattern5, IsoChronology.INSTANCE, IsoChronology.INSTANCE).convert(IsoStr));
assertEquals(HijrahStr1,
new DateCalendarConverter(pattern, pattern1, IsoChronology.INSTANCE, HijrahChronology.INSTANCE).convert(IsoStr));
assertEquals(HijrahStr1, new DateCalendarConverter(pattern1, pattern1, IsoChronology.INSTANCE, HijrahChronology.INSTANCE)
.convert(IsoStr1));
assertEquals(HijrahStr,
new DateCalendarConverter(pattern1, pattern, IsoChronology.INSTANCE, HijrahChronology.INSTANCE).convert(IsoStr1));
assertEquals(HijrahStr5, new DateCalendarConverter(pattern1, pattern5, IsoChronology.INSTANCE, HijrahChronology.INSTANCE)
.convert(IsoStr1));
assertEquals(JapaneseStr1,
new DateCalendarConverter(pattern, pattern1, IsoChronology.INSTANCE, JapaneseChronology.INSTANCE)
.convert(IsoStr));
assertEquals(JapaneseStr1,
new DateCalendarConverter(pattern1, pattern1, IsoChronology.INSTANCE, JapaneseChronology.INSTANCE)
.convert(IsoStr1));
assertEquals(JapaneseStr,
new DateCalendarConverter(pattern1, pattern, IsoChronology.INSTANCE, JapaneseChronology.INSTANCE)
.convert(IsoStr1));
assertEquals(MinguoStr1,
new DateCalendarConverter(pattern, pattern1, IsoChronology.INSTANCE, MinguoChronology.INSTANCE).convert(IsoStr));
assertEquals(MinguoStr1, new DateCalendarConverter(pattern1, pattern1, IsoChronology.INSTANCE, MinguoChronology.INSTANCE)
.convert(IsoStr1));
assertEquals(MinguoStr,
new DateCalendarConverter(pattern1, pattern, IsoChronology.INSTANCE, MinguoChronology.INSTANCE).convert(IsoStr1));
assertEquals(ThaiBuddhistStr1,
new DateCalendarConverter(pattern, pattern1, IsoChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE)
.convert(IsoStr));
assertEquals(ThaiBuddhistStr1,
new DateCalendarConverter(pattern1, pattern1, IsoChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE)
.convert(IsoStr1));
assertEquals(ThaiBuddhistStr,
new DateCalendarConverter(pattern1, pattern, IsoChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE)
.convert(IsoStr1));
}
@Test
public void testConvert_withLocale() {
assertEquals(expectedChineseDate, new DateCalendarConverter(patternEnglishDate, patternChineseDate,
IsoChronology.INSTANCE, MinguoChronology.INSTANCE, Locale.US, Locale.CHINESE).convert(englishDate));
assertEquals(englishDate, new DateCalendarConverter(patternChineseDate, patternEnglishDate, MinguoChronology.INSTANCE,
IsoChronology.INSTANCE, Locale.CHINESE, Locale.US).convert(expectedChineseDate));
assertEquals(expectedChineseDate, new DateCalendarConverter(patternFrenchDate, patternChineseDate, IsoChronology.INSTANCE,
MinguoChronology.INSTANCE, Locale.FRANCE, Locale.CHINESE).convert(frenchDate));
assertEquals(frenchDate, new DateCalendarConverter(patternChineseDate, patternFrenchDate, MinguoChronology.INSTANCE,
IsoChronology.INSTANCE, Locale.CHINESE, Locale.FRANCE).convert(expectedChineseDate));
}
@Test
public void testConvert_HijrahDateTo() {
assertEquals(IsoStr, new DateCalendarConverter(HijrahChronology.INSTANCE, IsoChronology.INSTANCE).convert(HijrahStr));
assertEquals(JapaneseStr,
new DateCalendarConverter(HijrahChronology.INSTANCE, JapaneseChronology.INSTANCE).convert(HijrahStr));
assertEquals(MinguoStr,
new DateCalendarConverter(HijrahChronology.INSTANCE, MinguoChronology.INSTANCE).convert(HijrahStr));
assertEquals(ThaiBuddhistStr,
new DateCalendarConverter(HijrahChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE).convert(HijrahStr));
assertEquals(JapaneseStr1,
new DateCalendarConverter(pattern, pattern1, HijrahChronology.INSTANCE, JapaneseChronology.INSTANCE)
.convert(HijrahStr));
assertEquals(MinguoStr, new DateCalendarConverter(pattern6, pattern, HijrahChronology.INSTANCE, MinguoChronology.INSTANCE)
.convert(HijrahStr2));
assertEquals(ThaiBuddhistStr5, new DateCalendarConverter(pattern, pattern5, HijrahChronology.INSTANCE,
ThaiBuddhistChronology.INSTANCE, Locale.US, Locale.US).convert(HijrahStr));
}
@Test
public void testConvert_JapaneseDateTo() {
assertEquals(IsoStr, new DateCalendarConverter(JapaneseChronology.INSTANCE, IsoChronology.INSTANCE).convert(JapaneseStr));
assertEquals(HijrahStr,
new DateCalendarConverter(JapaneseChronology.INSTANCE, HijrahChronology.INSTANCE).convert(JapaneseStr));
assertEquals(MinguoStr,
new DateCalendarConverter(JapaneseChronology.INSTANCE, MinguoChronology.INSTANCE).convert(JapaneseStr));
assertEquals(ThaiBuddhistStr,
new DateCalendarConverter(JapaneseChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE).convert(JapaneseStr));
assertEquals(MinguoStr5,
new DateCalendarConverter(pattern4, pattern5, JapaneseChronology.INSTANCE, MinguoChronology.INSTANCE)
.convert(JapaneseStr4));
assertEquals(MinguoStr5,
new DateCalendarConverter(pattern, pattern5, JapaneseChronology.INSTANCE, MinguoChronology.INSTANCE)
.convert(JapaneseStr));
}
@Test
public void testConvert_MinguoDateTo() {
assertEquals(IsoStr, new DateCalendarConverter(MinguoChronology.INSTANCE, IsoChronology.INSTANCE).convert(MinguoStr));
assertEquals(HijrahStr,
new DateCalendarConverter(MinguoChronology.INSTANCE, HijrahChronology.INSTANCE).convert(MinguoStr));
assertEquals(JapaneseStr,
new DateCalendarConverter(MinguoChronology.INSTANCE, JapaneseChronology.INSTANCE).convert(MinguoStr));
assertEquals(ThaiBuddhistStr,
new DateCalendarConverter(MinguoChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE).convert(MinguoStr));
assertEquals(JapaneseStr5,
new DateCalendarConverter(pattern, pattern5, MinguoChronology.INSTANCE, JapaneseChronology.INSTANCE)
.convert(MinguoStr));
}
@Test
public void testConvert_ThaiBuddhistDateTo() {
assertEquals(IsoStr,
new DateCalendarConverter(ThaiBuddhistChronology.INSTANCE, IsoChronology.INSTANCE).convert(ThaiBuddhistStr));
assertEquals(HijrahStr,
new DateCalendarConverter(ThaiBuddhistChronology.INSTANCE, HijrahChronology.INSTANCE).convert(ThaiBuddhistStr));
assertEquals(JapaneseStr,
new DateCalendarConverter(ThaiBuddhistChronology.INSTANCE, JapaneseChronology.INSTANCE).convert(ThaiBuddhistStr));
assertEquals(MinguoStr,
new DateCalendarConverter(ThaiBuddhistChronology.INSTANCE, MinguoChronology.INSTANCE).convert(ThaiBuddhistStr));
assertEquals(IsoStr5,
new DateCalendarConverter(pattern, pattern5, ThaiBuddhistChronology.INSTANCE, IsoChronology.INSTANCE)
.convert(ThaiBuddhistStr));
}
@Test
public void testConvert_SpecialCases() {
// test when the input is blank
assertEquals("", new DateCalendarConverter(HijrahChronology.INSTANCE, JapaneseChronology.INSTANCE).convert("")); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals(" ", new DateCalendarConverter(IsoChronology.INSTANCE, HijrahChronology.INSTANCE).convert(" ")); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals(null, new DateCalendarConverter(HijrahChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE).convert(null));
// test when the input is not a date
assertEquals("aa", new DateCalendarConverter(HijrahChronology.INSTANCE, HijrahChronology.INSTANCE).convert("aa")); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals("", new DateCalendarConverter( //$NON-NLS-1$
pattern1, pattern, HijrahChronology.INSTANCE, HijrahChronology.INSTANCE).convert("aa")); //$NON-NLS-1$
// test when the pattern is null
assertEquals(IsoStr5, new DateCalendarConverter(null, pattern5, ThaiBuddhistChronology.INSTANCE, IsoChronology.INSTANCE)
.convert(ThaiBuddhistStr));
assertEquals(IsoStr, new DateCalendarConverter(pattern, null, ThaiBuddhistChronology.INSTANCE, IsoChronology.INSTANCE)
.convert(ThaiBuddhistStr));
assertEquals(IsoStr, new DateCalendarConverter(null, null, ThaiBuddhistChronology.INSTANCE, IsoChronology.INSTANCE)
.convert(ThaiBuddhistStr));
}
@Test
public void testParseStringToDate_formatDateToString() {
// convert an ISO-based date to a date in another chronology
LocalDate date = LocalDate.of(2011, Month.AUGUST, 19);// LocalDate.from(jdate)
// JapaneseDate jdate = JapaneseDate.from(date);
// HijrahDate hdate = HijrahDate.from(date);
// MinguoDate mdate = MinguoDate.from(date);
// ThaiBuddhistDate tdate = ThaiBuddhistDate.from(date);
LocalDate parseDateString = new DateCalendarConverter(pattern4, pattern4).parseStringToDate("20110819"); //$NON-NLS-1$
assertEquals(date, parseDateString);
assertEquals("2011-08-19", new DateCalendarConverter().formatDateToString(parseDateString));//$NON-NLS-1$
LocalDate parseDateString1 = new DateCalendarConverter().parseStringToDate("2011-08-19"); //$NON-NLS-1$
assertEquals(date, parseDateString1);
assertEquals("2011-08-19", new DateCalendarConverter().formatDateToString(parseDateString1)); //$NON-NLS-1$
LocalDate parseDateString2 = new DateCalendarConverter(pattern6, pattern6).parseStringToDate("2011 08 19"); //$NON-NLS-1$
assertEquals(date, parseDateString2);
assertEquals("2011 08 19", new DateCalendarConverter(pattern6, pattern6).formatDateToString(parseDateString2)); //$NON-NLS-1$
LocalDate parseDateString3 = new DateCalendarConverter(pattern4, pattern4).parseStringToDate("20110819"); //$NON-NLS-1$
assertEquals(date, parseDateString3);
assertEquals("0023 08 19", //$NON-NLS-1$
new DateCalendarConverter(null, pattern6, null, JapaneseChronology.INSTANCE)
.formatDateToString(parseDateString3));
LocalDate parseDateString4 = new DateCalendarConverter(pattern, null, JapaneseChronology.INSTANCE, null)
.parseStringToDate("0023-08-19"); //$NON-NLS-1$
assertEquals(date, parseDateString4);
assertEquals("0023-08-19", //$NON-NLS-1$
new DateCalendarConverter(null, pattern, null, JapaneseChronology.INSTANCE).formatDateToString(parseDateString4));
LocalDate parseDateString5 = new DateCalendarConverter(pattern6, null).parseStringToDate("2011 08 19");//$NON-NLS-1$
assertEquals(date, parseDateString5);
assertEquals("0023/08/19", //$NON-NLS-1$
new DateCalendarConverter(null, pattern1, null, JapaneseChronology.INSTANCE)
.formatDateToString(parseDateString5));
}
/**
* measure the execution time of the current implementation with 100 000 dates to convert.
*/
@Test
public void testConvert_MeasureTheExecutionTime() {
Chronology[] chronologys = { IsoChronology.INSTANCE, HijrahChronology.INSTANCE, JapaneseChronology.INSTANCE,
MinguoChronology.INSTANCE, ThaiBuddhistChronology.INSTANCE };
for (Chronology sourceChronology : chronologys) {
for (Chronology targetChronology : chronologys) {
DateCalendarConverter dateCalendarConverter = new DateCalendarConverter("dd-MM-yyyy", pattern, sourceChronology, //$NON-NLS-1$
targetChronology);
InputStream dateStream = this.getClass().getResourceAsStream("dateList.txt"); //$NON-NLS-1$
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(dateStream, "UTF-8")); //$NON-NLS-1$ //for Hindi language
// Double-byte type
} catch (UnsupportedEncodingException e1) {
LOGGER.error(e1, e1);
Assert.fail(e1.getMessage());
}
try {
long startTime = System.currentTimeMillis();
String line;
while ((line = br.readLine()) != null) {
dateCalendarConverter.convert(line);
}
long endTime = System.currentTimeMillis();
System.out.println("the execution time of " + sourceChronology.getId() + "-->" + targetChronology.getId() //$NON-NLS-1$ //$NON-NLS-2$
+ " : " + (endTime - startTime) + "ms"); //$NON-NLS-1$ //$NON-NLS-2$
} catch (FileNotFoundException e) {
LOGGER.error(e, e);
Assert.fail(e.getMessage());
} catch (IOException e) {
LOGGER.error(e, e);
Assert.fail(e.getMessage());
} finally {
try {
br.close();
} catch (IOException e) {
LOGGER.error(e, e);
Assert.fail(e.getMessage());
}
}
}
}
}
}