ICU-4567 DataDrivenCalendarTest for J
X-SVN-Rev: 22348
This commit is contained in:
parent
1df115616d
commit
7849815922
3
.gitattributes
vendored
3
.gitattributes
vendored
@ -205,6 +205,7 @@ icu4j/src/com/ibm/icu/charset/CharsetUTF7.java -text
|
|||||||
icu4j/src/com/ibm/icu/dev/data/rbbi/english.dict -text
|
icu4j/src/com/ibm/icu/dev/data/rbbi/english.dict -text
|
||||||
icu4j/src/com/ibm/icu/dev/data/testdata.jar -text
|
icu4j/src/com/ibm/icu/dev/data/testdata.jar -text
|
||||||
icu4j/src/com/ibm/icu/dev/data/thai6.ucs -text
|
icu4j/src/com/ibm/icu/dev/data/thai6.ucs -text
|
||||||
|
icu4j/src/com/ibm/icu/dev/test/calendar/DataDrivenCalendarTest.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/calendar/IndianTest.java -text
|
icu4j/src/com/ibm/icu/dev/test/calendar/IndianTest.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/duration/DataReadWriteTest.java -text
|
icu4j/src/com/ibm/icu/dev/test/duration/DataReadWriteTest.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/duration/ICUDurationTest.java -text
|
icu4j/src/com/ibm/icu/dev/test/duration/ICUDurationTest.java -text
|
||||||
@ -293,9 +294,11 @@ icu4j/src/com/ibm/icu/dev/test/serializable/data/ICU_3.6/com.ibm.icu.util.TimeZo
|
|||||||
icu4j/src/com/ibm/icu/dev/test/serializable/data/ICU_3.6/com.ibm.icu.util.ULocale.dat -text
|
icu4j/src/com/ibm/icu/dev/test/serializable/data/ICU_3.6/com.ibm.icu.util.ULocale.dat -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/serializable/data/ICU_3.6/com.ibm.icu.util.UResourceTypeMismatchException.dat -text
|
icu4j/src/com/ibm/icu/dev/test/serializable/data/ICU_3.6/com.ibm.icu.util.UResourceTypeMismatchException.dat -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/timezone/TimeZoneRuleTest.java -text
|
icu4j/src/com/ibm/icu/dev/test/timezone/TimeZoneRuleTest.java -text
|
||||||
|
icu4j/src/com/ibm/icu/dev/test/util/CalendarFieldsSet.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/util/DebugUtilities.java -text
|
icu4j/src/com/ibm/icu/dev/test/util/DebugUtilities.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/util/DebugUtilitiesData.java -text
|
icu4j/src/com/ibm/icu/dev/test/util/DebugUtilitiesData.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/util/DebugUtilitiesTest.java -text
|
icu4j/src/com/ibm/icu/dev/test/util/DebugUtilitiesTest.java -text
|
||||||
|
icu4j/src/com/ibm/icu/dev/test/util/FieldsSet.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/test/util/PrettyPrinter.java -text
|
icu4j/src/com/ibm/icu/dev/test/util/PrettyPrinter.java -text
|
||||||
icu4j/src/com/ibm/icu/dev/tool/docs/icu4j28.api.gz -text
|
icu4j/src/com/ibm/icu/dev/tool/docs/icu4j28.api.gz -text
|
||||||
icu4j/src/com/ibm/icu/dev/tool/docs/icu4j30.api.gz -text
|
icu4j/src/com/ibm/icu/dev/tool/docs/icu4j30.api.gz -text
|
||||||
|
@ -23,7 +23,7 @@ import com.ibm.icu.dev.test.TestDataModule.TestData;
|
|||||||
* Tests can implement this if they make extensive use of information in a
|
* Tests can implement this if they make extensive use of information in a
|
||||||
* TestDataModule.
|
* TestDataModule.
|
||||||
*
|
*
|
||||||
* Subclasses can allow for test methods that don't use data from the modeul by
|
* Subclasses can allow for test methods that don't use data from the module by
|
||||||
* overriding validateMethod to return true for these methods. Tests are also
|
* overriding validateMethod to return true for these methods. Tests are also
|
||||||
* free to instantiate their own modules and run from them, though care should
|
* free to instantiate their own modules and run from them, though care should
|
||||||
* be taken not to interfere with the methods in this class.
|
* be taken not to interfere with the methods in this class.
|
||||||
|
@ -405,7 +405,14 @@ class ResourceModule implements TestDataModule {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getString(String key) {
|
public String getString(String key) {
|
||||||
return (String)theMap.get(key);
|
Object o = theMap.get(key);
|
||||||
|
UResourceBundle rb;
|
||||||
|
if(o instanceof UResourceBundle) {
|
||||||
|
// unpack ResourceBundle strings
|
||||||
|
rb = (UResourceBundle)o;
|
||||||
|
return rb.getString();
|
||||||
|
}
|
||||||
|
return (String)o;
|
||||||
}
|
}
|
||||||
public Object getObject(String key) {
|
public Object getObject(String key) {
|
||||||
return theMap.get(key);
|
return theMap.get(key);
|
||||||
|
@ -0,0 +1,268 @@
|
|||||||
|
/*
|
||||||
|
*******************************************************************************
|
||||||
|
* Copyright (C) 2007, International Business Machines Corporation and *
|
||||||
|
* others. All Rights Reserved. *
|
||||||
|
*******************************************************************************
|
||||||
|
*/
|
||||||
|
package com.ibm.icu.dev.test.calendar;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import com.ibm.icu.dev.test.ModuleTest;
|
||||||
|
import com.ibm.icu.dev.test.TestDataModule;
|
||||||
|
import com.ibm.icu.dev.test.TestDataModule.DataMap;
|
||||||
|
import com.ibm.icu.dev.test.util.CalendarFieldsSet;
|
||||||
|
import com.ibm.icu.text.DateFormat;
|
||||||
|
import com.ibm.icu.text.SimpleDateFormat;
|
||||||
|
import com.ibm.icu.util.Calendar;
|
||||||
|
import com.ibm.icu.util.ULocale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author srl
|
||||||
|
*
|
||||||
|
* analog of dadrcal.cpp
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DataDrivenCalendarTest extends ModuleTest {
|
||||||
|
|
||||||
|
public DataDrivenCalendarTest() {
|
||||||
|
super("com/ibm/icu/dev/data/testdata/", "calendar");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see com.ibm.icu.dev.test.ModuleTest#processModules()
|
||||||
|
*/
|
||||||
|
public void processModules() {
|
||||||
|
//String testName = t.getName().toString();
|
||||||
|
|
||||||
|
for (Iterator siter = t.getSettingsIterator(); siter.hasNext();) {
|
||||||
|
// Iterate through and get each of the test case to process
|
||||||
|
DataMap settings = (DataMap) siter.next();
|
||||||
|
|
||||||
|
String type = settings.getString("Type");
|
||||||
|
|
||||||
|
if(type.equals("convert_fwd")) {
|
||||||
|
testConvert(t, settings, true);
|
||||||
|
} else if(type.equals("convert_rev")) {
|
||||||
|
testConvert(t, settings, false);
|
||||||
|
} else if(type.equals("ops")) {
|
||||||
|
testOps(t, settings);
|
||||||
|
} else {
|
||||||
|
errln("Unknown type: " + type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void testConvert(String caseString,
|
||||||
|
CalendarFieldsSet fromSet, Calendar fromCalendar,
|
||||||
|
CalendarFieldsSet toSet, Calendar toCalendar, boolean forward) {
|
||||||
|
String thisString = caseString+(forward ? "forward"
|
||||||
|
: "reverse")+" "+fromCalendar.getType()+"->"+toCalendar.getType()+" ";
|
||||||
|
|
||||||
|
fromCalendar.clear();
|
||||||
|
|
||||||
|
fromSet.setOnCalendar(fromCalendar);
|
||||||
|
|
||||||
|
CalendarFieldsSet diffSet = new CalendarFieldsSet();
|
||||||
|
|
||||||
|
diffSet.clear();
|
||||||
|
// Is the calendar sane at the first?
|
||||||
|
if (!fromSet.matches(fromCalendar, diffSet)) {
|
||||||
|
String diffs = diffSet.diffFrom(fromSet);
|
||||||
|
errln((String)"FAIL: "+thisString
|
||||||
|
+", SOURCE calendar was not set: Differences: "+ diffs);
|
||||||
|
} else {
|
||||||
|
logln("PASS: "+thisString+" SOURCE calendar match.");
|
||||||
|
}
|
||||||
|
|
||||||
|
//logln("Set Source calendar: " + from);
|
||||||
|
|
||||||
|
Date fromTime = fromCalendar.getTime();
|
||||||
|
|
||||||
|
diffSet.clear();
|
||||||
|
// Is the calendar sane after being set?
|
||||||
|
if (!fromSet.matches(fromCalendar, diffSet)) {
|
||||||
|
String diffs = diffSet.diffFrom(fromSet);
|
||||||
|
errln((String)"FAIL: "+thisString
|
||||||
|
+", SET SOURCE calendar was not set: Differences: "+ diffs);
|
||||||
|
} else {
|
||||||
|
logln("PASS: "+thisString+" SET SOURCE calendar match.");
|
||||||
|
}
|
||||||
|
|
||||||
|
toCalendar.clear();
|
||||||
|
toCalendar.setTime(fromTime);
|
||||||
|
|
||||||
|
diffSet.clear();
|
||||||
|
if (!toSet.matches(toCalendar, diffSet)) {
|
||||||
|
String diffs = diffSet.diffFrom(toSet);
|
||||||
|
errln((String)"FAIL: "+thisString+", Differences: "+ diffs);
|
||||||
|
DateFormat fmt = new SimpleDateFormat(new String("EEE MMM dd yyyy G"));
|
||||||
|
String fromString = fmt.format(fromTime);
|
||||||
|
logln("Source Time: "+fromString+", Source Calendar: "
|
||||||
|
+fromCalendar.getType());
|
||||||
|
} else {
|
||||||
|
logln("PASS: "+thisString+" match.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void testConvert(TestDataModule.TestData testData, DataMap settings, boolean forward) {
|
||||||
|
Calendar toCalendar= null;
|
||||||
|
// build to calendar
|
||||||
|
String testSetting = settings.getString("ToCalendar");
|
||||||
|
ULocale loc = new ULocale(testSetting);
|
||||||
|
toCalendar = Calendar.getInstance(loc);
|
||||||
|
CalendarFieldsSet fromSet = new CalendarFieldsSet(), toSet = new CalendarFieldsSet();
|
||||||
|
// DateFormat fmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee");
|
||||||
|
// Start the processing
|
||||||
|
int n = 0;
|
||||||
|
for (Iterator iter = testData.getDataIterator(); iter.hasNext();) {
|
||||||
|
++n;
|
||||||
|
DataMap currentCase = (DataMap) iter.next();
|
||||||
|
|
||||||
|
String caseString = "["+testData.getName()+"#"+n+" "+"]";
|
||||||
|
String locale = testSetting = currentCase.getString("locale");
|
||||||
|
ULocale fromLoc = new ULocale(testSetting);
|
||||||
|
Calendar fromCalendar = Calendar.getInstance(fromLoc);
|
||||||
|
|
||||||
|
fromSet.clear();
|
||||||
|
toSet.clear();
|
||||||
|
|
||||||
|
String from = currentCase.getString("from");
|
||||||
|
fromSet.parseFrom(from);
|
||||||
|
String to = currentCase.getString("to");
|
||||||
|
toSet.parseFrom(to, fromSet);
|
||||||
|
|
||||||
|
// now, do it.
|
||||||
|
if (forward) {
|
||||||
|
logln(caseString +" "+locale+"/"+from+" >>> "+loc+"/"
|
||||||
|
+to);
|
||||||
|
testConvert(caseString, fromSet, fromCalendar, toSet, toCalendar, forward);
|
||||||
|
} else {
|
||||||
|
logln(caseString +" "+locale+"/"+from+" <<< "+loc+"/"
|
||||||
|
+to);
|
||||||
|
testConvert(caseString, toSet, toCalendar, fromSet, fromCalendar, forward);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String kADD = "add";
|
||||||
|
private static final String kROLL = "roll";
|
||||||
|
|
||||||
|
private void testOps(TestDataModule.TestData testData, DataMap settings) {
|
||||||
|
// Get 'from' time
|
||||||
|
CalendarFieldsSet fromSet = new CalendarFieldsSet(), toSet = new CalendarFieldsSet(), paramsSet = new CalendarFieldsSet(), diffSet = new CalendarFieldsSet();
|
||||||
|
// DateFormat fmt = new SimpleDateFormat("EEE MMM dd yyyy / YYYY'-W'ww-ee");
|
||||||
|
// Start the processing
|
||||||
|
int n = 0;
|
||||||
|
for (Iterator iter = testData.getDataIterator(); iter.hasNext();) {
|
||||||
|
++n;
|
||||||
|
DataMap currentCase = (DataMap) iter.next();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
String caseString = "[case "+n+"]";
|
||||||
|
// build to calendar
|
||||||
|
// Headers { "locale","from","operation","params","to" }
|
||||||
|
// #1 locale
|
||||||
|
String param = "locale";
|
||||||
|
String locale;
|
||||||
|
String testSetting = currentCase.getString(param);
|
||||||
|
locale = testSetting;
|
||||||
|
ULocale loc = new ULocale(locale);
|
||||||
|
Calendar fromCalendar = Calendar.getInstance(loc);
|
||||||
|
|
||||||
|
fromSet.clear();
|
||||||
|
// #2 'from' info
|
||||||
|
param = "from";
|
||||||
|
String from = testSetting=currentCase.getString(param);
|
||||||
|
fromSet.parseFrom(testSetting);
|
||||||
|
// System.err.println("fromset: ["+testSetting+"] >> " + fromSet);
|
||||||
|
|
||||||
|
// #4 'operation' info
|
||||||
|
param = "operation";
|
||||||
|
String operation = testSetting=currentCase.getString(param);
|
||||||
|
paramsSet.clear();
|
||||||
|
// #3 'params' info
|
||||||
|
param = "params";
|
||||||
|
String paramsData = testSetting = currentCase.getString(param);
|
||||||
|
paramsSet.parseFrom(paramsData); // parse with inheritance.
|
||||||
|
// System.err.println("paramsSet: ["+testSetting+"] >> " + paramsSet);
|
||||||
|
|
||||||
|
toSet.clear();
|
||||||
|
// #4 'to' info
|
||||||
|
param = "to";
|
||||||
|
String to = testSetting=currentCase.getString(param);
|
||||||
|
toSet.parseFrom(testSetting, fromSet); // parse with inheritance.
|
||||||
|
// System.err.println("toSet: ["+testSetting+"] >> " + toSet);
|
||||||
|
|
||||||
|
String caseContentsString = locale+": from "+from+": "
|
||||||
|
+operation +" [[[ "+paramsSet+" ]]] >>> "+to;
|
||||||
|
logln(caseString+": "+caseContentsString);
|
||||||
|
|
||||||
|
// ------
|
||||||
|
// now, do it.
|
||||||
|
|
||||||
|
/// prepare calendar
|
||||||
|
fromSet.setOnCalendar(fromCalendar);
|
||||||
|
|
||||||
|
// from calendar: 'starting date'
|
||||||
|
|
||||||
|
diffSet.clear();
|
||||||
|
|
||||||
|
// Is the calendar sane after being set?
|
||||||
|
if (!fromSet.matches(fromCalendar, diffSet)) {
|
||||||
|
String diffs = diffSet.diffFrom(fromSet);
|
||||||
|
errln((String)"FAIL: "+caseString
|
||||||
|
+", SET SOURCE calendar was not set: Differences: "+ diffs);
|
||||||
|
} else {
|
||||||
|
logln(" "+caseString+" SET SOURCE calendar match."); // verifies that the requested fields were set.
|
||||||
|
}
|
||||||
|
|
||||||
|
// to calendar - copy of from calendar
|
||||||
|
Calendar toCalendar = (Calendar)fromCalendar.clone();
|
||||||
|
|
||||||
|
/// perform op on 'to calendar'
|
||||||
|
for (int q=0; q<paramsSet.fieldCount(); q++) {
|
||||||
|
if (paramsSet.isSet(q)) {
|
||||||
|
if (operation.equals(kROLL)) {
|
||||||
|
toCalendar.roll(q,
|
||||||
|
paramsSet.get(q));
|
||||||
|
} else if (operation.equals(kADD)) {
|
||||||
|
toCalendar.add(q,
|
||||||
|
paramsSet.get(q));
|
||||||
|
} else {
|
||||||
|
errln(caseString+ " FAIL: unknown operation "+ operation);
|
||||||
|
}
|
||||||
|
logln(operation + " of "+ paramsSet.get(q));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// now - what's the result?
|
||||||
|
diffSet.clear();
|
||||||
|
|
||||||
|
// toset contains 'expected'
|
||||||
|
|
||||||
|
if (!toSet.matches(toCalendar, diffSet)) {
|
||||||
|
String diffs = diffSet.diffFrom(toSet);
|
||||||
|
errln((String)"FAIL: "+caseString+" - , "+caseContentsString
|
||||||
|
+" Differences: "+ diffs );
|
||||||
|
} else {
|
||||||
|
logln("PASS: "+caseString+" matched! ");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param args
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
new DataDrivenCalendarTest().run(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -29,7 +29,8 @@ public class TestAll extends TestGroup {
|
|||||||
"JapaneseTest",
|
"JapaneseTest",
|
||||||
"ChineseTest",
|
"ChineseTest",
|
||||||
"IndianTest",
|
"IndianTest",
|
||||||
"HolidayTest"
|
"HolidayTest",
|
||||||
|
"DataDrivenCalendarTest"
|
||||||
},
|
},
|
||||||
"Calendars, Holiday, and Astro tests"
|
"Calendars, Holiday, and Astro tests"
|
||||||
);
|
);
|
||||||
|
58
icu4j/src/com/ibm/icu/dev/test/util/CalendarFieldsSet.java
Normal file
58
icu4j/src/com/ibm/icu/dev/test/util/CalendarFieldsSet.java
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
*******************************************************************************
|
||||||
|
* Copyright (C) 2007, International Business Machines Corporation and *
|
||||||
|
* others. All Rights Reserved. *
|
||||||
|
*******************************************************************************
|
||||||
|
*/
|
||||||
|
package com.ibm.icu.dev.test.util;
|
||||||
|
|
||||||
|
import com.ibm.icu.util.Calendar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author srl
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class CalendarFieldsSet extends FieldsSet {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param whichEnum
|
||||||
|
* @param fieldsCount
|
||||||
|
*/
|
||||||
|
public CalendarFieldsSet() {
|
||||||
|
super(DebugUtilitiesData.UCalendarDateFields,-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean matches(Calendar cal, CalendarFieldsSet diffSet) {
|
||||||
|
boolean match = true;
|
||||||
|
for(int i=0;i<fieldCount();i++) {
|
||||||
|
if(isSet(i)) {
|
||||||
|
int calVal = cal.get(i);
|
||||||
|
if(calVal != get(i)) {
|
||||||
|
match = false;
|
||||||
|
diffSet.set(i, calVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return match;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the specified fields on this calendar. Doesn't clear first. Returns any errors the cale
|
||||||
|
*/
|
||||||
|
public void setOnCalendar(Calendar cal) {
|
||||||
|
for(int i=0;i<fieldCount();i++) {
|
||||||
|
if(isSet(i)) {
|
||||||
|
cal.set(i, get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void handleParseValue(FieldsSet inheritFrom, int field, String substr) {
|
||||||
|
if(field == Calendar.MONTH) {
|
||||||
|
parseValueEnum(DebugUtilitiesData.UCalendarMonths, inheritFrom, field, substr);
|
||||||
|
// will fallback to default.
|
||||||
|
} else {
|
||||||
|
parseValueDefault(inheritFrom, field, substr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,10 +9,12 @@ public class DebugUtilitiesData extends Object {
|
|||||||
public static final int UDebugEnumType = 0;
|
public static final int UDebugEnumType = 0;
|
||||||
public static final int UCalendarDateFields = 1;
|
public static final int UCalendarDateFields = 1;
|
||||||
public static final int UCalendarMonths = 2;
|
public static final int UCalendarMonths = 2;
|
||||||
|
public static final int UDateFormatStyle = 3;
|
||||||
public static final String [] TYPES = {
|
public static final String [] TYPES = {
|
||||||
"UDebugEnumType", /* 0 */
|
"UDebugEnumType", /* 0 */
|
||||||
"UCalendarDateFields", /* 1 */
|
"UCalendarDateFields", /* 1 */
|
||||||
"UCalendarMonths", /* 2 */
|
"UCalendarMonths", /* 2 */
|
||||||
|
"UDateFormatStyle", /* 3 */
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final String [][] NAMES = {
|
public static final String [][] NAMES = {
|
||||||
@ -21,6 +23,7 @@ public class DebugUtilitiesData extends Object {
|
|||||||
"UDebugEnumType", /* 0 */
|
"UDebugEnumType", /* 0 */
|
||||||
"UCalendarDateFields", /* 1 */
|
"UCalendarDateFields", /* 1 */
|
||||||
"UCalendarMonths", /* 2 */
|
"UCalendarMonths", /* 2 */
|
||||||
|
"UDateFormatStyle", /* 3 */
|
||||||
},
|
},
|
||||||
/* UCalendarDateFields, 1 */
|
/* UCalendarDateFields, 1 */
|
||||||
{
|
{
|
||||||
@ -63,6 +66,13 @@ public class DebugUtilitiesData extends Object {
|
|||||||
"DECEMBER", /* 11 */
|
"DECEMBER", /* 11 */
|
||||||
"UNDECIMBER", /* 12 */
|
"UNDECIMBER", /* 12 */
|
||||||
},
|
},
|
||||||
|
/* UDateFormatStyle, 3 */
|
||||||
|
{
|
||||||
|
"FULL", /* 0 */
|
||||||
|
"LONG", /* 1 */
|
||||||
|
"MEDIUM", /* 2 */
|
||||||
|
"SHORT", /* 3 */
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final int [][] VALUES = {
|
public static final int [][] VALUES = {
|
||||||
@ -71,6 +81,7 @@ public class DebugUtilitiesData extends Object {
|
|||||||
0, /* UDebugEnumType */
|
0, /* UDebugEnumType */
|
||||||
1, /* UCalendarDateFields */
|
1, /* UCalendarDateFields */
|
||||||
2, /* UCalendarMonths */
|
2, /* UCalendarMonths */
|
||||||
|
3, /* UDateFormatStyle */
|
||||||
},
|
},
|
||||||
/* UCalendarDateFields, 1 */
|
/* UCalendarDateFields, 1 */
|
||||||
{
|
{
|
||||||
@ -113,6 +124,13 @@ public class DebugUtilitiesData extends Object {
|
|||||||
com.ibm.icu.util.Calendar.DECEMBER, /* 11 */
|
com.ibm.icu.util.Calendar.DECEMBER, /* 11 */
|
||||||
com.ibm.icu.util.Calendar.UNDECIMBER, /* 12 */
|
com.ibm.icu.util.Calendar.UNDECIMBER, /* 12 */
|
||||||
},
|
},
|
||||||
|
/* UDateFormatStyle, 3 */
|
||||||
|
{
|
||||||
|
0, /* FULL */
|
||||||
|
1, /* LONG */
|
||||||
|
2, /* MEDIUM */
|
||||||
|
3, /* SHORT */
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
238
icu4j/src/com/ibm/icu/dev/test/util/FieldsSet.java
Normal file
238
icu4j/src/com/ibm/icu/dev/test/util/FieldsSet.java
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
*******************************************************************************
|
||||||
|
* Copyright (C) 2007, International Business Machines Corporation and *
|
||||||
|
* others. All Rights Reserved. *
|
||||||
|
*******************************************************************************
|
||||||
|
*/
|
||||||
|
package com.ibm.icu.dev.test.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author srl
|
||||||
|
*
|
||||||
|
* analog of FieldsSet in C++
|
||||||
|
*/
|
||||||
|
public class FieldsSet {
|
||||||
|
public static final int NO_ENUM = -1;
|
||||||
|
|
||||||
|
protected FieldsSet(int whichEnum, int fieldsCount) {
|
||||||
|
if (fieldsCount <= 0 && whichEnum != NO_ENUM) {
|
||||||
|
fieldsCount = DebugUtilities.enumCount(whichEnum);
|
||||||
|
}
|
||||||
|
fEnum = whichEnum;
|
||||||
|
fFieldsCount = fieldsCount;
|
||||||
|
if(fieldsCount<0) {
|
||||||
|
throw new InternalError("Preposterous field count " + fieldsCount);
|
||||||
|
}
|
||||||
|
fValues = new int[fFieldsCount];
|
||||||
|
fIsSet = new boolean[fFieldsCount];
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int fEnum = NO_ENUM;
|
||||||
|
|
||||||
|
protected int fFieldsCount = 0;
|
||||||
|
|
||||||
|
protected int fValues[] = null;
|
||||||
|
|
||||||
|
protected boolean fIsSet[] = null;
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
for (int i = 0; i < fFieldsCount; i++) {
|
||||||
|
clear(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear(int field) {
|
||||||
|
fValues[field] = -1;
|
||||||
|
fIsSet[field] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(int field, int amount) {
|
||||||
|
fValues[field] = amount;
|
||||||
|
fIsSet[field] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSet(int field) {
|
||||||
|
return fIsSet[field];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int get(int field) {
|
||||||
|
if (fIsSet[field]) {
|
||||||
|
return fValues[field];
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSameType(FieldsSet other) {
|
||||||
|
return ((other.fEnum == fEnum) && (other.fFieldsCount == fFieldsCount));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int fieldCount() {
|
||||||
|
return fFieldsCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param other "expected" set to match against
|
||||||
|
* @return a formatted string listing which fields are set in this, with the
|
||||||
|
* comparison made agaainst those fields in other, or, 'null' if there is no difference.
|
||||||
|
*/
|
||||||
|
public String diffFrom(FieldsSet other) {
|
||||||
|
StringBuffer str = new StringBuffer();
|
||||||
|
if(!isSameType(other)) {
|
||||||
|
throw new IllegalArgumentException("U_ILLEGAL_ARGUMENT_ERROR: FieldsSet of a different type!");
|
||||||
|
}
|
||||||
|
for (int i=0; i<fieldCount(); i++) {
|
||||||
|
if (isSet(i)) {
|
||||||
|
int myVal = get(i);
|
||||||
|
int theirVal = other.get(i);
|
||||||
|
|
||||||
|
if(fEnum != NO_ENUM) {
|
||||||
|
String fieldName = DebugUtilities.enumString(fEnum, i);
|
||||||
|
|
||||||
|
String aval = Integer.toString(myVal);
|
||||||
|
String bval = Integer.toString(theirVal);
|
||||||
|
|
||||||
|
str.append(fieldName +"="+aval+" not "+bval+", ");
|
||||||
|
} else {
|
||||||
|
str.append(Integer.toString(i) + "=" + myVal+" not " + theirVal+", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(str.length()==0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return str.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param str string to parse
|
||||||
|
* @param status formatted string for status
|
||||||
|
*/
|
||||||
|
public int parseFrom(String str) {
|
||||||
|
return parseFrom(str, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int parseFrom(String str, FieldsSet inheritFrom) {
|
||||||
|
int goodFields = 0;
|
||||||
|
|
||||||
|
String[] fields = str.split(",");
|
||||||
|
for(int i=0;i<fields.length;i++) {
|
||||||
|
String fieldStr = fields[i];
|
||||||
|
String kv[] = fieldStr.split("=");
|
||||||
|
if(kv.length < 1 || kv.length > 2) {
|
||||||
|
throw new InternalError("split around '=' failed: " + fieldStr);
|
||||||
|
}
|
||||||
|
String key = kv[0];
|
||||||
|
String value = "";
|
||||||
|
if(kv.length>1) {
|
||||||
|
value = kv[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
int field = handleParseName(inheritFrom, key, value);
|
||||||
|
if(field != -1) {
|
||||||
|
handleParseValue(inheritFrom, field, value);
|
||||||
|
goodFields++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return goodFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback interface for subclass. This function is called when parsing a
|
||||||
|
* field name, such as "MONTH" in "MONTH=4". Base implementation is to
|
||||||
|
* lookup the enum value using udbg_* utilities, or else as an integer if
|
||||||
|
* enum is not available.
|
||||||
|
*
|
||||||
|
* If there is a special directive, the implementer can catch it here and
|
||||||
|
* return -1 after special processing completes.
|
||||||
|
*
|
||||||
|
* @param inheritFrom the set inheriting from - may be null.
|
||||||
|
* @param name the field name (key side)
|
||||||
|
* @param substr the string in question (value side)
|
||||||
|
* @param status error status - set to error for failure.
|
||||||
|
* @return field number, or negative if field should be skipped.
|
||||||
|
*/
|
||||||
|
protected int handleParseName(FieldsSet inheritFrom, String name,
|
||||||
|
String substr) {
|
||||||
|
int field = -1;
|
||||||
|
if(fEnum != NO_ENUM) {
|
||||||
|
field = DebugUtilities.enumByString(fEnum, name);
|
||||||
|
}
|
||||||
|
if(field < 0) {
|
||||||
|
field = Integer.parseInt(name);
|
||||||
|
}
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback interface for subclass. Base implementation is to call
|
||||||
|
* parseValueDefault(...)
|
||||||
|
*
|
||||||
|
* @param inheritFrom the set inheriting from - may be null.
|
||||||
|
* @param field which field is being parsed
|
||||||
|
* @param substr the string in question (value side)
|
||||||
|
* @param status error status - set to error for failure.
|
||||||
|
* @see parseValueDefault
|
||||||
|
*/
|
||||||
|
protected void handleParseValue(FieldsSet inheritFrom, int field,
|
||||||
|
String substr) {
|
||||||
|
parseValueDefault(inheritFrom, field, substr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the default implementation for handleParseValue. Base implementation is
|
||||||
|
* to parse a decimal integer value, or inherit from inheritFrom if the
|
||||||
|
* string is 0-length. Implementations of this function should call
|
||||||
|
* set(field,...) on successful parse.
|
||||||
|
*
|
||||||
|
* @see handleParseValue
|
||||||
|
*/
|
||||||
|
protected void parseValueDefault(FieldsSet inheritFrom, int field,
|
||||||
|
String substr) {
|
||||||
|
if(substr.length()==0) {
|
||||||
|
if(inheritFrom == null) {
|
||||||
|
throw new InternalError("Trying to inherit from field " + field + " but inheritFrom is null");
|
||||||
|
}
|
||||||
|
if(!inheritFrom.isSet(field)) {
|
||||||
|
throw new InternalError("Trying to inherit from field " + field + " but inheritFrom["+field+"] is not set");
|
||||||
|
}
|
||||||
|
set(field,inheritFrom.get(field));
|
||||||
|
} else {
|
||||||
|
int value = Integer.parseInt(substr);
|
||||||
|
set(field, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* convenience implementation for handleParseValue attempt to load a value
|
||||||
|
* from an enum value using udbg_enumByString() if fails, will call
|
||||||
|
* parseValueDefault()
|
||||||
|
*
|
||||||
|
* @see handleParseValue
|
||||||
|
*/
|
||||||
|
protected void parseValueEnum(int type, FieldsSet inheritFrom, int field,
|
||||||
|
String substr) {
|
||||||
|
int value = DebugUtilities.enumByString(type, substr);
|
||||||
|
if(value>=0) {
|
||||||
|
set(field,value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
parseValueDefault(inheritFrom, field, substr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String fieldName(int field) {
|
||||||
|
return (fEnum!=NO_ENUM)?DebugUtilities.enumString(fEnum, field):Integer.toString(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
String str = getClass().getName()+" ["+fFieldsCount+","+(fEnum!=NO_ENUM?DebugUtilities.typeString(fEnum):fEnum)+"]: ";
|
||||||
|
for(int i=0;i<fFieldsCount;i++) {
|
||||||
|
if(isSet(i)) {
|
||||||
|
str = str + fieldName(i)+"="+get(i)+",";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user