// Try computing the formatter on our own
auto* temp = new NumberRangeFormatterImpl(fMacros, status);
if (U_FAILURE(status)) {
+ delete temp;
return nullptr;
}
if (temp == nullptr) {
fApproximatelyFormatter(status) {
const char* nsName = formatterImpl1.getRawMicroProps().nsName;
- if (uprv_strcmp(nsName, formatterImpl2.getRawMicroProps().nsName) != 0) {
+ if (!fSameFormatters && uprv_strcmp(nsName, formatterImpl2.getRawMicroProps().nsName) != 0) {
status = U_ILLEGAL_ARGUMENT_ERROR;
return;
}
void test21684_Performance();
void test21358_SignPosition();
void test21683_StateLeak();
+ void testCreateLNRFFromNumberingSystemInSkeleton();
void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par = 0) override;
TESTCASE_AUTO(test21684_Performance);
TESTCASE_AUTO(test21358_SignPosition);
TESTCASE_AUTO(test21683_StateLeak);
+ TESTCASE_AUTO(testCreateLNRFFromNumberingSystemInSkeleton);
TESTCASE_AUTO_END;
}
}
}
+void NumberRangeFormatterTest::testCreateLNRFFromNumberingSystemInSkeleton() {
+ IcuTestErrorCode status(*this, "testCreateLNRFFromNumberingSystemInSkeleton");
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter::withLocale("en")
+ .numberFormatterBoth(NumberFormatter::forSkeleton(
+ u".### rounding-mode-half-up", status));
+ UnicodeString actual = lnrf.formatFormattableRange(1, 234, status).toString(status);
+ assertEquals("default numbering system", u"1–234", actual);
+ status.errIfFailureAndReset("default numbering system");
+ }
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter::withLocale("th")
+ .numberFormatterBoth(NumberFormatter::forSkeleton(
+ u".### rounding-mode-half-up numbering-system/thai", status));
+ UnicodeString actual = lnrf.formatFormattableRange(1, 234, status).toString(status);
+ assertEquals("Thai numbering system", u"๑-๒๓๔", actual);
+ status.errIfFailureAndReset("thai numbering system");
+ }
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter::withLocale("en")
+ .numberFormatterBoth(NumberFormatter::forSkeleton(
+ u".### rounding-mode-half-up numbering-system/arab", status));
+ UnicodeString actual = lnrf.formatFormattableRange(1, 234, status).toString(status);
+ assertEquals("Arabic numbering system", u"١–٢٣٤", actual);
+ status.errIfFailureAndReset("arab numbering system");
+ }
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter::withLocale("en")
+ .numberFormatterFirst(NumberFormatter::forSkeleton(u"numbering-system/arab", status))
+ .numberFormatterSecond(NumberFormatter::forSkeleton(u"numbering-system/arab", status));
+ UnicodeString actual = lnrf.formatFormattableRange(1, 234, status).toString(status);
+ assertEquals("Double Arabic numbering system", u"١–٢٣٤", actual);
+ status.errIfFailureAndReset("double arab numbering system");
+ }
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter::withLocale("en")
+ .numberFormatterFirst(NumberFormatter::forSkeleton(u"numbering-system/arab", status))
+ .numberFormatterSecond(NumberFormatter::forSkeleton(u"numbering-system/latn", status));
+ // Note: The error is not set until `formatFormattableRange` because this is where the
+ // formatter object gets built.
+ lnrf.formatFormattableRange(1, 234, status);
+ status.expectErrorAndReset(U_ILLEGAL_ARGUMENT_ERROR);
+ }
+}
+
void NumberRangeFormatterTest::test21683_StateLeak() {
IcuTestErrorCode status(*this, "test21683_StateLeak");
UNumberRangeFormatter* nrf = nullptr;
: NumberRangeFormatter.RangeIdentityFallback.APPROXIMATELY;
String nsName = formatterImpl1.getRawMicroProps().nsName;
- if (nsName == null || !nsName.equals(formatterImpl2.getRawMicroProps().nsName)) {
+ if (nsName == null || (!fSameFormatters && !nsName.equals(formatterImpl2.getRawMicroProps().nsName))) {
throw new IllegalArgumentException("Both formatters must have same numbering system");
}
getNumberRangeData(macros.loc, nsName, this);
}
}
+ @Test
+ public void testCreateLNRFFromNumberingSystemInSkeleton() {
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter
+ .withLocale(ULocale.forLanguageTag("en"))
+ .numberFormatterBoth(NumberFormatter.forSkeleton(
+ ".### rounding-mode-half-up"));
+ String actual = lnrf.formatRange(1, 234).toString();
+ assertEquals("default numbering system", "1–234", actual);
+ }
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter
+ .withLocale(ULocale.forLanguageTag("th"))
+ .numberFormatterBoth(NumberFormatter.forSkeleton(
+ ".### rounding-mode-half-up numbering-system/thai"));
+ String actual = lnrf.formatRange(1, 234).toString();
+ assertEquals("Thai numbering system", "๑-๒๓๔", actual);
+ }
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter
+ .withLocale(ULocale.forLanguageTag("en"))
+ .numberFormatterBoth(NumberFormatter.forSkeleton(
+ ".### rounding-mode-half-up numbering-system/arab"));
+ String actual = lnrf.formatRange(1, 234).toString();
+ assertEquals("Arabic numbering system", "١–٢٣٤", actual);
+ }
+ {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter
+ .withLocale(ULocale.forLanguageTag("en"))
+ .numberFormatterFirst(NumberFormatter.forSkeleton("numbering-system/arab"))
+ .numberFormatterSecond(NumberFormatter.forSkeleton("numbering-system/arab"));
+ String actual = lnrf.formatRange(1, 234).toString();
+ assertEquals("Double Arabic numbering system", "١–٢٣٤", actual);
+ }
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testCreateLNRFFromNumberingSystemInSkeletonError() {
+ LocalizedNumberRangeFormatter lnrf = NumberRangeFormatter
+ .withLocale(ULocale.forLanguageTag("en"))
+ .numberFormatterFirst(NumberFormatter.forSkeleton("numbering-system/arab"))
+ .numberFormatterSecond(NumberFormatter.forSkeleton("numbering-system/latn"));
+ // Note: The error is not thrown until `formatRange` because this is where the
+ // formatter object gets built.
+ lnrf.formatRange(1, 234);
+ }
+
static void assertFormatRange(
String message,
UnlocalizedNumberRangeFormatter f,