12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2007-2012, International Business Machines Corporation and * 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.format; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.FieldPosition; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.ParsePosition; 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date; 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Iterator; 152d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport java.util.List; 162d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 172d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.Test; 182d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport org.junit.runner.RunWith; 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.ModuleTest; 212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.ModuleTest.TestDataPair; 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestDataModule; 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.TestDataModule.DataMap; 242d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.TestDataModule.TestData; 252d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport com.ibm.icu.dev.test.TestFmwk; 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.util.CalendarFieldsSet; 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.dev.test.util.DateTimeStyleSet; 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.DateFormat; 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.SimpleDateFormat; 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Calendar; 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.TimeZone; 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 342d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport junitparams.JUnitParamsRunner; 352d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertimport junitparams.Parameters; 362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @author srl 392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * @author sgill 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 422d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert@RunWith(JUnitParamsRunner.class) 432d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubertpublic class DataDrivenFormatTest extends TestFmwk { 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param baseName 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param locName 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public DataDrivenFormatTest() { 502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert //super("com/ibm/icu/dev/data/testdata/", "format"); 512d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 522d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 532d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @SuppressWarnings("unused") 542d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private List<TestDataPair> getTestData() throws Exception { 552d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert return ModuleTest.getTestData("com/ibm/icu/dev/data/testdata/", "format"); 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /* (non-Javadoc) 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see com.ibm.icu.dev.test.ModuleTest#processModules() 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Test 622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Parameters(method="getTestData") 632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public void formatTest(TestDataPair pair) { 642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert TestData td = pair.td; 652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert DataMap settings = pair.dm; 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String type = settings.getString("Type"); 692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert if(type.equals("date_format")) { 712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert testConvertDate(td, settings, true); 722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } else if(type.equals("date_parse")) { 732d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert testConvertDate(td, settings, false); 742d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } else { 752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert errln("Unknown type: " + type); 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String kPATTERN = "PATTERN="; 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String kMILLIS = "MILLIS="; 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String kRELATIVE_MILLIS = "RELATIVE_MILLIS="; 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String kRELATIVE_ADD = "RELATIVE_ADD:"; 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private void testConvertDate(TestDataModule.TestData testData, DataMap settings, boolean fmt) { 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat basicFmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee"); 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int n = 0; 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ++n; 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long now = System.currentTimeMillis(); 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DataMap currentCase = (DataMap) iter.next(); 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String caseString = "["+testData.getName()+"#"+n+(fmt?"format":"parse")+"]"; 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String locale = currentCase.getString("locale"); 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String zone = currentCase.getString("zone"); 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String spec = currentCase.getString("spec"); 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String date = currentCase.getString("date"); 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String str = currentCase.getString("str"); 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date fromDate = null; 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean useDate = false; 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ULocale loc = new ULocale(locale); 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String pattern = null; 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// boolean usePattern = false; 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateFormat format = null; 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DateTimeStyleSet styleSet; 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CalendarFieldsSet fromSet = null; 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // parse 'spec' - either 'PATTERN=yy mm dd' or 'DATE=x,TIME=y' 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(spec.startsWith(kPATTERN)) { 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert pattern = spec.substring(kPATTERN.length()); 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert// usePattern = true; 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format = new SimpleDateFormat(pattern, loc); 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert styleSet = new DateTimeStyleSet(); 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert styleSet.parseFrom(spec); 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format = DateFormat.getDateTimeInstance(styleSet.getDateStyle(), styleSet.getTimeStyle(), loc); 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Calendar cal = Calendar.getInstance(loc); 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (zone.length() > 0) { 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert TimeZone tz = TimeZone.getFrozenTimeZone(zone); 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setTimeZone(tz); 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.setTimeZone(tz); 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // parse 'date' - either 'MILLIS=12345' or a CalendarFieldsSet 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(date.startsWith(kMILLIS)) { 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert useDate = true; 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromDate = new Date(Long.parseLong(date.substring(kMILLIS.length()))); 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if(date.startsWith(kRELATIVE_MILLIS)) { 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert useDate = true; 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromDate = new Date(now+Long.parseLong(date.substring(kRELATIVE_MILLIS.length()))); 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if(date.startsWith(kRELATIVE_ADD)) { 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String add = date.substring(kRELATIVE_ADD.length()); // "add" is a string indicating which fields to add 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CalendarFieldsSet addSet = new CalendarFieldsSet(); 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert addSet.parseFrom(add); 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert useDate = true; 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.setTimeInMillis(now); 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /// perform op on 'to calendar' 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (int q=0; q<addSet.fieldCount(); q++) { 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (addSet.isSet(q)) { 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (q == Calendar.DATE) { 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.add(q,addSet.get(q)); 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.set(q,addSet.get(q)); 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromDate = cal.getTime(); 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromSet = new CalendarFieldsSet(); 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromSet.parseFrom(date); 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert // run the test 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(fmt) { 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuffer output = new StringBuffer(); 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert FieldPosition pos = new FieldPosition(0); 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(useDate) { 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert output = format.format(fromDate, output, pos); 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert fromSet.setOnCalendar(cal); 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.format(cal, output, pos); 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(output.toString().equals(str)) { 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(caseString + " Success - strings match: " + output); 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(caseString + " FAIL: got " + output + " expected " + str); 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { // parse 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert cal.clear(); 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ParsePosition pos = new ParsePosition(0); 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert format.parse(str, cal, pos); 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(useDate) { 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Date gotDate = cal.getTime(); 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(gotDate.equals(fromDate)) { 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(caseString + " SUCCESS: got=parse="+str); 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(caseString + " FAIL: parsed " + str + " but got " + 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert basicFmt.format(gotDate) + " - " + gotDate + " expected " + 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert basicFmt.format(fromDate)); 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CalendarFieldsSet diffSet = new CalendarFieldsSet(); 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if(!fromSet.matches(cal, diffSet)) { 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String diffs = diffSet.diffFrom(fromSet); 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert errln(caseString + " FAIL: differences: " + diffs); 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert logln(caseString + " SUCCESS: got=parse: " + str + " - " + fromSet.toString()); 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 205