From: Shane Carr Date: Wed, 13 Feb 2019 22:37:30 +0000 (-0800) Subject: ICU-20138 Adding matchesField as draft and removing getConstraintType. X-Git-Tag: release-64-rc~89 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d243867c111ef7ed245bda8f400417e60c1f9100;p=icu ICU-20138 Adding matchesField as draft and removing getConstraintType. --- diff --git a/icu4c/source/i18n/formattedval_impl.h b/icu4c/source/i18n/formattedval_impl.h index 613ca27648b..5289f285c3f 100644 --- a/icu4c/source/i18n/formattedval_impl.h +++ b/icu4c/source/i18n/formattedval_impl.h @@ -20,6 +20,50 @@ #include "uvectr32.h" #include "number_stringbuilder.h" + +/** + * Represents the type of constraint for ConstrainedFieldPosition. + * + * Constraints are used to control the behavior of iteration in FormattedValue. + * + * @internal + */ +typedef enum UCFPosConstraintType { + /** + * Represents the lack of a constraint. + * + * This is the value of fConstraint if no "constrain" methods were called. + * + * @internal + */ + UCFPOS_CONSTRAINT_NONE = 0, + + /** + * Represents that the field category is constrained. + * + * This is the value of fConstraint if constraintCategory was called. + * + * FormattedValue implementations should not change the field category + * while this constraint is active. + * + * @internal + */ + UCFPOS_CONSTRAINT_CATEGORY, + + /** + * Represents that the field and field category are constrained. + * + * This is the value of fConstraint if constraintField was called. + * + * FormattedValue implementations should not change the field or field category + * while this constraint is active. + * + * @internal + */ + UCFPOS_CONSTRAINT_FIELD +} UCFPosConstraintType; + + U_NAMESPACE_BEGIN diff --git a/icu4c/source/i18n/formattedvalue.cpp b/icu4c/source/i18n/formattedvalue.cpp index 17bec7b876f..e2c9c42fc88 100644 --- a/icu4c/source/i18n/formattedvalue.cpp +++ b/icu4c/source/i18n/formattedvalue.cpp @@ -40,18 +40,7 @@ void ConstrainedFieldPosition::setInt64IterationContext(int64_t context) { fContext = context; } -void ConstrainedFieldPosition::setState( - int32_t category, - int32_t field, - int32_t start, - int32_t limit) { - fCategory = category; - fField = field; - fStart = start; - fLimit = limit; -} - -UBool ConstrainedFieldPosition::matchesField(int32_t category, int32_t field) { +UBool ConstrainedFieldPosition::matchesField(int32_t category, int32_t field) const { switch (fConstraint) { case UCFPOS_CONSTRAINT_NONE: return TRUE; @@ -64,6 +53,17 @@ UBool ConstrainedFieldPosition::matchesField(int32_t category, int32_t field) { } } +void ConstrainedFieldPosition::setState( + int32_t category, + int32_t field, + int32_t start, + int32_t limit) { + fCategory = category; + fField = field; + fStart = start; + fLimit = limit; +} + FormattedValue::~FormattedValue() = default; @@ -115,15 +115,6 @@ ucfpos_constrainField(UConstrainedFieldPosition* ptr, int32_t category, int32_t impl->fImpl.constrainField(category, field); } -U_CAPI UCFPosConstraintType U_EXPORT2 -ucfpos_getConstraintType(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { - const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); - if (U_FAILURE(*ec)) { - return UCFPOS_CONSTRAINT_NONE; - } - return impl->fImpl.getConstraintType(); -} - U_CAPI int32_t U_EXPORT2 ucfpos_getCategory(const UConstrainedFieldPosition* ptr, UErrorCode* ec) { const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); @@ -170,6 +161,15 @@ ucfpos_setInt64IterationContext(UConstrainedFieldPosition* ptr, int64_t context, impl->fImpl.setInt64IterationContext(context); } +U_CAPI UBool U_EXPORT2 +ucfpos_matchesField(const UConstrainedFieldPosition* ptr, int32_t category, int32_t field, UErrorCode* ec) { + const auto* impl = UConstrainedFieldPositionImpl::validate(ptr, *ec); + if (U_FAILURE(*ec)) { + return 0; + } + return impl->fImpl.matchesField(category, field); +} + U_CAPI void U_EXPORT2 ucfpos_setState( UConstrainedFieldPosition* ptr, diff --git a/icu4c/source/i18n/unicode/formattedvalue.h b/icu4c/source/i18n/unicode/formattedvalue.h index 457f119111b..4d6deaf6baa 100644 --- a/icu4c/source/i18n/unicode/formattedvalue.h +++ b/icu4c/source/i18n/unicode/formattedvalue.h @@ -110,21 +110,10 @@ class U_I18N_API ConstrainedFieldPosition : public UMemory { */ void constrainField(int32_t category, int32_t field); - /** - * Gets the currently active constraint. - * - * @return The currently active constraint type. - * @draft ICU 64 - */ - inline UCFPosConstraintType getConstraintType() const { - return fConstraint; - } - /** * Gets the field category for the current position. * - * If a category or field constraint was set, this function returns the constrained - * category. Otherwise, the return value is well-defined only after + * The return value is well-defined only after * FormattedValue#nextPosition returns TRUE. * * @return The field category saved in the instance. @@ -137,8 +126,7 @@ class U_I18N_API ConstrainedFieldPosition : public UMemory { /** * Gets the field for the current position. * - * If a field constraint was set, this function returns the constrained - * field. Otherwise, the return value is well-defined only after + * The return value is well-defined only after * FormattedValue#nextPosition returns TRUE. * * @return The field saved in the instance. @@ -201,6 +189,18 @@ class U_I18N_API ConstrainedFieldPosition : public UMemory { */ void setInt64IterationContext(int64_t context); + /** + * Determines whether a given field should be included given the + * constraints. + * + * Intended to be used by FormattedValue implementations. + * + * @param category The category to test. + * @param field The field to test. + * @draft ICU 64 + */ + UBool matchesField(int32_t category, int32_t field) const; + /** * Sets new values for the primary public getters. * @@ -221,16 +221,13 @@ class U_I18N_API ConstrainedFieldPosition : public UMemory { int32_t start, int32_t limit); - /** @internal */ - UBool matchesField(int32_t category, int32_t field); - private: int64_t fContext = 0LL; int32_t fField = 0; int32_t fStart = 0; int32_t fLimit = 0; - UCFPosConstraintType fConstraint = UCFPOS_CONSTRAINT_NONE; int32_t fCategory = UFIELD_CATEGORY_UNDEFINED; + int8_t fConstraint = 0; }; diff --git a/icu4c/source/i18n/unicode/uformattedvalue.h b/icu4c/source/i18n/unicode/uformattedvalue.h index d9600d90379..362408bfeb7 100644 --- a/icu4c/source/i18n/unicode/uformattedvalue.h +++ b/icu4c/source/i18n/unicode/uformattedvalue.h @@ -89,55 +89,6 @@ typedef enum UFieldCategory { } UFieldCategory; -/** - * Represents the type of constraint for ConstrainedFieldPosition. - * - * Constraints are used to control the behavior of iteration in FormattedValue. - * - * @draft ICU 64 - */ -typedef enum UCFPosConstraintType { - /** - * Represents the lack of a constraint. - * - * This is the return value of ConstrainedFieldPosition#getConstraintType or - * ucfpos_getConstraintType if no "constrain" methods were called. - * - * @draft ICU 64 - */ - UCFPOS_CONSTRAINT_NONE, - - /** - * Represents that the field category is constrained. - * - * This is the return value of ConstrainedFieldPosition#getConstraintType or - * cfpos_getConstraintType after ConstrainedFieldPosition#constrainCategory or - * cfpos_constrainCategory is called. - * - * Use getCategory to access the category. FormattedValue implementations - * should not change that values while this constraint is active. - * - * @draft ICU 64 - */ - UCFPOS_CONSTRAINT_CATEGORY, - - /** - * Represents that the field and field category are constrained. - * - * This is the return value of ConstrainedFieldPosition#getConstraintType or - * cfpos_getConstraintType after ConstrainedFieldPosition#constrainField or - * cfpos_constrainField is called. - * - * Use getCategory and getField to access the category and field. - * FormattedValue implementations should not change those values while - * this constraint is active. - * - * @draft ICU 64 - */ - UCFPOS_CONSTRAINT_FIELD -} UCFPosConstraintType; - - struct UConstrainedFieldPosition; /** * Represents a span of a string containing a given field. @@ -257,20 +208,6 @@ ucfpos_constrainField( UErrorCode* ec); -/** - * Gets the currently active constraint. - * - * @param ucfpos The instance of UConstrainedFieldPosition. - * @param ec Set if an error occurs. - * @return The currently active constraint type. - * @draft ICU 64 - */ -U_DRAFT UCFPosConstraintType U_EXPORT2 -ucfpos_getConstraintType( - const UConstrainedFieldPosition* ucfpos, - UErrorCode* ec); - - /** * Gets the field category for the current position. * @@ -361,6 +298,26 @@ ucfpos_setInt64IterationContext( UErrorCode* ec); +/** + * Determines whether a given field should be included given the + * constraints. + * + * Intended to be used by FormattedValue implementations. + * + * @param ucfpos The instance of UConstrainedFieldPosition. + * @param category The category to test. + * @param field The field to test. + * @param ec Set if an error occurs. + * @draft ICU 64 + */ +U_DRAFT UBool U_EXPORT2 +ucfpos_matchesField( + const UConstrainedFieldPosition* ucfpos, + int32_t category, + int32_t field, + UErrorCode* ec); + + /** * Sets new values for the primary public getters. * diff --git a/icu4c/source/test/cintltst/uformattedvaluetst.c b/icu4c/source/test/cintltst/uformattedvaluetst.c index a6f4f6d3861..b046880114b 100644 --- a/icu4c/source/test/cintltst/uformattedvaluetst.c +++ b/icu4c/source/test/cintltst/uformattedvaluetst.c @@ -20,7 +20,7 @@ static void TestSetters(void); static void AssertAllPartsEqual( const char* messagePrefix, const UConstrainedFieldPosition* ucfpos, - UCFPosConstraintType constraint, + int32_t matching, UFieldCategory category, int32_t field, int32_t start, @@ -46,7 +46,7 @@ static void TestBasic() { AssertAllPartsEqual( "basic", ucfpos, - UCFPOS_CONSTRAINT_NONE, + 7, UFIELD_CATEGORY_UNDEFINED, 0, 0, @@ -67,7 +67,7 @@ void TestSetters() { AssertAllPartsEqual( "setters 0", ucfpos, - UCFPOS_CONSTRAINT_CATEGORY, + 4, UFIELD_CATEGORY_DATE, 0, 0, @@ -79,7 +79,7 @@ void TestSetters() { AssertAllPartsEqual( "setters 1", ucfpos, - UCFPOS_CONSTRAINT_FIELD, + 2, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 0, @@ -91,7 +91,7 @@ void TestSetters() { AssertAllPartsEqual( "setters 2", ucfpos, - UCFPOS_CONSTRAINT_FIELD, + 2, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 0, @@ -103,7 +103,7 @@ void TestSetters() { AssertAllPartsEqual( "setters 3", ucfpos, - UCFPOS_CONSTRAINT_FIELD, + 2, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 5, @@ -115,7 +115,7 @@ void TestSetters() { AssertAllPartsEqual( "setters 4", ucfpos, - UCFPOS_CONSTRAINT_NONE, + 7, UFIELD_CATEGORY_UNDEFINED, 0, 0, @@ -125,10 +125,16 @@ void TestSetters() { ucfpos_close(ucfpos); } +/** For matching, turn on these bits: + * + * 1 = UNUM_INTEGER_FIELD + * 2 = UNUM_COMPACT_FIELD + * 4 = UDAT_AM_PM_FIELD + */ static void AssertAllPartsEqual( const char* messagePrefix, const UConstrainedFieldPosition* ucfpos, - UCFPosConstraintType constraint, + int32_t matching, UFieldCategory category, int32_t field, int32_t start, @@ -146,10 +152,6 @@ static void AssertAllPartsEqual( #define AAPE_MSG(suffix) (uprv_strncpy(message+prefixEnd, suffix, 256-prefixEnd)-prefixEnd) - UCFPosConstraintType _constraintType = ucfpos_getConstraintType(ucfpos, &status); - assertSuccess(AAPE_MSG("constraint"), &status); - assertIntEquals(AAPE_MSG("constraint"), constraint, _constraintType); - UFieldCategory _category = ucfpos_getCategory(ucfpos, &status); assertSuccess(AAPE_MSG("_"), &status); assertIntEquals(AAPE_MSG("category"), category, _category); @@ -167,6 +169,21 @@ static void AssertAllPartsEqual( int64_t _context = ucfpos_getInt64IterationContext(ucfpos, &status); assertSuccess(AAPE_MSG("context"), &status); assertIntEquals(AAPE_MSG("context"), context, _context); + + UBool _matchesInteger = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, &status); + assertSuccess(AAPE_MSG("integer field"), &status); + assertTrue(AAPE_MSG("integer field"), + ((matching & 1) != 0) ? _matchesInteger : !_matchesInteger); + + UBool _matchesCompact = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, &status); + assertSuccess(AAPE_MSG("compact field"), &status); + assertTrue(AAPE_MSG("compact field"), + ((matching & 2) != 0) ? _matchesCompact : !_matchesCompact); + + UBool _matchesDate = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_DATE, UDAT_AM_PM_FIELD, &status); + assertSuccess(AAPE_MSG("date field"), &status); + assertTrue(AAPE_MSG("date field"), + ((matching & 4) != 0) ? _matchesDate : !_matchesDate); } diff --git a/icu4c/source/test/intltest/formattedvaluetest.cpp b/icu4c/source/test/intltest/formattedvaluetest.cpp index 9139928ad39..0b84b4cb2f3 100644 --- a/icu4c/source/test/intltest/formattedvaluetest.cpp +++ b/icu4c/source/test/intltest/formattedvaluetest.cpp @@ -9,6 +9,7 @@ #include "unicode/formattedvalue.h" #include "unicode/unum.h" +#include "unicode/udat.h" #include "intltest.h" #include "itformat.h" @@ -24,7 +25,7 @@ private: void assertAllPartsEqual( UnicodeString messagePrefix, const ConstrainedFieldPosition& cfpos, - UCFPosConstraintType constraint, + int32_t matching, UFieldCategory category, int32_t field, int32_t start, @@ -50,7 +51,7 @@ void FormattedValueTest::testBasic() { assertAllPartsEqual( u"basic", cfpos, - UCFPOS_CONSTRAINT_NONE, + 7, UFIELD_CATEGORY_UNDEFINED, 0, 0, @@ -66,7 +67,7 @@ void FormattedValueTest::testSetters() { assertAllPartsEqual( u"setters 0", cfpos, - UCFPOS_CONSTRAINT_CATEGORY, + 4, UFIELD_CATEGORY_DATE, 0, 0, @@ -77,7 +78,7 @@ void FormattedValueTest::testSetters() { assertAllPartsEqual( u"setters 1", cfpos, - UCFPOS_CONSTRAINT_FIELD, + 2, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 0, @@ -88,7 +89,7 @@ void FormattedValueTest::testSetters() { assertAllPartsEqual( u"setters 2", cfpos, - UCFPOS_CONSTRAINT_FIELD, + 2, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 0, @@ -99,7 +100,7 @@ void FormattedValueTest::testSetters() { assertAllPartsEqual( u"setters 3", cfpos, - UCFPOS_CONSTRAINT_FIELD, + 2, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 5, @@ -110,7 +111,7 @@ void FormattedValueTest::testSetters() { assertAllPartsEqual( u"setters 4", cfpos, - UCFPOS_CONSTRAINT_NONE, + 7, UFIELD_CATEGORY_UNDEFINED, 0, 0, @@ -123,22 +124,26 @@ void FormattedValueTest::testLocalPointer() { LocalUConstrainedFieldPositionPointer ucfpos(ucfpos_open(&status)); assertSuccess("Openining LocalUConstrainedFieldPositionPointer", status); assertEquals(u"Test that object is valid", - UCFPOS_CONSTRAINT_NONE, - ucfpos_getConstraintType(ucfpos.getAlias(), &status)); + 0LL, + ucfpos_getInt64IterationContext(ucfpos.getAlias(), &status)); assertSuccess("Using LocalUConstrainedFieldPositionPointer", status); } +/** For matching, turn on these bits: + * + * 1 = UNUM_INTEGER_FIELD + * 2 = UNUM_COMPACT_FIELD + * 4 = UDAT_AM_PM_FIELD + */ void FormattedValueTest::assertAllPartsEqual( UnicodeString messagePrefix, const ConstrainedFieldPosition& cfpos, - UCFPosConstraintType constraint, + int32_t matching, UFieldCategory category, int32_t field, int32_t start, int32_t limit, int64_t context) { - assertEquals(messagePrefix + u": constraint", - constraint, cfpos.getConstraintType()); assertEquals(messagePrefix + u": category", category, cfpos.getCategory()); assertEquals(messagePrefix + u": field", @@ -149,6 +154,13 @@ void FormattedValueTest::assertAllPartsEqual( limit, cfpos.getLimit()); assertEquals(messagePrefix + u": context", context, cfpos.getInt64IterationContext()); + + assertEquals(messagePrefix + u": integer field", + (UBool) ((matching & 1) != 0), cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD)); + assertEquals(messagePrefix + u": compact field", + (UBool) ((matching & 2) != 0), cfpos.matchesField(UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD)); + assertEquals(messagePrefix + u": date field", + (UBool) ((matching & 4) != 0), cfpos.matchesField(UFIELD_CATEGORY_DATE, UDAT_AM_PM_FIELD)); } diff --git a/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java b/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java index 998190a1646..20d3641f9eb 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/text/ConstrainedFieldPosition.java @@ -23,47 +23,33 @@ public class ConstrainedFieldPosition { * Represents the type of constraint for ConstrainedFieldPosition. * * Constraints are used to control the behavior of iteration in FormattedValue. - * - * @draft ICU 64 - * @provisional This API might change or be removed in a future release. */ - public enum ConstraintType { + private enum ConstraintType { /** * Represents the lack of a constraint. * - * This is the return value of {@link #getConstraintType} + * This is the value of fConstraint * if no "constrain" methods were called. - * - * @draft ICU 64 - * @provisional This API might change or be removed in a future release. */ NONE, /** * Represents that the field class is constrained. - * Use {@link #getClassConstraint} to access the class. * - * This is the return value of @link #getConstraintType} + * This is the value of fConstraint * after {@link #constrainClass} is called. * - * FormattedValue implementations should not change the field when this constraint is active. - * - * @draft ICU 64 - * @provisional This API might change or be removed in a future release. + * FormattedValue implementations should not change the field class when this constraint is active. */ CLASS, /** * Represents that the field is constrained. - * Use {@link #getField} to access the field. * - * This is the return value of @link #getConstraintType} + * This is the value of fConstraint * after {@link #constrainField} is called. * * FormattedValue implementations should not change the field when this constraint is active. - * - * @draft ICU 64 - * @provisional This API might change or be removed in a future release. */ FIELD }; @@ -174,33 +160,10 @@ public class ConstrainedFieldPosition { fField = null; } - /** - * Gets the currently active constraint. - * - * @return The currently active constraint type. - * @draft ICU 64 - * @provisional This API might change or be removed in a future release. - */ - public ConstraintType getConstraintType() { - return fConstraint; - } - - /** - * Gets the class on which field positions are currently constrained. - * - * @return The class constraint from {@link #constrainClass}, or Object.class by default. - * @draft ICU 64 - * @provisional This API might change or be removed in a future release. - */ - public Class getClassConstraint() { - return fClassConstraint; - } - /** * Gets the field for the current position. * - * If a field constraint was set, this function returns the constrained - * field. Otherwise, the return value is well-defined and non-null only after + * The return value is well-defined and non-null only after * FormattedValue#nextPosition returns TRUE. * * @return The field saved in the instance. See above for null conditions. @@ -299,16 +262,30 @@ public class ConstrainedFieldPosition { * @provisional This API might change or be removed in a future release. */ public void setState(Field field, Object value, int start, int limit) { + // Check matchesField only as an assertion (debug build) + assert matchesField(field); + fField = field; fValue = value; fStart = start; fLimit = limit; } - /** @internal */ + /** + * Determines whether a given field should be included given the + * constraints. + * + * Intended to be used by FormattedValue implementations. + * + * @param field The field to test. + * @return Whether the field should be included given the constraints. + * @draft ICU 64 + * @provisional This API might change or be removed in a future release. + */ public boolean matchesField(Field field) { - // If this method ever becomes public, change assert to throw IllegalArgumentException - assert field != null; + if (field == null) { + throw new IllegalArgumentException("field must not be null"); + } switch (fConstraint) { case NONE: return true; diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java index 0811a7a1334..dda4bf4a5ca 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/FormattedValueTest.java @@ -5,6 +5,7 @@ package com.ibm.icu.dev.test.format; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.math.BigDecimal; import java.text.AttributedCharacterIterator; @@ -16,7 +17,7 @@ import java.util.Set; import org.junit.Test; import com.ibm.icu.text.ConstrainedFieldPosition; -import com.ibm.icu.text.ConstrainedFieldPosition.ConstraintType; +import com.ibm.icu.text.DateFormat; import com.ibm.icu.text.FormattedValue; import com.ibm.icu.text.NumberFormat; @@ -30,8 +31,7 @@ public class FormattedValueTest { assertAllPartsEqual( "basic", cfpos, - ConstraintType.NONE, - Object.class, + 7, null, null, 0, @@ -47,8 +47,7 @@ public class FormattedValueTest { assertAllPartsEqual( "setters 1", cfpos, - ConstraintType.FIELD, - Object.class, + 2, NumberFormat.Field.COMPACT, null, 0, @@ -59,8 +58,7 @@ public class FormattedValueTest { assertAllPartsEqual( "setters 1.5", cfpos, - ConstraintType.CLASS, - NumberFormat.Field.class, + 3, null, null, 0, @@ -71,8 +69,7 @@ public class FormattedValueTest { assertAllPartsEqual( "setters 2", cfpos, - ConstraintType.CLASS, - NumberFormat.Field.class, + 3, null, null, 0, @@ -83,8 +80,7 @@ public class FormattedValueTest { assertAllPartsEqual( "setters 3", cfpos, - ConstraintType.CLASS, - NumberFormat.Field.class, + 3, NumberFormat.Field.COMPACT, BigDecimal.ONE, 5, @@ -95,8 +91,7 @@ public class FormattedValueTest { assertAllPartsEqual( "setters 4", cfpos, - ConstraintType.NONE, - Object.class, + 7, null, null, 0, @@ -104,15 +99,38 @@ public class FormattedValueTest { 0L); } - private void assertAllPartsEqual(String messagePrefix, ConstrainedFieldPosition cfpos, ConstraintType constraint, - Class classConstraint, Field field, Object value, int start, int limit, long context) { - assertEquals(messagePrefix + ": constraint", constraint, cfpos.getConstraintType()); - assertEquals(messagePrefix + ": class constraint", classConstraint, cfpos.getClassConstraint()); + @Test + public void testIllegalArgumentException() { + ConstrainedFieldPosition cfpos = new ConstrainedFieldPosition(); + try { + cfpos.matchesField(null); + fail("Expected an IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // pass + } + } + + private void assertAllPartsEqual( + String messagePrefix, + ConstrainedFieldPosition cfpos, + int matching, + Field field, + Object value, + int start, + int limit, + long context) { assertEquals(messagePrefix + ": field", field, cfpos.getField()); assertEquals(messagePrefix + ": field value", value, cfpos.getFieldValue()); assertEquals(messagePrefix + ": start", start, cfpos.getStart()); assertEquals(messagePrefix + ": limit", limit, cfpos.getLimit()); assertEquals(messagePrefix + ": context", context, cfpos.getInt64IterationContext()); + + assertEquals(messagePrefix + ": integer field", + ((matching & 1) != 0), cfpos.matchesField(NumberFormat.Field.INTEGER)); + assertEquals(messagePrefix + ": compact field", + ((matching & 2) != 0), cfpos.matchesField(NumberFormat.Field.COMPACT)); + assertEquals(messagePrefix + ": date field", + ((matching & 4) != 0), cfpos.matchesField(DateFormat.Field.AM_PM)); } public static void checkFormattedValue(String message, FormattedValue fv, String expectedString,