]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/tests/core/src/com/ibm/icu/dev/test/format/DataDrivenFormatTest.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / tests / core / src / com / ibm / icu / dev / test / format / DataDrivenFormatTest.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2007-2008, International Business Machines Corporation and         *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.test.format;\r
8 \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
13 \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
23 \r
24 /**\r
25  * @author srl\r
26  *\r
27  */\r
28 public class DataDrivenFormatTest extends ModuleTest {\r
29 \r
30     /**\r
31      * @param baseName\r
32      * @param locName\r
33      */\r
34     public DataDrivenFormatTest() {\r
35         super("com/ibm/icu/dev/data/testdata/", "format");\r
36     }\r
37 \r
38     /* (non-Javadoc)\r
39      * @see com.ibm.icu.dev.test.ModuleTest#processModules()\r
40      */\r
41     public void processModules() {\r
42         //String testName = t.getName().toString();\r
43 \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
47             \r
48             String type = settings.getString("Type");\r
49 \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
54             } else {\r
55                 errln("Unknown type: " + type);\r
56             }\r
57         }\r
58     }\r
59 \r
60     /**\r
61      * @param args\r
62      */\r
63     public static void main(String[] args) {\r
64          new DataDrivenFormatTest().run(args);\r
65     }\r
66    \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
71     \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
74 \r
75         int n = 0;\r
76         for (Iterator iter = testData.getDataIterator(); iter.hasNext();) {\r
77             ++n;\r
78             long now = System.currentTimeMillis();\r
79             DataMap currentCase = (DataMap) iter.next();\r
80             String caseString = "["+testData.getName()+"#"+n+(fmt?"format":"parse")+"]";\r
81             \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
86             \r
87             Date fromDate = null;\r
88             boolean useDate = false;\r
89             \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
96             \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
102             } else {\r
103                 styleSet = new DateTimeStyleSet();\r
104                 styleSet.parseFrom(spec);\r
105                 format = DateFormat.getDateTimeInstance(styleSet.getDateStyle(), styleSet.getTimeStyle(), loc);\r
106             }\r
107 \r
108             Calendar cal = Calendar.getInstance(loc);\r
109             \r
110             // parse 'date' - either 'MILLIS=12345' or  a CalendarFieldsSet\r
111             if(date.startsWith(kMILLIS)) {\r
112                 useDate = true;\r
113                 fromDate = new Date(Long.parseLong(date.substring(kMILLIS.length())));\r
114             } else if(date.startsWith(kRELATIVE_MILLIS)) {\r
115                 useDate = true;\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
121                 useDate = true;\r
122                 cal.clear();\r
123                 cal.setTimeInMillis(now);\r
124 \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
129                     }\r
130                 }\r
131 \r
132                 fromDate = cal.getTime();\r
133             } else {\r
134                 fromSet = new CalendarFieldsSet();\r
135                 fromSet.parseFrom(date);\r
136             }\r
137             \r
138             // run the test\r
139             if(fmt) {\r
140                 StringBuffer output = new StringBuffer();\r
141                 cal.clear();\r
142                 FieldPosition pos = new FieldPosition(0);\r
143                 if(useDate) {\r
144                     output = format.format(fromDate, output, pos);\r
145                 } else {\r
146                     fromSet.setOnCalendar(cal);\r
147                     format.format(cal, output, pos);\r
148                 }\r
149                 \r
150                 if(output.toString().equals(str)) {\r
151                     logln(caseString + " Success - strings match: " + output);\r
152                 } else {\r
153                     errln(caseString + " FAIL: got " + output + " expected " + str);\r
154                 }\r
155             } else { // parse\r
156                 cal.clear();\r
157                 ParsePosition pos = new ParsePosition(0);\r
158                 format.parse(str, cal, pos);\r
159                 if(useDate) {\r
160                     Date gotDate = cal.getTime(); \r
161                     if(gotDate.equals(fromDate)) {\r
162                         logln(caseString + " SUCCESS: got=parse="+str);\r
163                     } else {\r
164                         errln(caseString + " FAIL: parsed " + str + " but got " + \r
165                                 basicFmt.format(gotDate) + " - " + gotDate + "  expected " + \r
166                                 basicFmt.format(fromDate));\r
167                     }\r
168                 } else  {\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
173                     } else {\r
174                         logln(caseString + " SUCCESS: got=parse: " + str + " - " + fromSet.toString());\r
175                     }\r
176                 }\r
177             }\r
178         }\r
179     }\r
180 }\r