1 /* GENERATED SOURCE. DO NOT MODIFY. */ 2 // 2016 and later: Unicode, Inc. and others. 3 // License & terms of use: http://www.unicode.org/copyright.html#License 4 /* 5 ******************************************************************************* 6 * Copyright (C) 2007-2012, International Business Machines Corporation and * 7 * others. All Rights Reserved. * 8 ******************************************************************************* 9 */ 10 package android.icu.dev.test.format; 11 12 import java.text.FieldPosition; 13 import java.text.ParsePosition; 14 import java.util.Date; 15 import java.util.Iterator; 16 import java.util.List; 17 18 import org.junit.Test; 19 import org.junit.runner.RunWith; 20 21 import android.icu.dev.test.ModuleTest; 22 import android.icu.dev.test.ModuleTest.TestDataPair; 23 import android.icu.dev.test.TestDataModule; 24 import android.icu.dev.test.TestDataModule.DataMap; 25 import android.icu.dev.test.TestDataModule.TestData; 26 import android.icu.dev.test.TestFmwk; 27 import android.icu.dev.test.util.CalendarFieldsSet; 28 import android.icu.dev.test.util.DateTimeStyleSet; 29 import android.icu.text.DateFormat; 30 import android.icu.text.SimpleDateFormat; 31 import android.icu.util.Calendar; 32 import android.icu.util.TimeZone; 33 import android.icu.util.ULocale; 34 35 import junitparams.JUnitParamsRunner; 36 import junitparams.Parameters; 37 38 /** 39 * @author srl 40 * @author sgill 41 * 42 */ 43 @RunWith(JUnitParamsRunner.class) 44 public class DataDrivenFormatTest extends TestFmwk { 45 46 /** 47 * @param baseName 48 * @param locName 49 */ 50 public DataDrivenFormatTest() { 51 //super("com/ibm/icu/dev/data/testdata/", "format"); 52 } 53 54 @SuppressWarnings("unused") 55 private List<TestDataPair> getTestData() throws Exception { 56 return ModuleTest.getTestData("android/icu/dev/data/testdata/", "format"); 57 } 58 59 /* (non-Javadoc) 60 * @see android.icu.dev.test.ModuleTest#processModules() 61 */ 62 @Test 63 @Parameters(method="getTestData") 64 public void formatTest(TestDataPair pair) { 65 TestData td = pair.td; 66 DataMap settings = pair.dm; 67 68 69 String type = settings.getString("Type"); 70 71 if(type.equals("date_format")) { 72 testConvertDate(td, settings, true); 73 } else if(type.equals("date_parse")) { 74 testConvertDate(td, settings, false); 75 } else { 76 errln("Unknown type: " + type); 77 } 78 } 79 80 81 private static final String kPATTERN = "PATTERN="; 82 private static final String kMILLIS = "MILLIS="; 83 private static final String kRELATIVE_MILLIS = "RELATIVE_MILLIS="; 84 private static final String kRELATIVE_ADD = "RELATIVE_ADD:"; 85 86 private void testConvertDate(TestDataModule.TestData testData, DataMap settings, boolean fmt) { 87 DateFormat basicFmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee"); 88 89 int n = 0; 90 for (Iterator iter = testData.getDataIterator(); iter.hasNext();) { 91 ++n; 92 long now = System.currentTimeMillis(); 93 DataMap currentCase = (DataMap) iter.next(); 94 String caseString = "["+testData.getName()+"#"+n+(fmt?"format":"parse")+"]"; 95 96 String locale = currentCase.getString("locale"); 97 String zone = currentCase.getString("zone"); 98 String spec = currentCase.getString("spec"); 99 String date = currentCase.getString("date"); 100 String str = currentCase.getString("str"); 101 102 Date fromDate = null; 103 boolean useDate = false; 104 105 ULocale loc = new ULocale(locale); 106 String pattern = null; 107 // boolean usePattern = false; 108 DateFormat format = null; 109 DateTimeStyleSet styleSet; 110 CalendarFieldsSet fromSet = null; 111 112 // parse 'spec' - either 'PATTERN=yy mm dd' or 'DATE=x,TIME=y' 113 if(spec.startsWith(kPATTERN)) { 114 pattern = spec.substring(kPATTERN.length()); 115 // usePattern = true; 116 format = new SimpleDateFormat(pattern, loc); 117 } else { 118 styleSet = new DateTimeStyleSet(); 119 styleSet.parseFrom(spec); 120 format = DateFormat.getDateTimeInstance(styleSet.getDateStyle(), styleSet.getTimeStyle(), loc); 121 } 122 123 Calendar cal = Calendar.getInstance(loc); 124 125 if (zone.length() > 0) { 126 TimeZone tz = TimeZone.getFrozenTimeZone(zone); 127 cal.setTimeZone(tz); 128 format.setTimeZone(tz); 129 } 130 131 // parse 'date' - either 'MILLIS=12345' or a CalendarFieldsSet 132 if(date.startsWith(kMILLIS)) { 133 useDate = true; 134 fromDate = new Date(Long.parseLong(date.substring(kMILLIS.length()))); 135 } else if(date.startsWith(kRELATIVE_MILLIS)) { 136 useDate = true; 137 fromDate = new Date(now+Long.parseLong(date.substring(kRELATIVE_MILLIS.length()))); 138 } else if(date.startsWith(kRELATIVE_ADD)) { 139 String add = date.substring(kRELATIVE_ADD.length()); // "add" is a string indicating which fields to add 140 CalendarFieldsSet addSet = new CalendarFieldsSet(); 141 addSet.parseFrom(add); 142 useDate = true; 143 cal.clear(); 144 cal.setTimeInMillis(now); 145 146 /// perform op on 'to calendar' 147 for (int q=0; q<addSet.fieldCount(); q++) { 148 if (addSet.isSet(q)) { 149 if (q == Calendar.DATE) { 150 cal.add(q,addSet.get(q)); 151 } else { 152 cal.set(q,addSet.get(q)); 153 } 154 } 155 } 156 157 fromDate = cal.getTime(); 158 } else { 159 fromSet = new CalendarFieldsSet(); 160 fromSet.parseFrom(date); 161 } 162 163 // run the test 164 if(fmt) { 165 StringBuffer output = new StringBuffer(); 166 cal.clear(); 167 FieldPosition pos = new FieldPosition(0); 168 if(useDate) { 169 output = format.format(fromDate, output, pos); 170 } else { 171 fromSet.setOnCalendar(cal); 172 format.format(cal, output, pos); 173 } 174 175 if(output.toString().equals(str)) { 176 logln(caseString + " Success - strings match: " + output); 177 } else { 178 errln(caseString + " FAIL: got " + output + " expected " + str); 179 } 180 } else { // parse 181 cal.clear(); 182 ParsePosition pos = new ParsePosition(0); 183 format.parse(str, cal, pos); 184 if(useDate) { 185 Date gotDate = cal.getTime(); 186 if(gotDate.equals(fromDate)) { 187 logln(caseString + " SUCCESS: got=parse="+str); 188 } else { 189 errln(caseString + " FAIL: parsed " + str + " but got " + 190 basicFmt.format(gotDate) + " - " + gotDate + " expected " + 191 basicFmt.format(fromDate)); 192 } 193 } else { 194 CalendarFieldsSet diffSet = new CalendarFieldsSet(); 195 if(!fromSet.matches(cal, diffSet)) { 196 String diffs = diffSet.diffFrom(fromSet); 197 errln(caseString + " FAIL: differences: " + diffs); 198 } else { 199 logln(caseString + " SUCCESS: got=parse: " + str + " - " + fromSet.toString()); 200 } 201 } 202 } 203 } 204 } 205 } 206