2 *******************************************************************************
\r
3 * Copyright (C) 2007-2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.format;
\r
9 import java.text.FieldPosition;
\r
10 import java.text.ParsePosition;
\r
11 import java.util.Date;
\r
12 import java.util.Iterator;
\r
14 import com.ibm.icu.dev.test.ModuleTest;
\r
15 import com.ibm.icu.dev.test.TestDataModule;
\r
16 import com.ibm.icu.dev.test.TestDataModule.DataMap;
\r
17 import com.ibm.icu.dev.test.util.CalendarFieldsSet;
\r
18 import com.ibm.icu.dev.test.util.DateTimeStyleSet;
\r
19 import com.ibm.icu.text.DateFormat;
\r
20 import com.ibm.icu.text.SimpleDateFormat;
\r
21 import com.ibm.icu.util.Calendar;
\r
22 import com.ibm.icu.util.ULocale;
\r
28 public class DataDrivenFormatTest extends ModuleTest {
\r
34 public DataDrivenFormatTest() {
\r
35 super("com/ibm/icu/dev/data/testdata/", "format");
\r
39 * @see com.ibm.icu.dev.test.ModuleTest#processModules()
\r
41 public void processModules() {
\r
42 //String testName = t.getName().toString();
\r
44 for (Iterator siter = t.getSettingsIterator(); siter.hasNext();) {
\r
45 // Iterate through and get each of the test case to process
\r
46 DataMap settings = (DataMap) siter.next();
\r
48 String type = settings.getString("Type");
\r
50 if(type.equals("date_format")) {
\r
51 testConvertDate(t, settings, true);
\r
52 } else if(type.equals("date_parse")) {
\r
53 testConvertDate(t, settings, false);
\r
55 errln("Unknown type: " + type);
\r
63 public static void main(String[] args) {
\r
64 new DataDrivenFormatTest().run(args);
\r
67 private static final String kPATTERN = "PATTERN=";
\r
68 private static final String kMILLIS = "MILLIS=";
\r
69 private static final String kRELATIVE_MILLIS = "RELATIVE_MILLIS=";
\r
70 private static final String kRELATIVE_ADD = "RELATIVE_ADD:";
\r
72 private void testConvertDate(TestDataModule.TestData testData, DataMap settings, boolean fmt) {
\r
73 DateFormat basicFmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee");
\r
76 for (Iterator iter = testData.getDataIterator(); iter.hasNext();) {
\r
78 long now = System.currentTimeMillis();
\r
79 DataMap currentCase = (DataMap) iter.next();
\r
80 String caseString = "["+testData.getName()+"#"+n+(fmt?"format":"parse")+"]";
\r
82 String locale = currentCase.getString("locale");
\r
83 String spec = currentCase.getString("spec");
\r
84 String date = currentCase.getString("date");
\r
85 String str = currentCase.getString("str");
\r
87 Date fromDate = null;
\r
88 boolean useDate = false;
\r
90 ULocale loc = new ULocale(locale);
\r
91 String pattern = null;
\r
92 // boolean usePattern = false;
\r
93 DateFormat format = null;
\r
94 DateTimeStyleSet styleSet;
\r
95 CalendarFieldsSet fromSet = null;
\r
97 // parse 'spec' - either 'PATTERN=yy mm dd' or 'DATE=x,TIME=y'
\r
98 if(spec.startsWith(kPATTERN)) {
\r
99 pattern = spec.substring(kPATTERN.length());
\r
100 // usePattern = true;
\r
101 format = new SimpleDateFormat(pattern, loc);
\r
103 styleSet = new DateTimeStyleSet();
\r
104 styleSet.parseFrom(spec);
\r
105 format = DateFormat.getDateTimeInstance(styleSet.getDateStyle(), styleSet.getTimeStyle(), loc);
\r
108 Calendar cal = Calendar.getInstance(loc);
\r
110 // parse 'date' - either 'MILLIS=12345' or a CalendarFieldsSet
\r
111 if(date.startsWith(kMILLIS)) {
\r
113 fromDate = new Date(Long.parseLong(date.substring(kMILLIS.length())));
\r
114 } else if(date.startsWith(kRELATIVE_MILLIS)) {
\r
116 fromDate = new Date(now+Long.parseLong(date.substring(kRELATIVE_MILLIS.length())));
\r
117 } else if(date.startsWith(kRELATIVE_ADD)) {
\r
118 String add = date.substring(kRELATIVE_ADD.length()); // "add" is a string indicating which fields to add
\r
119 CalendarFieldsSet addSet = new CalendarFieldsSet();
\r
120 addSet.parseFrom(add);
\r
123 cal.setTimeInMillis(now);
\r
125 /// perform op on 'to calendar'
\r
126 for (int q=0; q<addSet.fieldCount(); q++) {
\r
127 if (addSet.isSet(q)) {
\r
128 cal.add(q,addSet.get(q));
\r
132 fromDate = cal.getTime();
\r
134 fromSet = new CalendarFieldsSet();
\r
135 fromSet.parseFrom(date);
\r
140 StringBuffer output = new StringBuffer();
\r
142 FieldPosition pos = new FieldPosition(0);
\r
144 output = format.format(fromDate, output, pos);
\r
146 fromSet.setOnCalendar(cal);
\r
147 format.format(cal, output, pos);
\r
150 if(output.toString().equals(str)) {
\r
151 logln(caseString + " Success - strings match: " + output);
\r
153 errln(caseString + " FAIL: got " + output + " expected " + str);
\r
157 ParsePosition pos = new ParsePosition(0);
\r
158 format.parse(str, cal, pos);
\r
160 Date gotDate = cal.getTime();
\r
161 if(gotDate.equals(fromDate)) {
\r
162 logln(caseString + " SUCCESS: got=parse="+str);
\r
164 errln(caseString + " FAIL: parsed " + str + " but got " +
\r
165 basicFmt.format(gotDate) + " - " + gotDate + " expected " +
\r
166 basicFmt.format(fromDate));
\r
169 CalendarFieldsSet diffSet = new CalendarFieldsSet();
\r
170 if(!fromSet.matches(cal, diffSet)) {
\r
171 String diffs = diffSet.diffFrom(fromSet);
\r
172 errln(caseString + " FAIL: differences: " + diffs);
\r
174 logln(caseString + " SUCCESS: got=parse: " + str + " - " + fromSet.toString());
\r