ICU-12423 merge in coverage tests for several classes from branches/fabalbon/56-1-test-coverage

X-SVN-Rev: 38601
This commit is contained in:
Markus Scherer 2016-04-05 20:43:46 +00:00
parent 18268b8bae
commit 62c1d90b17
15 changed files with 574 additions and 29 deletions

View File

@ -1,6 +1,6 @@
/*
*******************************************************************************
* Copyright (C) 2009-2014, International Business Machines
* Copyright (C) 2009-2016, International Business Machines
* Corporation and others. All Rights Reserved.
*******************************************************************************
*/
@ -155,9 +155,7 @@ public final class Norm2AllModes {
return isNormalized(s) ? Normalizer.YES : Normalizer.NO;
}
public int getQuickCheck(int c) {
return 1;
}
public abstract int getQuickCheck(int c);
public final Normalizer2Impl impl;
}

View File

@ -1,5 +1,5 @@
/*********************************************************************
* Copyright (C) 2000-2015, International Business Machines Corporation and
* Copyright (C) 2000-2016, International Business Machines Corporation and
* others. All Rights Reserved.
*********************************************************************
*/
@ -713,6 +713,10 @@ public class ChineseTest extends CalendarTest {
// lunar to gregorian
chineseCalendar = new ChineseCalendar(77, 26, Calendar.JANUARY, 0, 6, 0, 0, 0);
// coverage
assertEquals("equivalent ChineseCalendar() constructors", chineseCalendar,
new ChineseCalendar(77, 26, Calendar.JANUARY, 0, 6));
gregorianCalendar = Calendar.getInstance(Locale.US);
gregorianCalendar.setTime(chineseCalendar.getTime());

View File

@ -6,6 +6,7 @@
*/
package com.ibm.icu.dev.test.calendar;
import java.text.FieldPosition;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
@ -15,6 +16,7 @@ import com.ibm.icu.impl.CalendarAstronomer;
import com.ibm.icu.impl.LocaleUtility;
import com.ibm.icu.impl.ZoneMeta;
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.DateFormatSymbols;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.util.BuddhistCalendar;
import com.ibm.icu.util.Calendar;
@ -934,9 +936,24 @@ public class IBMCalendarTest extends CalendarTest {
* For serialization
*/
private static final long serialVersionUID = -4558903444622684759L;
protected int handleGetLimit(int field, int limitType) {return 0;}
protected int handleComputeMonthStart(int eyear, int month, boolean useMonth) {return 0;}
protected int handleGetExtendedYear() {return 0;}
protected int handleGetLimit(int field, int limitType) {
if (limitType == Calendar.LEAST_MAXIMUM) {
return 1;
} else if (limitType == Calendar.GREATEST_MINIMUM) {
return 7;
}
return -1;
}
protected int handleComputeMonthStart(int eyear, int month, boolean useMonth) {
if (useMonth) {
return eyear * 365 + month * 31;
} else {
return eyear * 365;
}
}
protected int handleGetExtendedYear() {return 2017;}
public void run(){
if (Calendar.gregorianPreviousMonthLength(2000,2) != 29){
errln("Year 2000 Feb should have 29 days.");
@ -952,6 +969,37 @@ public class IBMCalendarTest extends CalendarTest {
if (!getType().equals("unknown")){
errln ("Calendar.getType() should be 'unknown'");
}
// Tests for complete coverage of Calendar functions.
int julianDay = Calendar.millisToJulianDay(millis - 1);
assertEquals("Julian max day -1", julianDay, Calendar.MAX_JULIAN - 1);
DateFormat df1 = handleGetDateFormat("GG yyyy-d:MM", "option=xyz", Locale.getDefault());
if (!df1.equals(handleGetDateFormat("GG yyyy-d:MM", "option=xyz", ULocale.getDefault()))){
errln ("Calendar.handleGetDateFormat(String, Locale) should delegate to ( ,ULocale)");
}
// Prove that the local overrides are used.
int leastMsInDay = handleGetLimit(Calendar.MILLISECONDS_IN_DAY, Calendar.LEAST_MAXIMUM);
assertEquals("getLimit test 1", leastMsInDay, 1);
int maxMsInDay = handleGetLimit(Calendar.WEEK_OF_MONTH, Calendar.GREATEST_MINIMUM);
assertEquals("getLimit test 2", 7, maxMsInDay);
int febLeapLength = handleGetMonthLength(2020, Calendar.FEBRUARY);
assertEquals("handleMonthLength", 31, febLeapLength);
int exYear = handleGetExtendedYear();
assertEquals("handleGetExtendeYear", exYear, 2017);
int monthStart = handleComputeMonthStart(2016, 4, false);
assertEquals("handleComputeMonthStart false", 735840, monthStart);
monthStart = handleComputeMonthStart(2016, 4, true);
assertEquals("handleComputeMonthStart true", 735964, monthStart);
Calendar cal = Calendar.getInstance();
cal.set(1980, 5, 2);
this.setTime(cal.getTime());
assertEquals("handleComputeFields: year set", 1980, get(YEAR));
assertEquals("handleComputeFields: month set", 5, get(MONTH));
assertEquals("handleComputeFields: day set", 2, get(DAY_OF_MONTH));
}
}
StubCalendar stub = new StubCalendar();
@ -1882,4 +1930,51 @@ public class IBMCalendarTest extends CalendarTest {
}
}
}
public void TestSimpleDateFormatCoverage() {
class StubSimpleDateFormat extends SimpleDateFormat {
public StubSimpleDateFormat(String pattern, Locale loc) {
new SimpleDateFormat(pattern, loc);
}
public void run(){
Calendar cal = Calendar.getInstance(Locale.US);
cal.clear();
cal.set(2000, Calendar.MARCH, 18, 15, 0, 1); // Sat 15:00
DateFormatSymbols theseSymbols = this.getSymbols();
String shouldBeMonday = theseSymbols.getWeekdays()[Calendar.MONDAY];
assertEquals("Should be Monday", "Monday", shouldBeMonday);
String [] matchData = {"16", "2016", "2016AD", "Monday", "lunes"};
int matchIndex = matchString("Monday March 28, 2016", 0, Calendar.DAY_OF_WEEK, matchData, cal);
assertEquals("matchData for Monday", 6, matchIndex); // Position of the pointer after the matched string.
matchIndex = matchString("Monday March 28, 2016 AD", 17, Calendar.YEAR, matchData, cal);
assertEquals("matchData for 2016", 21, matchIndex); // Position of the pointer after the matched string.
char ch = 'y';
int count = 4;
int beginOffset = 0;
cal.set(Calendar.YEAR, 2000); // Reset this
assertEquals("calendar year reset", 2000, cal.get(Calendar.YEAR));
FieldPosition pos = new FieldPosition(java.text.DateFormat.YEAR_FIELD);
String subFormatResult = subFormat(ch, count, beginOffset,
pos, theseSymbols, cal);
assertEquals("subFormat result", "2000", subFormatResult);
String testParseString = "some text with a date 2017-03-15";
int start = 22;
boolean obeyCount = true;
boolean allowNegative = false;
boolean ambiguousYear[] = {true, false, true};
int subParseResult = subParse(testParseString, start, ch, count,
obeyCount, allowNegative, ambiguousYear, cal);
assertEquals("subParseResult result", 26, subParseResult);
assertEquals("parsed year", 2017, cal.get(Calendar.YEAR));
}
}
StubSimpleDateFormat stub = new StubSimpleDateFormat("EEE MMM dd yyyy G HH:mm:ss.SSS", Locale.US);
stub.run();
}
}

View File

@ -1,7 +1,7 @@
/*
*******************************************************************************
* Copyright (C) 2005-2011, International Business Machines Corporation and *
* others. All Rights Reserved. *
* Copyright (C) 2005-2016, International Business Machines Corporation and
* others. All Rights Reserved.
*******************************************************************************
*/
package com.ibm.icu.dev.test.calendar;
@ -273,4 +273,16 @@ public class IndianTest extends CalendarTest
errln("Incorrect calendar value for year edge test");
}
}
public void TestCoverage12424() {
class StubCalendar extends IndianCalendar {
private static final long serialVersionUID = 1L;
public StubCalendar() {
assertEquals("Indian month 0 length", 30, handleGetMonthLength(1000, 0));
assertEquals("Indian month 2 length", 31, handleGetMonthLength(1000, 2));
}
}
new StubCalendar();
}
}

View File

@ -1,13 +1,14 @@
/*
*******************************************************************************
* Copyright (C) 2012, International Business Machines Corporation and *
* others. All Rights Reserved. *
* Copyright (C) 2012-2016, International Business Machines Corporation and
* others. All Rights Reserved.
*******************************************************************************
*/
package com.ibm.icu.dev.test.calendar;
import java.util.Date;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.PersianCalendar;
import com.ibm.icu.util.ULocale;
public class PersianTest extends CalendarTest {
@ -123,4 +124,19 @@ public class PersianTest extends CalendarTest {
}
}
}
public void TestCoverage12424() {
class StubCalendar extends PersianCalendar {
private static final long serialVersionUID = 1L;
public StubCalendar() {
assertEquals("Persian month 0 length", 31, handleGetMonthLength(1000, 0));
assertEquals("Persian month 7 length", 30, handleGetMonthLength(1000, 7));
int leastWeeks = handleGetLimit(Calendar.WEEK_OF_YEAR, Calendar.LEAST_MAXIMUM);
assertEquals("Persian Week of Year least maximum", 52, leastWeeks);
}
}
new StubCalendar();
}
}

View File

@ -12,6 +12,7 @@ import java.text.FieldPosition;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Map;
import com.ibm.icu.dev.test.TestFmwk;
@ -324,8 +325,7 @@ public class CompactDecimalFormatTest extends TestFmwk {
return;
}
NumberFormat cdf =
CompactDecimalFormat.getInstance(
ULocale.forLanguageTag("ar"), CompactStyle.LONG);
CompactDecimalFormat.getInstance(new Locale("ar"), CompactStyle.LONG);
assertEquals("Arabic Long", "\u200F-\u0665\u066B\u0663 \u0623\u0644\u0641", cdf.format(-5300));
}

View File

@ -1,7 +1,7 @@
/*
*******************************************************************************
* Copyright (C) 2001-2015, International Business Machines Corporation and *
* others. All Rights Reserved. *
* Copyright (C) 2001-2016, International Business Machines Corporation and
* others. All Rights Reserved.
*******************************************************************************
*/
@ -21,9 +21,11 @@ import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import com.ibm.icu.text.CurrencyPluralInfo;
import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.DecimalFormatSymbols;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.util.ULocale;
// This is an API test, not a unit test. It doesn't test very many cases, and doesn't
// try to test the full functionality. It just calls each function in the class and
@ -48,6 +50,9 @@ public class IntlTestDecimalFormatAPIC extends com.ibm.icu.dev.test.TestFmwk {
DecimalFormat def = new DecimalFormat();
final String pattern = new String("#,##0.# FF");
final DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.FRENCH);
final CurrencyPluralInfo infoInput = new CurrencyPluralInfo(ULocale.FRENCH);
DecimalFormat pat = null;
try {
pat = new DecimalFormat(pattern);
@ -55,9 +60,20 @@ public class IntlTestDecimalFormatAPIC extends com.ibm.icu.dev.test.TestFmwk {
errln("ERROR: Could not create DecimalFormat (pattern)");
}
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.FRENCH);
DecimalFormat cust1 = null;
try {
cust1 = new DecimalFormat(pattern, symbols);
} catch (IllegalArgumentException e) {
errln("ERROR: Could not create DecimalFormat (pattern, symbols)");
}
DecimalFormat cust2 = null;
try {
cust2 = new DecimalFormat(pattern, symbols, infoInput, NumberFormat.PLURALCURRENCYSTYLE);
} catch (IllegalArgumentException e) {
errln("ERROR: Could not create DecimalFormat (pattern, symbols, infoInput, style)");
}
DecimalFormat cust1 = new DecimalFormat(pattern, symbols);
// ======= Test clone(), assignment, and equality
@ -187,6 +203,11 @@ public class IntlTestDecimalFormatAPIC extends com.ibm.icu.dev.test.TestFmwk {
String locPat;
locPat = pat.toLocalizedPattern();
logln("Localized pattern is " + locPat);
pat.setCurrencyPluralInfo(infoInput);
if(!infoInput.equals(pat.getCurrencyPluralInfo())) {
errln("ERROR: set/get CurrencyPluralInfo() failed");
}
// ======= Test applyPattern()

View File

@ -1,6 +1,6 @@
/*****************************************************************************************
*
* Copyright (C) 1996-2010, International Business Machines
* Copyright (C) 1996-2016, International Business Machines
* Corporation and others. All Rights Reserved.
**/
@ -21,6 +21,7 @@ import java.util.Locale;
import com.ibm.icu.text.DecimalFormatSymbols;
import com.ibm.icu.util.Currency;
import com.ibm.icu.util.ULocale;
public class IntlTestDecimalFormatSymbols extends com.ibm.icu.dev.test.TestFmwk
{
@ -40,6 +41,13 @@ public class IntlTestDecimalFormatSymbols extends com.ibm.icu.dev.test.TestFmwk
}
// just do some VERY basic tests to make sure that get/set work
if(!en.getLocale().equals(Locale.ENGLISH)) {
errln("ERROR: getLocale failed");
}
if(!en.getULocale().equals(ULocale.ENGLISH)) {
errln("ERROR: getULocale failed");
}
char zero = en.getZeroDigit();
fr.setZeroDigit(zero);
@ -145,6 +153,12 @@ public class IntlTestDecimalFormatSymbols extends com.ibm.icu.dev.test.TestFmwk
errln("ERROR: get/set Exponential failed");
}
String exponentMultiplicationSign = en.getExponentMultiplicationSign();
fr.setExponentMultiplicationSign(exponentMultiplicationSign);
if(fr.getExponentMultiplicationSign() != en.getExponentMultiplicationSign()) {
errln("ERROR: get/set ExponentMultiplicationSign failed");
}
// Test CurrencySpacing.
// In CLDR 1.7, only root.txt has CurrencySpacing data. This data might
// be different between en and fr in the future.

View File

@ -1599,6 +1599,16 @@ public class MeasureUnitTest extends TestFmwk {
assertTrue("MeasureUnit: unexpectedly few currencies defined", MeasureUnit.getAvailable("currency").size() > 50);
}
public void testParseObject() {
MeasureFormat mf = MeasureFormat.getInstance(Locale.GERMAN, FormatWidth.NARROW);
try {
mf.parseObject("3m", null);
fail("MeasureFormat.parseObject(String, ParsePosition) " +
"should throw an UnsupportedOperationException");
} catch (UnsupportedOperationException expected) {
}
}
// DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
// for MeasureFormat during the release process.
static Map<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> getUnitsToPerParts() {

View File

@ -33,6 +33,7 @@ import com.ibm.icu.impl.data.ResourceReader;
import com.ibm.icu.impl.data.TokenIterator;
import com.ibm.icu.math.BigDecimal;
import com.ibm.icu.math.MathContext;
import com.ibm.icu.text.CompactDecimalFormat;
import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.DecimalFormatSymbols;
import com.ibm.icu.text.DisplayContext;
@ -40,6 +41,8 @@ import com.ibm.icu.text.MeasureFormat;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.text.NumberFormat.NumberFormatFactory;
import com.ibm.icu.text.NumberFormat.SimpleNumberFormatFactory;
import com.ibm.icu.text.NumberingSystem;
import com.ibm.icu.text.RuleBasedNumberFormat;
import com.ibm.icu.util.Currency;
import com.ibm.icu.util.CurrencyAmount;
import com.ibm.icu.util.ULocale;
@ -1954,6 +1957,50 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
}
}
}
// Coverage tests for methods not being called otherwise.
public void TestNumberingSystemCoverage() {
// Test getAvaliableNames
String[] availableNames = NumberingSystem.getAvailableNames();
if (availableNames == null || availableNames.length <= 0) {
errln("ERROR: NumberingSystem.getAvailableNames() returned a null or empty array.");
} else {
boolean latnFound = false;
for (String name : availableNames){
if ("latn".equals(name)) {
latnFound = true;
break;
}
}
if (!latnFound) {
errln("ERROR: 'latn' numbering system not found on NumberingSystem.getAvailableNames().");
}
}
// Test NumberingSystem.getInstance()
NumberingSystem ns1 = NumberingSystem.getInstance();
if (ns1 == null || ns1.isAlgorithmic()) {
errln("ERROR: NumberingSystem.getInstance() returned a null or invalid NumberingSystem");
}
// Test NumberingSystem.getInstance(int,boolean,String)
/* Parameters used: the ones used in the default constructor
* radix = 10;
* algorithmic = false;
* desc = "0123456789";
*/
NumberingSystem ns2 = NumberingSystem.getInstance(10, false, "0123456789");
if (ns2 == null || ns2.isAlgorithmic()) {
errln("ERROR: NumberingSystem.getInstance(int,boolean,String) returned a null or invalid NumberingSystem");
}
// Test NumberingSystem.getInstance(Locale)
NumberingSystem ns3 = NumberingSystem.getInstance(Locale.ENGLISH);
if (ns3 == null || ns3.isAlgorithmic()) {
errln("ERROR: NumberingSystem.getInstance(Locale) returned a null or invalid NumberingSystem");
}
}
public void Test6816() {
Currency cur1 = Currency.getInstance(new Locale("und", "PH"));
@ -3243,6 +3290,36 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
}
}
/*
* Coverage tests for the implementation of abstract format methods not being called otherwise
*/
public void TestFormatAbstractImplCoverage() {
NumberFormat df = DecimalFormat.getInstance(Locale.ENGLISH);
NumberFormat cdf = CompactDecimalFormat.getInstance(Locale.ENGLISH, CompactDecimalFormat.CompactStyle.SHORT);
NumberFormat rbf = new RuleBasedNumberFormat(ULocale.ENGLISH, RuleBasedNumberFormat.SPELLOUT);
/*
* Test NumberFormat.format(BigDecimal,StringBuffer,FieldPosition)
*/
StringBuffer sb = new StringBuffer();
String result = df.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
if (!"2,000.43".equals(result)) {
errln("DecimalFormat failed. Expected: 2,000.43 - Actual: " + result);
}
sb.delete(0, sb.length());
result = cdf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
if (!"2K".equals(result)) {
errln("DecimalFormat failed. Expected: 2K - Actual: " + result);
}
sb.delete(0, sb.length());
result = rbf.format(new BigDecimal(2000.43), sb, new FieldPosition(0)).toString();
if (!"two thousand point four three".equals(result)) {
errln("DecimalFormat failed. Expected: 'two thousand point four three' - Actual: '" + result + "'");
}
}
/*
* Tests the method public final static NumberFormat getInstance(int style) public static NumberFormat
* getInstance(Locale inLocale, int style) public static NumberFormat getInstance(ULocale desiredLocale, int choice)
@ -3341,21 +3418,21 @@ public class NumberFormatTest extends com.ibm.icu.dev.test.TestFmwk {
* Tests the method public boolean visible()
*/
if (tf.visible() != true) {
errln("NumberFormatFactor.visible() was suppose to return true.");
errln("NumberFormatFactory.visible() was suppose to return true.");
}
/*
* Tests the method public NumberFormat createFormat(Locale loc, int formatType)
*/
if (tf.createFormat(new Locale(""), 0) != null) {
errln("NumberFormatFactor.createFormat(Locale loc, int formatType) " + "was suppose to return null");
errln("NumberFormatFactory.createFormat(Locale loc, int formatType) " + "was suppose to return null");
}
/*
* Tests the method public NumberFormat createFormat(ULocale loc, int formatType)
*/
if (tf1.createFormat(new ULocale(""), 0) != null) {
errln("NumberFormatFactor.createFormat(ULocale loc, int formatType) " + "was suppose to return null");
errln("NumberFormatFactory.createFormat(ULocale loc, int formatType) " + "was suppose to return null");
}
}

View File

@ -1,12 +1,13 @@
/*
*******************************************************************************
* Copyright (C) 2007-2015, International Business Machines Corporation and
* Copyright (C) 2007-2016, International Business Machines Corporation and
* others. All Rights Reserved.
*******************************************************************************
*/
package com.ibm.icu.dev.test.format;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.util.Collection;
import java.util.LinkedHashMap;
@ -70,15 +71,31 @@ public class PluralFormatUnitTest extends TestFmwk {
}
}
// Test some bigger numbers.
// Coverage: Use the format(Object, ...) version.
StringBuffer sb = new StringBuffer();
FieldPosition ignore = new FieldPosition(-1);
for (int n = 100; n < 113; n++) {
String result = numberFmt.format(n*n);
for (int k = 0; k < plFmts.length; ++k) {
this.assertEquals("PluralFormat's output is not as expected",
result, plFmts[k].format(n*n));
sb.delete(0, sb.length());
String pfResult = plFmts[k].format(Long.valueOf(n*n), sb, ignore).toString();
this.assertEquals("PluralFormat's output is not as expected", result, pfResult);
}
}
}
public void TestEquals() {
// There is neither clone() nor a copy constructor.
PluralFormat de_fee_1 = new PluralFormat(ULocale.GERMAN, PluralType.CARDINAL, "other{fee}");
PluralFormat de_fee_2 = new PluralFormat(ULocale.GERMAN, PluralType.CARDINAL, "other{fee}");
PluralFormat de_fi = new PluralFormat(ULocale.GERMAN, PluralType.CARDINAL, "other{fi}");
PluralFormat fr_fee = new PluralFormat(ULocale.FRENCH, PluralType.CARDINAL, "other{fee}");
assertTrue("different de_fee objects", de_fee_1 != de_fee_2);
assertTrue("equal de_fee objects", de_fee_1.equals(de_fee_2));
assertFalse("different pattern strings", de_fee_1.equals(de_fi));
assertFalse("different locales", de_fee_1.equals(fr_fee));
}
public void TestApplyPatternAndFormat() {
// Create rules for testing.
PluralRules oddAndEven = PluralRules.createRules("odd: n mod 2 is 1");
@ -354,6 +371,12 @@ public class PluralFormatUnitTest extends TestFmwk {
pf.applyPattern(pattern);
assertEquals("PluralFormat.format(456)", "456th file", pf.format(456));
assertEquals("PluralFormat.format(111)", "111th file", pf.format(111));
// Code coverage: Use Locale not ULocale.
pf = new PluralFormat(Locale.ENGLISH, PluralType.ORDINAL);
pf.applyPattern(pattern);
assertEquals("PluralFormat.format(456)", "456th file", pf.format(456));
assertEquals("PluralFormat.format(111)", "111th file", pf.format(111));
}
public void TestDecimals() {

View File

@ -1956,4 +1956,77 @@ public class TestMessageFormat extends com.ibm.icu.dev.test.TestFmwk {
MessageFormat mf3 = new MessageFormat("{aa} {aaa}", ULocale.ENGLISH);
assertEquals("aa aaa", "AB ABC", mf3.format(args, new StringBuffer(), null).toString());
}
public void TestMessagePatternAutoQuoteApostropheDeep() {
// Example input & output taken from API docs.
MessagePattern pattern = new MessagePattern(
"I don't '{know}' {gender,select,female{h''er}other{h'im}}.");
assertEquals("autoQuoteApostropheDeep()",
"I don''t '{know}' {gender,select,female{h''er}other{h''im}}.",
pattern.autoQuoteApostropheDeep());
}
public void TestMessagePatternFreezable() {
MessagePattern pattern = new MessagePattern();
assertFalse("just constructed, not yet frozen", pattern.isFrozen());
pattern.parse("fee");
assertTrue("parsed, not empty", pattern.countParts() > 0);
pattern.freeze();
assertTrue("just frozen", pattern.isFrozen());
try {
pattern.parse("fi");
fail("MessagePattern.freeze().parse() did not fail");
} catch (Exception expected) {
}
assertEquals("frozen+parse: no change", "fee", pattern.autoQuoteApostropheDeep());
MessagePattern thawed = pattern.cloneAsThawed();
assertFalse("thawed", thawed.isFrozen());
assertTrue("still frozen", pattern.isFrozen());
assertTrue("frozen!=thawed", pattern != thawed);
thawed.parse("fo");
assertEquals("thawed+parse", "fo", thawed.autoQuoteApostropheDeep());
}
public void TestMessagePatternNamedAndNumberedArguments() {
MessagePattern pattern = new MessagePattern();
pattern.parse("fee");
assertFalse("fee no named args", pattern.hasNamedArguments());
assertFalse("fee no numbered args", pattern.hasNumberedArguments());
pattern.parse("fi {0}");
assertFalse("fi {0} no named args", pattern.hasNamedArguments());
assertTrue("fi {0} has numbered args", pattern.hasNumberedArguments());
pattern.parse("fo {name}");
assertTrue("fo {name} has named args", pattern.hasNamedArguments());
assertFalse("fo {name} no numbered args", pattern.hasNumberedArguments());
pattern.parse("fum {0} {name}");
assertTrue("fum {0} {name} has named args", pattern.hasNamedArguments());
assertTrue("fum {0} {name} no numbered args", pattern.hasNumberedArguments());
}
public void TestMessagePatternPartCoverage() {
MessagePattern pattern = new MessagePattern("ab{17}c");
assertEquals("msg start { arg number } msg limit", 5, pattern.countParts());
MessagePattern.Part arg = pattern.getPart(2);
assertEquals("arg number", MessagePattern.Part.Type.ARG_NUMBER, arg.getType());
assertEquals("arg number start", 3, arg.getIndex());
assertEquals("arg number length", 2, arg.getLength());
assertEquals("arg number limit", 5, arg.getLimit());
assertEquals("arg number 17", 17, arg.getValue());
}
public void TestMessagePatternParseChoiceStyle() {
// This would be tested by ChoiceFormat if ICU4J had its own version of that,
// like ICU4C does.
// Instead, there is only java.text.ChoiceFormat.
// Most of the implementation gets covered by testing with a MessageFormat
// that contains a nested ChoiceFormat pattern,
// but that does not call this public API method.
MessagePattern pattern = new MessagePattern();
// Example string from java.text.ChoiceFormat class docs.
pattern.parseChoiceStyle(
"-1#is negative| 0#is zero or fraction | 1#is one |" +
"1.0<is 1+ |2#is two |2<is more than 2.");
// Only simple API coverage. The parser implementation is tested via MessageFormat.
assertTrue("many parts", pattern.countParts() > 10);
}
}

View File

@ -1,12 +1,13 @@
/*
********************************************************************************
* Copyright (C) 2007-2015, Google, International Business Machines Corporation *
* and others. All Rights Reserved. *
* Copyright (C) 2007-2016, Google, International Business Machines Corporation
* and others. All Rights Reserved.
********************************************************************************
*/
package com.ibm.icu.dev.test.format;
import java.text.FieldPosition;
import java.text.ParseException;
import java.text.ParsePosition;
import java.util.ArrayList;
@ -23,8 +24,10 @@ import java.util.regex.Pattern;
import com.ibm.icu.impl.TZDBTimeZoneNames;
import com.ibm.icu.impl.ZoneMeta;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.text.TimeZoneFormat;
import com.ibm.icu.text.TimeZoneFormat.GMTOffsetPatternType;
import com.ibm.icu.text.TimeZoneFormat.ParseOption;
import com.ibm.icu.text.TimeZoneFormat.Style;
import com.ibm.icu.text.TimeZoneFormat.TimeType;
@ -656,6 +659,48 @@ public class TimeZoneFormatTest extends com.ibm.icu.dev.test.TestFmwk {
}
}
}
// Coverage tests for other versions of the parse() method. All of them end up
// calling the full parse() method tested on the TestParse() test.
public void TestParseCoverage() {
TimeZone expectedTZ = TimeZone.getTimeZone("America/Los_Angeles");
TimeZoneFormat fmt = TimeZoneFormat.getInstance(ULocale.ENGLISH);
// Test parse(String)
try {
TimeZone tz1 = fmt.parse("America/Los_Angeles");
if (tz1 == null) {
errln("Parse failure using parse(String) - expected: " + expectedTZ.getID());
} else if (!expectedTZ.equals(tz1)) {
errln("Parsed TimeZone: '" + tz1.getID() + "' using parse(String) - expected: "
+ expectedTZ.getID());
}
} catch (ParseException e) {
errln("Parse failure using parse(String) - expected: " + expectedTZ.getID()
+ " exception: " + e.getMessage());
}
// Test parse(String, ParsePosition)
TimeZone tz2 = fmt.parse("++America/Los_Angeles", new ParsePosition(2));
if (tz2 == null) {
errln("Parse failure using parse(String, ParsePosition) - expected: "
+ expectedTZ.getID());
} else if (!expectedTZ.equals(tz2)) {
errln("Parsed TimeZone: '" + tz2.getID() + "' using parse(String, ParsePosition) - expected: "
+ expectedTZ.getID());
}
// Test parseObject(String, ParsePosition)
Object tz3 = fmt.parseObject("++America/Los_Angeles", new ParsePosition(2));
if (tz3 == null) {
errln("Parse failure using parseObject(String, ParsePosition) - expected: "
+ expectedTZ.getID());
} else if (!expectedTZ.equals(tz3)) {
errln("Parsed TimeZone: '" + ((TimeZone)tz3).getID()
+ "' using parseObject(String, ParsePosition) - expected: "
+ expectedTZ.getID());
}
}
public void TestISOFormat() {
final int[] OFFSET = {
@ -984,6 +1029,41 @@ public class TimeZoneFormatTest extends com.ibm.icu.dev.test.TestFmwk {
}
}
// Tests format(Object, StringBuffer, FieldPosition):StringBuffer method
// inherited from Format class
public void TestInheritedFormat() {
TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
Calendar cal = Calendar.getInstance(tz);
cal.setTimeInMillis(1459187377690L); // Mar 28, 2016
StringBuffer sb = new StringBuffer();
FieldPosition fp = new FieldPosition(DateFormat.Field.TIME_ZONE);
TimeZoneFormat fmt = TimeZoneFormat.getInstance(ULocale.ENGLISH);
// Test formatting a non-timezone related object
try {
fmt.format(new Object(), sb, fp);
errln("ERROR: format non-timezone related object failed");
} catch (IllegalArgumentException e) { /* Expected */ }
// Test formatting a TimeZone object
sb = new StringBuffer();
fmt.format(tz, sb, fp);
// When formatting a TimeZone object the formatter uses the current date.
String fmtOutput = tz.inDaylightTime(new Date()) ? "GMT-07:00" : "GMT-08:00";
if (!sb.toString().equals(fmtOutput)) {
errln("ERROR: format TimerZone object failed. Expected: " + fmtOutput + ", actual: " + sb);
}
// Test formatting a Calendar object
sb = new StringBuffer();
fmt.format(cal, sb, fp);
if (!sb.toString().equals("GMT-07:00")) {
errln("ERROR: format Calendar object failed. Expected: GMT-07:00, actual: " + sb);
}
}
// This is a test case of Ticket#11487.
// Because the problem is reproduced for the very first time,
// the reported problem cannot be reproduced with regular test
@ -1021,4 +1101,28 @@ public class TimeZoneFormatTest extends com.ibm.icu.dev.test.TestFmwk {
errln("Incorrect count: " + found.toString() + ", expected: " + numIteration);
}
}
// Basic get/set test for methods not being called otherwise.
public void TestAPI() {
TimeZoneFormat tzfmtEn = TimeZoneFormat.getInstance(ULocale.ENGLISH);
TimeZoneFormat tzfmtAr = TimeZoneFormat.getInstance(new ULocale("ar")).cloneAsThawed();
String digits = tzfmtEn.getGMTOffsetDigits();
tzfmtAr.setGMTOffsetDigits(digits);
if (!digits.equals(tzfmtAr.getGMTOffsetDigits())) {
errln("ERROR: get/set GMTOffsetDigits failed");
}
String pattern = tzfmtEn.getGMTOffsetPattern(GMTOffsetPatternType.POSITIVE_H);
tzfmtAr.setGMTOffsetPattern(GMTOffsetPatternType.POSITIVE_H, pattern);
if (!pattern.equals(tzfmtAr.getGMTOffsetPattern(GMTOffsetPatternType.POSITIVE_H))) {
errln("ERROR: get/set GMTOffsetPattern failed");
}
String zeroFmt = tzfmtEn.getGMTZeroFormat();
tzfmtAr.setGMTZeroFormat(zeroFmt);
if (!zeroFmt.equals(tzfmtAr.getGMTZeroFormat())) {
errln("ERROR: get/set GMTZeroFormat failed");
}
}
}

View File

@ -1,6 +1,6 @@
/*
*******************************************************************************
* Copyright (C) 1996-2012, International Business Machines Corporation and
* Copyright (C) 1996-2016, International Business Machines Corporation and
* others. All Rights Reserved.
*******************************************************************************
*/
@ -1720,7 +1720,12 @@ public class BasicTest extends TestFmwk {
options|=Normalizer.INPUT_IS_FCD;
}
return Normalizer.compare(s1, s2, options);
int cmpStrings = Normalizer.compare(s1, s2, options);
int cmpArrays = Normalizer.compare(
s1.toCharArray(), 0, s1.length(),
s2.toCharArray(), 0, s2.length(), options);
assertEquals("compare strings == compare char arrays", cmpStrings, cmpArrays);
return cmpStrings;
}
// reference implementation of UnicodeString::caseCompare
@ -2649,6 +2654,13 @@ public class BasicTest extends TestFmwk {
")==filtered NFC.getCC()",
expectedCC, cc);
}
// More coverage.
StringBuilder sb=new StringBuilder();
assertEquals("filtered normalize()", "ää\u0304",
fn2.normalize("a\u0308ä\u0304", (Appendable)sb).toString());
assertTrue("filtered hasBoundaryAfter()", fn2.hasBoundaryAfter('ä'));
assertTrue("filtered isInert()", fn2.isInert(0x0313));
}
public void TestFilteredAppend() {
@ -2711,4 +2723,50 @@ public class BasicTest extends TestFmwk {
"(normalizes to " + prettify(out) + ')',
" \u1E09", out);
}
public void TestNFC() {
// Coverage tests.
Normalizer2 nfc = Normalizer2.getNFCInstance();
assertTrue("nfc.hasBoundaryAfter(space)", nfc.hasBoundaryAfter(' '));
assertFalse("nfc.hasBoundaryAfter(ä)", nfc.hasBoundaryAfter('ä'));
}
public void TestNFD() {
// Coverage tests.
Normalizer2 nfd = Normalizer2.getNFDInstance();
assertTrue("nfd.hasBoundaryAfter(space)", nfd.hasBoundaryAfter(' '));
assertFalse("nfd.hasBoundaryAfter(ä)", nfd.hasBoundaryAfter('ä'));
}
public void TestFCD() {
// Coverage tests.
Normalizer2 fcd = Normalizer2.getInstance(null, "nfc", Normalizer2.Mode.FCD);
assertTrue("fcd.hasBoundaryAfter(space)", fcd.hasBoundaryAfter(' '));
assertFalse("fcd.hasBoundaryAfter(ä)", fcd.hasBoundaryAfter('ä'));
assertTrue("fcd.isInert(space)", fcd.isInert(' '));
assertFalse("fcd.isInert(ä)", fcd.isInert('ä'));
// This implementation method is unreachable via public API.
Norm2AllModes.FCDNormalizer2 impl = (Norm2AllModes.FCDNormalizer2)fcd;
assertEquals("fcd impl.getQuickCheck(space)", 1, impl.getQuickCheck(' '));
assertEquals("fcd impl.getQuickCheck(ä)", 0, impl.getQuickCheck('ä'));
}
public void TestNoneNormalizer() {
// Use the deprecated Mode Normalizer.NONE for coverage of the internal NoopNormalizer2
// as far as its methods are reachable that way.
assertEquals("NONE.concatenate()", "ä\u0327",
Normalizer.concatenate("ä", "\u0327", Normalizer.NONE, 0));
assertTrue("NONE.isNormalized()", Normalizer.isNormalized("ä\u0327", Normalizer.NONE, 0));
}
public void TestNoopNormalizer2() {
// Use the internal class directly for coverage of methods that are not publicly reachable.
Normalizer2 noop = Norm2AllModes.NOOP_NORMALIZER2;
assertEquals("noop.normalizeSecondAndAppend()", "ä\u0327",
noop.normalizeSecondAndAppend(new StringBuilder("ä"), "\u0327").toString());
assertEquals("noop.getDecomposition()", null, noop.getDecomposition('ä'));
assertTrue("noop.hasBoundaryAfter()", noop.hasBoundaryAfter(0x0308));
assertTrue("noop.isInert()", noop.isInert(0x0308));
}
}

View File

@ -1115,6 +1115,9 @@ public class ULocaleTest extends TestFmwk {
ULocale locale = new ULocale(item.displayLocale);
LocaleDisplayNames ldn = LocaleDisplayNames.getInstance(locale, item.dialectHandling, item.capitalization, item.nameLength);
DisplayContext dialectHandling = ldn.getContext(DisplayContext.Type.DIALECT_HANDLING);
assertEquals("consistent dialect handling",
dialectHandling == DisplayContext.DIALECT_NAMES,
ldn.getDialectHandling() == LocaleDisplayNames.DialectHandling.DIALECT_NAMES);
DisplayContext capitalization = ldn.getContext(DisplayContext.Type.CAPITALIZATION);
DisplayContext nameLength = ldn.getContext(DisplayContext.Type.DISPLAY_LENGTH);
if (dialectHandling != item.dialectHandling || capitalization != item.capitalization || nameLength != item.nameLength) {
@ -1133,6 +1136,43 @@ public class ULocaleTest extends TestFmwk {
}
}
public void TestDisplayLanguageWithDialectCoverage() {
// Coverage test. Implementation is in class LocaleDisplayNames.
assertFalse("en in system default locale: anything but empty",
ULocale.ENGLISH.getDisplayLanguageWithDialect().isEmpty());
assertEquals("en in de", "Englisch",
ULocale.ENGLISH.getDisplayLanguageWithDialect(ULocale.GERMAN));
assertEquals("en (string) in de", "Englisch",
ULocale.getDisplayLanguageWithDialect("en", ULocale.GERMAN));
assertEquals("en (string) in de (string)", "Englisch",
ULocale.getDisplayLanguageWithDialect("en", "de"));
}
public void TestDisplayNameWithDialectCoverage() {
// Coverage test. Implementation is in class LocaleDisplayNames.
assertFalse("en-GB in system default locale: anything but empty",
ULocale.UK.getDisplayNameWithDialect().isEmpty());
assertEquals("en-GB in de", "Britisches Englisch",
ULocale.UK.getDisplayNameWithDialect(ULocale.GERMAN));
assertEquals("en-GB (string) in de", "Britisches Englisch",
ULocale.getDisplayNameWithDialect("en-GB", ULocale.GERMAN));
assertEquals("en-GB (string) in de (string)", "Britisches Englisch",
ULocale.getDisplayNameWithDialect("en-GB", "de"));
}
public void TestDisplayScriptCoverage() {
// Coverage test. Implementation is in class LocaleDisplayNames.
assertFalse("zh-Hans in system default locale: anything but empty",
ULocale.SIMPLIFIED_CHINESE.getDisplayScript().isEmpty());
// Stand-alone script name, so not just "Vereinfacht".
assertEquals("zh-Hans in de", "Vereinfachtes Chinesisch",
ULocale.SIMPLIFIED_CHINESE.getDisplayScript(ULocale.GERMAN));
assertEquals("zh-Hans (string) in de", "Vereinfachtes Chinesisch",
ULocale.getDisplayScript("zh-Hans", ULocale.GERMAN));
assertEquals("zh-Hans (string) in de (string)", "Vereinfachtes Chinesisch",
ULocale.getDisplayScript("zh-Hans", "de"));
}
private boolean checkName(String name, String language, String script, String country, String variant, ULocale dl) {
if (!checkInclusion(dl, name, language, "language")) {
return false;