| Index: icu46/source/test/intltest/tmsgfmt.cpp
|
| ===================================================================
|
| --- icu46/source/test/intltest/tmsgfmt.cpp (revision 0)
|
| +++ icu46/source/test/intltest/tmsgfmt.cpp (revision 0)
|
| @@ -0,0 +1,1626 @@
|
| +/********************************************************************
|
| + * COPYRIGHT:
|
| + * Copyright (c) 1997-2010, International Business Machines Corporation and
|
| + * others. All Rights Reserved.
|
| + ********************************************************************
|
| + * File TMSGFMT.CPP
|
| + *
|
| + * Modification History:
|
| + *
|
| + * Date Name Description
|
| + * 03/24/97 helena Converted from Java.
|
| + * 07/11/97 helena Updated to work on AIX.
|
| + * 08/04/97 jfitz Updated to intltest
|
| + *******************************************************************/
|
| +
|
| +#include "unicode/utypes.h"
|
| +
|
| +#if !UCONFIG_NO_FORMATTING
|
| +
|
| +#include "tmsgfmt.h"
|
| +
|
| +#include "unicode/format.h"
|
| +#include "unicode/decimfmt.h"
|
| +#include "unicode/locid.h"
|
| +#include "unicode/msgfmt.h"
|
| +#include "unicode/numfmt.h"
|
| +#include "unicode/choicfmt.h"
|
| +#include "unicode/selfmt.h"
|
| +#include "unicode/gregocal.h"
|
| +#include <stdio.h>
|
| +
|
| +#define E_WITH_ACUTE ((char)0x00E9)
|
| +static const char E_ACCENTED[]={E_WITH_ACUTE,0};
|
| +
|
| +void
|
| +TestMessageFormat::runIndexedTest(int32_t index, UBool exec,
|
| + const char* &name, char* /*par*/) {
|
| + switch (index) {
|
| + TESTCASE(0,testBug1);
|
| + TESTCASE(1,testBug2);
|
| + TESTCASE(2,sample);
|
| + TESTCASE(3,PatternTest);
|
| + TESTCASE(4,testStaticFormat);
|
| + TESTCASE(5,testSimpleFormat);
|
| + TESTCASE(6,testMsgFormatChoice);
|
| + TESTCASE(7,testCopyConstructor);
|
| + TESTCASE(8,testAssignment);
|
| + TESTCASE(9,testClone);
|
| + TESTCASE(10,testEquals);
|
| + TESTCASE(11,testNotEquals);
|
| + TESTCASE(12,testSetLocale);
|
| + TESTCASE(13,testFormat);
|
| + TESTCASE(14,testParse);
|
| + TESTCASE(15,testAdopt);
|
| + TESTCASE(16,testCopyConstructor2);
|
| + TESTCASE(17,TestUnlimitedArgsAndSubformats);
|
| + TESTCASE(18,TestRBNF);
|
| + TESTCASE(19,TestTurkishCasing);
|
| + TESTCASE(20,testAutoQuoteApostrophe);
|
| + TESTCASE(21,testMsgFormatPlural);
|
| + TESTCASE(22,testCoverage);
|
| + TESTCASE(23,testMsgFormatSelect);
|
| + default: name = ""; break;
|
| + }
|
| +}
|
| +
|
| +void TestMessageFormat::testBug3()
|
| +{
|
| + double myNumber = -123456;
|
| + DecimalFormat *form = 0;
|
| + Locale locale[] = {
|
| + Locale("ar", "", ""),
|
| + Locale("be", "", ""),
|
| + Locale("bg", "", ""),
|
| + Locale("ca", "", ""),
|
| + Locale("cs", "", ""),
|
| + Locale("da", "", ""),
|
| + Locale("de", "", ""),
|
| + Locale("de", "AT", ""),
|
| + Locale("de", "CH", ""),
|
| + Locale("el", "", ""), // 10
|
| + Locale("en", "CA", ""),
|
| + Locale("en", "GB", ""),
|
| + Locale("en", "IE", ""),
|
| + Locale("en", "US", ""),
|
| + Locale("es", "", ""),
|
| + Locale("et", "", ""),
|
| + Locale("fi", "", ""),
|
| + Locale("fr", "", ""),
|
| + Locale("fr", "BE", ""),
|
| + Locale("fr", "CA", ""), // 20
|
| + Locale("fr", "CH", ""),
|
| + Locale("he", "", ""),
|
| + Locale("hr", "", ""),
|
| + Locale("hu", "", ""),
|
| + Locale("is", "", ""),
|
| + Locale("it", "", ""),
|
| + Locale("it", "CH", ""),
|
| + Locale("ja", "", ""),
|
| + Locale("ko", "", ""),
|
| + Locale("lt", "", ""), // 30
|
| + Locale("lv", "", ""),
|
| + Locale("mk", "", ""),
|
| + Locale("nl", "", ""),
|
| + Locale("nl", "BE", ""),
|
| + Locale("no", "", ""),
|
| + Locale("pl", "", ""),
|
| + Locale("pt", "", ""),
|
| + Locale("ro", "", ""),
|
| + Locale("ru", "", ""),
|
| + Locale("sh", "", ""), // 40
|
| + Locale("sk", "", ""),
|
| + Locale("sl", "", ""),
|
| + Locale("sq", "", ""),
|
| + Locale("sr", "", ""),
|
| + Locale("sv", "", ""),
|
| + Locale("tr", "", ""),
|
| + Locale("uk", "", ""),
|
| + Locale("zh", "", ""),
|
| + Locale("zh", "TW", "") // 49
|
| + };
|
| + int32_t i;
|
| + for (i= 0; i < 49; i++) {
|
| + UnicodeString buffer;
|
| + logln(locale[i].getDisplayName(buffer));
|
| + UErrorCode success = U_ZERO_ERROR;
|
| +// form = (DecimalFormat*)NumberFormat::createCurrencyInstance(locale[i], success);
|
| + form = (DecimalFormat*)NumberFormat::createInstance(locale[i], success);
|
| + if (U_FAILURE(success)) {
|
| + errln("Err: Number Format ");
|
| + logln("Number format creation failed.");
|
| + continue;
|
| + }
|
| + Formattable result;
|
| + FieldPosition pos(0);
|
| + buffer.remove();
|
| + form->format(myNumber, buffer, pos);
|
| + success = U_ZERO_ERROR;
|
| + ParsePosition parsePos;
|
| + form->parse(buffer, result, parsePos);
|
| + logln(UnicodeString(" -> ") /* + << dec*/ + toString(result) + UnicodeString("[supposed output for result]"));
|
| + if (U_FAILURE(success)) {
|
| + errln("Err: Number Format parse");
|
| + logln("Number format parse failed.");
|
| + }
|
| + delete form;
|
| + }
|
| +}
|
| +
|
| +void TestMessageFormat::testBug1()
|
| +{
|
| + const double limit[] = {0.0, 1.0, 2.0};
|
| + const UnicodeString formats[] = {"0.0<=Arg<1.0",
|
| + "1.0<=Arg<2.0",
|
| + "2.0<-Arg"};
|
| + ChoiceFormat *cf = new ChoiceFormat(limit, formats, 3);
|
| + FieldPosition status(0);
|
| + UnicodeString toAppendTo;
|
| + cf->format((int32_t)1, toAppendTo, status);
|
| + if (toAppendTo != "1.0<=Arg<2.0") {
|
| + errln("ChoiceFormat cmp in testBug1");
|
| + }
|
| + logln(toAppendTo);
|
| + delete cf;
|
| +}
|
| +
|
| +void TestMessageFormat::testBug2()
|
| +{
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UnicodeString result;
|
| + // {sfb} use double format in pattern, so result will match (not strictly necessary)
|
| + const UnicodeString pattern = "There {0,choice,0#are no files|1#is one file|1<are {0, number} files} on disk {1}. ";
|
| + logln("The input pattern : " + pattern);
|
| + MessageFormat *fmt = new MessageFormat(pattern, status);
|
| + if (U_FAILURE(status)) {
|
| + errln("MessageFormat pattern creation failed.");
|
| + return;
|
| + }
|
| + logln("The output pattern is : " + fmt->toPattern(result));
|
| + if (pattern != result) {
|
| + errln("MessageFormat::toPattern() failed.");
|
| + }
|
| + delete fmt;
|
| +}
|
| +
|
| +#if 0
|
| +#if defined(_DEBUG) && U_IOSTREAM_SOURCE!=0
|
| +//----------------------------------------------------
|
| +// console I/O
|
| +//----------------------------------------------------
|
| +
|
| +#if U_IOSTREAM_SOURCE >= 199711
|
| +# include <iostream>
|
| + std::ostream& operator<<(std::ostream& stream, const Formattable& obj);
|
| +#elif U_IOSTREAM_SOURCE >= 198506
|
| +# include <iostream.h>
|
| + ostream& operator<<(ostream& stream, const Formattable& obj);
|
| +#endif
|
| +
|
| +#include "unicode/datefmt.h"
|
| +#include <stdlib.h>
|
| +#include <string.h>
|
| +
|
| +IntlTest&
|
| +operator<<( IntlTest& stream,
|
| + const Formattable& obj)
|
| +{
|
| + static DateFormat *defDateFormat = 0;
|
| +
|
| + UnicodeString buffer;
|
| + switch(obj.getType()) {
|
| + case Formattable::kDate :
|
| + if (defDateFormat == 0) {
|
| + defDateFormat = DateFormat::createInstance();
|
| + }
|
| + defDateFormat->format(obj.getDate(), buffer);
|
| + stream << buffer;
|
| + break;
|
| + case Formattable::kDouble :
|
| + char convert[20];
|
| + sprintf( convert, "%lf", obj.getDouble() );
|
| + stream << convert << "D";
|
| + break;
|
| + case Formattable::kLong :
|
| + stream << obj.getLong() << "L";
|
| + break;
|
| + case Formattable::kString:
|
| + stream << "\"" << obj.getString(buffer) << "\"";
|
| + break;
|
| + case Formattable::kArray:
|
| + int32_t i, count;
|
| + const Formattable* array;
|
| + array = obj.getArray(count);
|
| + stream << "[";
|
| + for (i=0; i<count; ++i) stream << array[i] << ( (i==(count-1)) ? "" : ", " );
|
| + stream << "]";
|
| + break;
|
| + default:
|
| + stream << "INVALID_Formattable";
|
| + }
|
| + return stream;
|
| +}
|
| +#endif /* defined(_DEBUG) && U_IOSTREAM_SOURCE!=0 */
|
| +#endif
|
| +
|
| +void TestMessageFormat::PatternTest()
|
| +{
|
| + Formattable testArgs[] = {
|
| + Formattable(double(1)), Formattable(double(3456)),
|
| + Formattable("Disk"), Formattable(UDate((int32_t)1000000000L), Formattable::kIsDate)
|
| + };
|
| + UnicodeString testCases[] = {
|
| + "Quotes '', '{', 'a' {0} '{0}'",
|
| + "Quotes '', '{', 'a' {0,number} '{0}'",
|
| + "'{'1,number,'#',##} {1,number,'#',##}",
|
| + "There are {1} files on {2} at {3}.",
|
| + "On {2}, there are {1} files, with {0,number,currency}.",
|
| + "'{1,number,percent}', {1,number,percent},",
|
| + "'{1,date,full}', {1,date,full},",
|
| + "'{3,date,full}', {3,date,full},",
|
| + "'{1,number,#,##}' {1,number,#,##}",
|
| + };
|
| +
|
| + UnicodeString testResultPatterns[] = {
|
| + "Quotes '', '{', a {0} '{'0}",
|
| + "Quotes '', '{', a {0,number} '{'0}",
|
| + "'{'1,number,#,##} {1,number,'#'#,##}",
|
| + "There are {1} files on {2} at {3}.",
|
| + "On {2}, there are {1} files, with {0,number,currency}.",
|
| + "'{'1,number,percent}, {1,number,percent},",
|
| + "'{'1,date,full}, {1,date,full},",
|
| + "'{'3,date,full}, {3,date,full},",
|
| + "'{'1,number,#,##} {1,number,#,##}"
|
| + };
|
| +
|
| + UnicodeString testResultStrings[] = {
|
| + "Quotes ', {, a 1 {0}",
|
| + "Quotes ', {, a 1 {0}",
|
| + "{1,number,#,##} #34,56",
|
| + "There are 3,456 files on Disk at 1/12/70 5:46 AM.",
|
| + "On Disk, there are 3,456 files, with $1.00.",
|
| + "{1,number,percent}, 345,600%,",
|
| + "{1,date,full}, Wednesday, December 31, 1969,",
|
| + "{3,date,full}, Monday, January 12, 1970,",
|
| + "{1,number,#,##} 34,56"
|
| + };
|
| +
|
| +
|
| + for (int32_t i = 0; i < 9; ++i) {
|
| + //it_out << "\nPat in: " << testCases[i]);
|
| +
|
| + MessageFormat *form = 0;
|
| + UErrorCode success = U_ZERO_ERROR;
|
| + UnicodeString buffer;
|
| + form = new MessageFormat(testCases[i], Locale::getUS(), success);
|
| + if (U_FAILURE(success)) {
|
| + dataerrln("MessageFormat creation failed.#1 - %s", u_errorName(success));
|
| + logln(((UnicodeString)"MessageFormat for ") + testCases[i] + " creation failed.\n");
|
| + continue;
|
| + }
|
| + if (form->toPattern(buffer) != testResultPatterns[i]) {
|
| + errln(UnicodeString("TestMessageFormat::PatternTest failed test #2, i = ") + i);
|
| + //form->toPattern(buffer);
|
| + errln(((UnicodeString)" Orig: ") + testCases[i]);
|
| + errln(((UnicodeString)" Exp: ") + testResultPatterns[i]);
|
| + errln(((UnicodeString)" Got: ") + buffer);
|
| + }
|
| +
|
| + //it_out << "Pat out: " << form->toPattern(buffer));
|
| + UnicodeString result;
|
| + int32_t count = 4;
|
| + FieldPosition fieldpos(0);
|
| + form->format(testArgs, count, result, fieldpos, success);
|
| + if (U_FAILURE(success)) {
|
| + dataerrln("MessageFormat failed test #3 - %s", u_errorName(success));
|
| + logln("TestMessageFormat::PatternTest failed test #3");
|
| + continue;
|
| + }
|
| + if (result != testResultStrings[i]) {
|
| + errln("TestMessageFormat::PatternTest failed test #4");
|
| + logln("TestMessageFormat::PatternTest failed #4.");
|
| + logln(UnicodeString(" Result: ") + result );
|
| + logln(UnicodeString(" Expected: ") + testResultStrings[i] );
|
| + }
|
| +
|
| +
|
| + //it_out << "Result: " << result);
|
| +#if 0
|
| + /* TODO: Look at this test and see if this is still a valid test */
|
| + logln("---------------- test parse ----------------");
|
| +
|
| + form->toPattern(buffer);
|
| + logln("MSG pattern for parse: " + buffer);
|
| +
|
| + int32_t parseCount = 0;
|
| + Formattable* values = form->parse(result, parseCount, success);
|
| + if (U_FAILURE(success)) {
|
| + errln("MessageFormat failed test #5");
|
| + logln(UnicodeString("MessageFormat failed test #5 with error code ")+(int32_t)success);
|
| + } else if (parseCount != count) {
|
| + errln("MSG count not %d as expected. Got %d", count, parseCount);
|
| + }
|
| + UBool failed = FALSE;
|
| + for (int32_t j = 0; j < parseCount; ++j) {
|
| + if (values == 0 || testArgs[j] != values[j]) {
|
| + errln(((UnicodeString)"MSG testargs[") + j + "]: " + toString(testArgs[j]));
|
| + errln(((UnicodeString)"MSG values[") + j + "] : " + toString(values[j]));
|
| + failed = TRUE;
|
| + }
|
| + }
|
| + if (failed)
|
| + errln("MessageFormat failed test #6");
|
| +#endif
|
| + delete form;
|
| + }
|
| +}
|
| +
|
| +void TestMessageFormat::sample()
|
| +{
|
| + MessageFormat *form = 0;
|
| + UnicodeString buffer1, buffer2;
|
| + UErrorCode success = U_ZERO_ERROR;
|
| + form = new MessageFormat("There are {0} files on {1}", success);
|
| + if (U_FAILURE(success)) {
|
| + errln("Err: Message format creation failed");
|
| + logln("Sample message format creation failed.");
|
| + return;
|
| + }
|
| + UnicodeString abc("abc");
|
| + UnicodeString def("def");
|
| + Formattable testArgs1[] = { abc, def };
|
| + FieldPosition fieldpos(0);
|
| + assertEquals("format",
|
| + "There are abc files on def",
|
| + form->format(testArgs1, 2, buffer2, fieldpos, success));
|
| + assertSuccess("format", success);
|
| + delete form;
|
| +}
|
| +
|
| +void TestMessageFormat::testStaticFormat()
|
| +{
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + Formattable arguments[] = {
|
| + (int32_t)7,
|
| + Formattable(UDate(8.71068e+011), Formattable::kIsDate),
|
| + "a disturbance in the Force"
|
| + };
|
| +
|
| + UnicodeString result;
|
| + result = MessageFormat::format(
|
| + "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
|
| + arguments,
|
| + 3,
|
| + result,
|
| + err);
|
| +
|
| + if (U_FAILURE(err)) {
|
| + dataerrln("TestMessageFormat::testStaticFormat #1 - %s", u_errorName(err));
|
| + logln(UnicodeString("TestMessageFormat::testStaticFormat failed test #1 with error code ")+(int32_t)err);
|
| + return;
|
| + }
|
| +
|
| + const UnicodeString expected(
|
| + "At 12:20:00 PM on Aug 8, 1997, there was a disturbance in the Force on planet 7.", "");
|
| + if (result != expected) {
|
| + errln("TestMessageFormat::testStaticFormat failed on test");
|
| + logln( UnicodeString(" Result: ") + result );
|
| + logln( UnicodeString(" Expected: ") + expected );
|
| + }
|
| +}
|
| +
|
| +/* When the default locale is tr, make sure that the pattern can still be parsed. */
|
| +void TestMessageFormat::TestTurkishCasing()
|
| +{
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + Locale saveDefaultLocale;
|
| + Locale::setDefault( Locale("tr"), err );
|
| +
|
| + Formattable arguments[] = {
|
| + (int32_t)7,
|
| + Formattable(UDate(8.71068e+011), Formattable::kIsDate),
|
| + "a disturbance in the Force"
|
| + };
|
| +
|
| + UnicodeString result;
|
| + result = MessageFormat::format(
|
| + "At {1,TIME} on {1,DATE,SHORT}, there was {2} on planet {0,NUMBER,INTEGER}.",
|
| + arguments,
|
| + 3,
|
| + result,
|
| + err);
|
| +
|
| + if (U_FAILURE(err)) {
|
| + dataerrln("TestTurkishCasing #1 with error code %s", u_errorName(err));
|
| + return;
|
| + }
|
| +
|
| + const UnicodeString expected(
|
| + "At 12:20:00 on 08.08.1997, there was a disturbance in the Force on planet 7.", "");
|
| + if (result != expected) {
|
| + errln("TestTurkishCasing failed on test");
|
| + errln( UnicodeString(" Result: ") + result );
|
| + errln( UnicodeString(" Expected: ") + expected );
|
| + }
|
| + Locale::setDefault( saveDefaultLocale, err );
|
| +}
|
| +
|
| +void TestMessageFormat::testSimpleFormat(/* char* par */)
|
| +{
|
| + logln("running TestMessageFormat::testSimpleFormat");
|
| +
|
| + UErrorCode err = U_ZERO_ERROR;
|
| +
|
| + Formattable testArgs1[] = {(int32_t)0, "MyDisk"};
|
| + Formattable testArgs2[] = {(int32_t)1, "MyDisk"};
|
| + Formattable testArgs3[] = {(int32_t)12, "MyDisk"};
|
| +
|
| + MessageFormat* form = new MessageFormat(
|
| + "The disk \"{1}\" contains {0} file(s).", err);
|
| +
|
| + UnicodeString string;
|
| + FieldPosition ignore(FieldPosition::DONT_CARE);
|
| + form->format(testArgs1, 2, string, ignore, err);
|
| + if (U_FAILURE(err) || string != "The disk \"MyDisk\" contains 0 file(s).") {
|
| + dataerrln(UnicodeString("TestMessageFormat::testSimpleFormat failed on test #1 - ") + u_errorName(err));
|
| + }
|
| +
|
| + ignore.setField(FieldPosition::DONT_CARE);
|
| + string.remove();
|
| + form->format(testArgs2, 2, string, ignore, err);
|
| + if (U_FAILURE(err) || string != "The disk \"MyDisk\" contains 1 file(s).") {
|
| + logln(string);
|
| + dataerrln(UnicodeString("TestMessageFormat::testSimpleFormat failed on test #2")+string + " - " + u_errorName(err));
|
| + }
|
| +
|
| + ignore.setField(FieldPosition::DONT_CARE);
|
| + string.remove();
|
| + form->format(testArgs3, 2, string, ignore, err);
|
| + if (U_FAILURE(err) || string != "The disk \"MyDisk\" contains 12 file(s).") {
|
| + dataerrln(UnicodeString("TestMessageFormat::testSimpleFormat failed on test #3")+string + " - " + u_errorName(err));
|
| + }
|
| +
|
| + delete form;
|
| + }
|
| +
|
| +void TestMessageFormat::testMsgFormatChoice(/* char* par */)
|
| +{
|
| + logln("running TestMessageFormat::testMsgFormatChoice");
|
| +
|
| + UErrorCode err = U_ZERO_ERROR;
|
| +
|
| + MessageFormat* form = new MessageFormat("The disk \"{1}\" contains {0}.", err);
|
| + double filelimits[] = {0,1,2};
|
| + UnicodeString filepart[] = {"no files","one file","{0,number} files"};
|
| + ChoiceFormat* fileform = new ChoiceFormat(filelimits, filepart, 3);
|
| + form->setFormat(1,*fileform); // NOT zero, see below
|
| + //is the format adopted?
|
| +
|
| + FieldPosition ignore(FieldPosition::DONT_CARE);
|
| + UnicodeString string;
|
| + Formattable testArgs1[] = {(int32_t)0, "MyDisk"};
|
| + form->format(testArgs1, 2, string, ignore, err);
|
| + if (string != "The disk \"MyDisk\" contains no files.") {
|
| + errln("TestMessageFormat::testMsgFormatChoice failed on test #1");
|
| + }
|
| +
|
| + ignore.setField(FieldPosition::DONT_CARE);
|
| + string.remove();
|
| + Formattable testArgs2[] = {(int32_t)1, "MyDisk"};
|
| + form->format(testArgs2, 2, string, ignore, err);
|
| + if (string != "The disk \"MyDisk\" contains one file.") {
|
| + errln("TestMessageFormat::testMsgFormatChoice failed on test #2");
|
| + }
|
| +
|
| + ignore.setField(FieldPosition::DONT_CARE);
|
| + string.remove();
|
| + Formattable testArgs3[] = {(int32_t)1273, "MyDisk"};
|
| + form->format(testArgs3, 2, string, ignore, err);
|
| + if (string != "The disk \"MyDisk\" contains 1,273 files.") {
|
| + dataerrln("TestMessageFormat::testMsgFormatChoice failed on test #3 - %s", u_errorName(err));
|
| + }
|
| +
|
| + delete form;
|
| + delete fileform;
|
| +}
|
| +
|
| +
|
| +void TestMessageFormat::testMsgFormatPlural(/* char* par */)
|
| +{
|
| + logln("running TestMessageFormat::testMsgFormatPlural");
|
| +
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + UnicodeString t1("{0, plural, one{C''est # fichier} other{Ce sont # fichiers}} dans la liste.");
|
| + UnicodeString t2("{argument, plural, one{C''est # fichier} other {Ce sont # fichiers}} dans la liste.");
|
| + UnicodeString t3("There {0, plural, one{is # zavod}few{are {0, number,###.0} zavoda} other{are # zavodov}} in the directory.");
|
| + UnicodeString t4("There {argument, plural, one{is # zavod}few{are {argument, number,###.0} zavoda} other{are #zavodov}} in the directory.");
|
| + UnicodeString t5("{0, plural, one {{0, number,C''''est #,##0.0# fichier}} other {Ce sont # fichiers}} dans la liste.");
|
| + MessageFormat* mfNum = new MessageFormat(t1, Locale("fr"), err);
|
| + if (U_FAILURE(err)) {
|
| + dataerrln("TestMessageFormat::testMsgFormatPlural #1 - argumentIndex - %s", u_errorName(err));
|
| + logln(UnicodeString("TestMessageFormat::testMsgFormatPlural #1 with error code ")+(int32_t)err);
|
| + return;
|
| + }
|
| + Formattable testArgs1((int32_t)0);
|
| + FieldPosition ignore(FieldPosition::DONT_CARE);
|
| + UnicodeString numResult1;
|
| + mfNum->format(&testArgs1, 1, numResult1, ignore, err);
|
| +
|
| + MessageFormat* mfAlpha = new MessageFormat(t2, Locale("fr"), err);
|
| + UnicodeString argName[] = {UnicodeString("argument")};
|
| + UnicodeString argNameResult;
|
| + mfAlpha->format(argName, &testArgs1, 1, argNameResult, err);
|
| + if (U_FAILURE(err)) {
|
| + errln("TestMessageFormat::testMsgFormatPlural #1 - argumentName");
|
| + logln(UnicodeString("TestMessageFormat::testMsgFormatPlural #1 with error code ")+(int32_t)err);
|
| + delete mfNum;
|
| + return;
|
| + }
|
| + if ( numResult1 != argNameResult){
|
| + errln("TestMessageFormat::testMsgFormatPlural #1");
|
| + logln(UnicodeString("The results of argumentName and argumentIndex are not the same."));
|
| + }
|
| + if ( numResult1 != UnicodeString("C\'est 0 fichier dans la liste.")) {
|
| + errln("TestMessageFormat::testMsgFormatPlural #1");
|
| + logln(UnicodeString("The results of argumentName and argumentIndex are not the same."));
|
| + }
|
| + err = U_ZERO_ERROR;
|
| +
|
| + delete mfNum;
|
| + delete mfAlpha;
|
| +
|
| + MessageFormat* mfNum2 = new MessageFormat(t3, Locale("ru"), err);
|
| + numResult1.remove();
|
| + Formattable testArgs2((int32_t)4);
|
| + mfNum2->format(&testArgs2, 1, numResult1, ignore, err);
|
| + MessageFormat* mfAlpha2 = new MessageFormat(t4, Locale("ru"), err);
|
| + argNameResult.remove();
|
| + mfAlpha2->format(argName, &testArgs2, 1, argNameResult, err);
|
| +
|
| + if (U_FAILURE(err)) {
|
| + errln("TestMessageFormat::testMsgFormatPlural #2 - argumentName");
|
| + logln(UnicodeString("TestMessageFormat::testMsgFormatPlural #2 with error code ")+(int32_t)err);
|
| + delete mfNum2;
|
| + return;
|
| + }
|
| + if ( numResult1 != argNameResult){
|
| + errln("TestMessageFormat::testMsgFormatPlural #2");
|
| + logln(UnicodeString("The results of argumentName and argumentIndex are not the same."));
|
| + }
|
| + if ( numResult1 != UnicodeString("There are 4,0 zavoda in the directory.")) {
|
| + errln("TestMessageFormat::testMsgFormatPlural #2");
|
| + logln(UnicodeString("The results of argumentName and argumentIndex are not the same."));
|
| + }
|
| +
|
| + delete mfNum2;
|
| + delete mfAlpha2;
|
| +
|
| + // nested formats
|
| + err = U_ZERO_ERROR;
|
| + MessageFormat* msgFmt = new MessageFormat(t5, Locale("fr"), err);
|
| + if (U_FAILURE(err)) {
|
| + errln("TestMessageFormat::test nested PluralFormat with argumentName");
|
| + logln(UnicodeString("TestMessageFormat::test nested PluralFormat with error code ")+(int32_t)err);
|
| + delete msgFmt;
|
| + return;
|
| + }
|
| + Formattable testArgs3((int32_t)0);
|
| + argNameResult.remove();
|
| + msgFmt->format(&testArgs3, 1, argNameResult, ignore, err);
|
| + if (U_FAILURE(err)) {
|
| + errln("TestMessageFormat::test nested PluralFormat with argumentName");
|
| + }
|
| + if ( argNameResult!= UnicodeString("C'est 0,0 fichier dans la liste.")) {
|
| + errln(UnicodeString("TestMessageFormat::test nested named PluralFormat."));
|
| + logln(UnicodeString("The unexpected nested named PluralFormat."));
|
| + }
|
| + delete msgFmt;
|
| +}
|
| +
|
| +void TestMessageFormat::internalFormat(MessageFormat* msgFmt ,
|
| + Formattable* args , int32_t numOfArgs ,
|
| + UnicodeString expected ,char* errMsg)
|
| +{
|
| + UnicodeString result;
|
| + FieldPosition ignore(FieldPosition::DONT_CARE);
|
| + UErrorCode status = U_ZERO_ERROR;
|
| +
|
| + //Format with passed arguments
|
| + msgFmt->format( args , numOfArgs , result, ignore, status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln( "%serror while formatting with ErrorCode as %s" ,errMsg, u_errorName(status) );
|
| + }
|
| + //Compare expected with obtained result
|
| + if ( result!= expected ) {
|
| + UnicodeString err = UnicodeString(errMsg);
|
| + err+= UnicodeString(":Unexpected Result \n Expected: " + expected + "\n Obtained: " + result + "\n");
|
| + dataerrln(err);
|
| + }
|
| +}
|
| +
|
| +MessageFormat* TestMessageFormat::internalCreate(
|
| + UnicodeString pattern ,Locale locale ,UErrorCode &status , char* errMsg)
|
| +{
|
| + //Create the MessageFormat with simple SelectFormat
|
| + MessageFormat* msgFmt = new MessageFormat(pattern, locale, status);
|
| + if (U_FAILURE(status)) {
|
| + dataerrln( "%serror while constructing with ErrorCode as %s" ,errMsg, u_errorName(status) );
|
| + logln(UnicodeString("TestMessageFormat::testMsgFormatSelect #1 with error code ")+(int32_t)status);
|
| + return NULL;
|
| + }
|
| + return msgFmt;
|
| +}
|
| +
|
| +void TestMessageFormat::testMsgFormatSelect(/* char* par */)
|
| +{
|
| + logln("running TestMessageFormat::testMsgFormatSelect");
|
| +
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + //French Pattern
|
| + UnicodeString t1("{0} est {1, select, female {all\\u00E9e} other {all\\u00E9}} \\u00E0 Paris.");
|
| +
|
| + err = U_ZERO_ERROR;
|
| + //Create the MessageFormat with simple French pattern
|
| + MessageFormat* msgFmt1 = internalCreate(t1.unescape(), Locale("fr"),err,(char*)"From TestMessageFormat::TestSelectFormat create t1");
|
| + if (!U_FAILURE(err)) {
|
| + //Arguments
|
| + Formattable testArgs10[] = {"Kirti","female"};
|
| + Formattable testArgs11[] = {"Victor","other"};
|
| + Formattable testArgs12[] = {"Ash","unknown"};
|
| + Formattable* testArgs[] = {testArgs10,testArgs11,testArgs12};
|
| + UnicodeString exp[] = {
|
| + "Kirti est all\\u00E9e \\u00E0 Paris." ,
|
| + "Victor est all\\u00E9 \\u00E0 Paris.",
|
| + "Ash est all\\u00E9 \\u00E0 Paris."};
|
| + //Format
|
| + for( int i=0; i< 3; i++){
|
| + internalFormat( msgFmt1 , testArgs[i], 2, exp[i].unescape() ,(char*)"From TestMessageFormat::testSelectFormat format t1");
|
| + }
|
| + }
|
| + delete msgFmt1;
|
| +
|
| + //Quoted French Pattern
|
| + UnicodeString t2("{0} est {1, select, female {all\\u00E9e c''est} other {all\\u00E9 c''est}} \\u00E0 Paris.");
|
| + err = U_ZERO_ERROR;
|
| + //Create the MessageFormat with Quoted French pattern
|
| + MessageFormat* msgFmt2 = internalCreate(t2.unescape(), Locale("fr"),err,(char*)"From TestMessageFormat::TestSelectFormat create t2");
|
| + if (!U_FAILURE(err)) {
|
| + //Arguments
|
| + Formattable testArgs10[] = {"Kirti","female"};
|
| + Formattable testArgs11[] = {"Victor","other"};
|
| + Formattable testArgs12[] = {"Ash","male"};
|
| + Formattable* testArgs[] = {testArgs10,testArgs11,testArgs12};
|
| + UnicodeString exp[] = {
|
| + "Kirti est all\\u00E9e c'est \\u00E0 Paris." ,
|
| + "Victor est all\\u00E9 c'est \\u00E0 Paris.",
|
| + "Ash est all\\u00E9 c'est \\u00E0 Paris."};
|
| + //Format
|
| + for( int i=0; i< 3; i++){
|
| + internalFormat( msgFmt2 , testArgs[i], 2, exp[i].unescape() ,(char*)"From TestMessageFormat::testSelectFormat format t2");
|
| + }
|
| + }
|
| + delete msgFmt2;
|
| +
|
| + //English Pattern
|
| + UnicodeString t3("{0, select , male {MALE FR company} female {FEMALE FR company} other {FR otherValue}} published new books.");
|
| + err = U_ZERO_ERROR;
|
| + //Create the MessageFormat with English pattern
|
| + MessageFormat* msgFmt3 = internalCreate(t3, Locale("en"),err,(char*)"From TestMessageFormat::TestSelectFormat create t3");
|
| + if (!U_FAILURE(err)) {
|
| + //Arguments
|
| + Formattable testArgs10[] = {"female"};
|
| + Formattable testArgs11[] = {"other"};
|
| + Formattable testArgs12[] = {"male"};
|
| + Formattable* testArgs[] = {testArgs10,testArgs11,testArgs12};
|
| + UnicodeString exp[] = {
|
| + "FEMALE FR company published new books." ,
|
| + "FR otherValue published new books.",
|
| + "MALE FR company published new books."};
|
| + //Format
|
| + for( int i=0; i< 3; i++){
|
| + internalFormat( msgFmt3 , testArgs[i], 1, exp[i] ,(char*)"From TestMessageFormat::testSelectFormat format t3");
|
| + }
|
| + }
|
| + delete msgFmt3;
|
| +
|
| + //Nested patterns with plural, number ,choice ,select format etc.
|
| + //Select Format with embedded number format
|
| + UnicodeString t4("{0} est {1, select, female {{2,number,integer} all\\u00E9e} other {all\\u00E9}} \\u00E0 Paris.");
|
| + //Create the MessageFormat with Select Format with embedded number format (nested pattern)
|
| + MessageFormat* msgFmt4 = internalCreate(t4.unescape(), Locale("fr"),err,(char*)"From TestMessageFormat::TestSelectFormat create t4");
|
| + if (!U_FAILURE(err)) {
|
| + //Arguments
|
| + Formattable testArgs10[] = {"Kirti","female",(int32_t)6};
|
| + Formattable testArgs11[] = {"Kirti","female",100.100};
|
| + Formattable testArgs12[] = {"Kirti","other",(int32_t)6};
|
| + Formattable* testArgs[] = {testArgs10,testArgs11,testArgs12};
|
| + UnicodeString exp[] = {
|
| + "Kirti est 6 all\\u00E9e \\u00E0 Paris." ,
|
| + "Kirti est 100 all\\u00E9e \\u00E0 Paris.",
|
| + "Kirti est all\\u00E9 \\u00E0 Paris."};
|
| + //Format
|
| + for( int i=0; i< 3; i++){
|
| + internalFormat( msgFmt4 , testArgs[i], 3, exp[i].unescape() ,(char*)"From TestMessageFormat::testSelectFormat format t4");
|
| + }
|
| + }
|
| + delete msgFmt4;
|
| +
|
| + err = U_ZERO_ERROR;
|
| + //Plural format with embedded select format
|
| + UnicodeString t5("{0} {1, plural, one {est {2, select, female {all\\u00E9e} other {all\\u00E9}}} other {sont {2, select, female {all\\u00E9es} other {all\\u00E9s}}}} \\u00E0 Paris.");
|
| + err = U_ZERO_ERROR;
|
| + //Create the MessageFormat with Plural format with embedded select format(nested pattern)
|
| + MessageFormat* msgFmt5 = internalCreate(t5.unescape(), Locale("fr"),err,(char*)"From TestMessageFormat::TestSelectFormat create t5");
|
| + if (!U_FAILURE(err)) {
|
| + //Arguments
|
| + Formattable testArgs10[] = {"Kirti",(int32_t)6,"female"};
|
| + Formattable testArgs11[] = {"Kirti",(int32_t)1,"female"};
|
| + Formattable testArgs12[] = {"Ash",(int32_t)1,"other"};
|
| + Formattable testArgs13[] = {"Ash",(int32_t)5,"other"};
|
| + Formattable* testArgs[] = {testArgs10,testArgs11,testArgs12,testArgs13};
|
| + UnicodeString exp[] = {
|
| + "Kirti sont all\\u00E9es \\u00E0 Paris." ,
|
| + "Kirti est all\\u00E9e \\u00E0 Paris.",
|
| + "Ash est all\\u00E9 \\u00E0 Paris.",
|
| + "Ash sont all\\u00E9s \\u00E0 Paris."};
|
| + //Format
|
| + for( int i=0; i< 4; i++){
|
| + internalFormat( msgFmt5 , testArgs[i], 3, exp[i].unescape() ,(char*)"From TestMessageFormat::testSelectFormat format t5");
|
| + }
|
| + }
|
| + delete msgFmt5;
|
| +
|
| + err = U_ZERO_ERROR;
|
| + //Select, plural, and number formats heavily nested
|
| + UnicodeString t6("{0} und {1, select, female {{2, plural, one {{3, select, female {ihre Freundin} other {ihr Freund}} } other {ihre {2, number, integer} {3, select, female {Freundinnen} other {Freunde}} } }} other{{2, plural, one {{3, select, female {seine Freundin} other {sein Freund}}} other {seine {2, number, integer} {3, select, female {Freundinnen} other {Freunde}}}}} } gingen nach Paris.");
|
| + //Create the MessageFormat with Select, plural, and number formats heavily nested
|
| + MessageFormat* msgFmt6 = internalCreate(t6, Locale("de"),err,(char*)"From TestMessageFormat::TestSelectFormat create t6");
|
| + if (!U_FAILURE(err)) {
|
| + //Arguments
|
| + Formattable testArgs10[] = {"Kirti","other",(int32_t)1,"other"};
|
| + Formattable testArgs11[] = {"Kirti","other",(int32_t)6,"other"};
|
| + Formattable testArgs12[] = {"Kirti","other",(int32_t)1,"female"};
|
| + Formattable testArgs13[] = {"Kirti","other",(int32_t)3,"female"};
|
| + Formattable testArgs14[] = {"Kirti","female",(int32_t)1,"female"};
|
| + Formattable testArgs15[] = {"Kirti","female",(int32_t)5,"female"};
|
| + Formattable testArgs16[] = {"Kirti","female",(int32_t)1,"other"};
|
| + Formattable testArgs17[] = {"Kirti","female",(int32_t)5,"other"};
|
| + Formattable testArgs18[] = {"Kirti","mixed",(int32_t)1,"mixed"};
|
| + Formattable testArgs19[] = {"Kirti","mixed",(int32_t)1,"other"};
|
| + Formattable testArgs20[] = {"Kirti","female",(int32_t)1,"mixed"};
|
| + Formattable testArgs21[] = {"Kirti","mixed",(int32_t)5,"mixed"};
|
| + Formattable testArgs22[] = {"Kirti","mixed",(int32_t)5,"other"};
|
| + Formattable testArgs23[] = {"Kirti","female",(int32_t)5,"mixed"};
|
| + Formattable* testArgs[] = {testArgs10,testArgs11,testArgs12,testArgs13,
|
| + testArgs14,testArgs15,testArgs16,testArgs17,
|
| + testArgs18,testArgs19,testArgs20,testArgs21,
|
| + testArgs22,testArgs23 };
|
| + UnicodeString exp[] = {
|
| + "Kirti und sein Freund gingen nach Paris." ,
|
| + "Kirti und seine 6 Freunde gingen nach Paris." ,
|
| + "Kirti und seine Freundin gingen nach Paris.",
|
| + "Kirti und seine 3 Freundinnen gingen nach Paris.",
|
| + "Kirti und ihre Freundin gingen nach Paris.",
|
| + "Kirti und ihre 5 Freundinnen gingen nach Paris.",
|
| + "Kirti und ihr Freund gingen nach Paris.",
|
| + "Kirti und ihre 5 Freunde gingen nach Paris.",
|
| + "Kirti und sein Freund gingen nach Paris.",
|
| + "Kirti und sein Freund gingen nach Paris.",
|
| + "Kirti und ihr Freund gingen nach Paris.",
|
| + "Kirti und seine 5 Freunde gingen nach Paris." ,
|
| + "Kirti und seine 5 Freunde gingen nach Paris." ,
|
| + "Kirti und ihre 5 Freunde gingen nach Paris."
|
| + };
|
| + //Format
|
| + for( int i=0; i< 14; i++){
|
| + internalFormat( msgFmt6 , testArgs[i], 4, exp[i] ,(char*)"From TestMessageFormat::testSelectFormat format t6");
|
| + }
|
| + }
|
| + delete msgFmt6;
|
| +}
|
| +
|
| +//---------------------------------
|
| +// API Tests
|
| +//---------------------------------
|
| +
|
| +void TestMessageFormat::testCopyConstructor()
|
| +{
|
| + UErrorCode success = U_ZERO_ERROR;
|
| + MessageFormat *x = new MessageFormat("There are {0} files on {1}", success);
|
| + MessageFormat *z = new MessageFormat("There are {0} files on {1} created", success);
|
| + MessageFormat *y = 0;
|
| + y = new MessageFormat(*x);
|
| + if ( (*x == *y) &&
|
| + (*x != *z) &&
|
| + (*y != *z) )
|
| + logln("First test (operator ==): Passed!");
|
| + else {
|
| + errln("TestMessageFormat::testCopyConstructor failed #1");
|
| + logln("First test (operator ==): Failed!");
|
| + }
|
| + if ( ((*x == *y) && (*y == *x)) &&
|
| + ((*x != *z) && (*z != *x)) &&
|
| + ((*y != *z) && (*z != *y)) )
|
| + logln("Second test (equals): Passed!");
|
| + else {
|
| + errln("TestMessageFormat::testCopyConstructor failed #2");
|
| + logln("Second test (equals): Failed!");
|
| + }
|
| +
|
| + delete x;
|
| + delete y;
|
| + delete z;
|
| +}
|
| +
|
| +
|
| +void TestMessageFormat::testAssignment()
|
| +{
|
| + UErrorCode success = U_ZERO_ERROR;
|
| + MessageFormat *x = new MessageFormat("There are {0} files on {1}", success);
|
| + MessageFormat *z = new MessageFormat("There are {0} files on {1} created", success);
|
| + MessageFormat *y = new MessageFormat("There are {0} files on {1} created", success);
|
| + *y = *x;
|
| + if ( (*x == *y) &&
|
| + (*x != *z) &&
|
| + (*y != *z) )
|
| + logln("First test (operator ==): Passed!");
|
| + else {
|
| + errln( "TestMessageFormat::testAssignment failed #1");
|
| + logln("First test (operator ==): Failed!");
|
| + }
|
| + if ( ((*x == *y) && (*y == *x)) &&
|
| + ((*x != *z) && (*z != *x)) &&
|
| + ((*y != *z) && (*z != *y)) )
|
| + logln("Second test (equals): Passed!");
|
| + else {
|
| + errln("TestMessageFormat::testAssignment failed #2");
|
| + logln("Second test (equals): Failed!");
|
| + }
|
| +
|
| + delete x;
|
| + delete y;
|
| + delete z;
|
| +}
|
| +
|
| +void TestMessageFormat::testClone()
|
| +{
|
| + UErrorCode success = U_ZERO_ERROR;
|
| + MessageFormat *x = new MessageFormat("There are {0} files on {1}", success);
|
| + MessageFormat *z = new MessageFormat("There are {0} files on {1} created", success);
|
| + MessageFormat *y = 0;
|
| + y = (MessageFormat*)x->clone();
|
| + if ( (*x == *y) &&
|
| + (*x != *z) &&
|
| + (*y != *z) )
|
| + logln("First test (operator ==): Passed!");
|
| + else {
|
| + errln("TestMessageFormat::testClone failed #1");
|
| + logln("First test (operator ==): Failed!");
|
| + }
|
| + if ( ((*x == *y) && (*y == *x)) &&
|
| + ((*x != *z) && (*z != *x)) &&
|
| + ((*y != *z) && (*z != *y)) )
|
| + logln("Second test (equals): Passed!");
|
| + else {
|
| + errln("TestMessageFormat::testClone failed #2");
|
| + logln("Second test (equals): Failed!");
|
| + }
|
| +
|
| + delete x;
|
| + delete y;
|
| + delete z;
|
| +}
|
| +
|
| +void TestMessageFormat::testEquals()
|
| +{
|
| + UErrorCode success = U_ZERO_ERROR;
|
| + MessageFormat x("There are {0} files on {1}", success);
|
| + MessageFormat y("There are {0} files on {1}", success);
|
| + if (!(x == y)) {
|
| + errln( "TestMessageFormat::testEquals failed #1");
|
| + logln("First test (operator ==): Failed!");
|
| + }
|
| +
|
| +}
|
| +
|
| +void TestMessageFormat::testNotEquals()
|
| +{
|
| + UErrorCode success = U_ZERO_ERROR;
|
| + MessageFormat x("There are {0} files on {1}", success);
|
| + MessageFormat y(x);
|
| + y.setLocale(Locale("fr"));
|
| + if (!(x != y)) {
|
| + errln( "TestMessageFormat::testEquals failed #1");
|
| + logln("First test (operator !=): Failed!");
|
| + }
|
| + y = x;
|
| + y.applyPattern("There are {0} files on {1} the disk", success);
|
| + if (!(x != y)) {
|
| + errln( "TestMessageFormat::testEquals failed #1");
|
| + logln("Second test (operator !=): Failed!");
|
| + }
|
| +}
|
| +
|
| +
|
| +void TestMessageFormat::testSetLocale()
|
| +{
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + GregorianCalendar cal(err);
|
| + Formattable arguments[] = {
|
| + 456.83,
|
| + Formattable(UDate(8.71068e+011), Formattable::kIsDate),
|
| + "deposit"
|
| + };
|
| +
|
| + UnicodeString result;
|
| +
|
| + //UnicodeString formatStr = "At {1,time} on {1,date}, you made a {2} of {0,number,currency}.";
|
| + UnicodeString formatStr = "At <time> on {1,date}, you made a {2} of {0,number,currency}.";
|
| + // {sfb} to get $, would need Locale::US, not Locale::ENGLISH
|
| + // Just use unlocalized currency symbol.
|
| + //UnicodeString compareStrEng = "At <time> on Aug 8, 1997, you made a deposit of $456.83.";
|
| + UnicodeString compareStrEng = "At <time> on Aug 8, 1997, you made a deposit of ";
|
| + compareStrEng += (UChar) 0x00a4;
|
| + compareStrEng += "456.83.";
|
| + // {sfb} to get DM, would need Locale::GERMANY, not Locale::GERMAN
|
| + // Just use unlocalized currency symbol.
|
| + //UnicodeString compareStrGer = "At <time> on 08.08.1997, you made a deposit of 456,83 DM.";
|
| + UnicodeString compareStrGer = "At <time> on 08.08.1997, you made a deposit of ";
|
| + compareStrGer += "456,83";
|
| + compareStrGer += (UChar) 0x00a0;
|
| + compareStrGer += (UChar) 0x00a4;
|
| + compareStrGer += ".";
|
| +
|
| + MessageFormat msg( formatStr, err);
|
| + result = "";
|
| + FieldPosition pos(0);
|
| + result = msg.format(
|
| + arguments,
|
| + 3,
|
| + result,
|
| + pos,
|
| + err);
|
| +
|
| + logln(result);
|
| + if (result != compareStrEng) {
|
| + dataerrln("*** MSG format err. - %s", u_errorName(err));
|
| + }
|
| +
|
| + msg.setLocale(Locale::getEnglish());
|
| + UBool getLocale_ok = TRUE;
|
| + if (msg.getLocale() != Locale::getEnglish()) {
|
| + errln("*** MSG getLocal err.");
|
| + getLocale_ok = FALSE;
|
| + }
|
| +
|
| + msg.setLocale(Locale::getGerman());
|
| +
|
| + if (msg.getLocale() != Locale::getGerman()) {
|
| + errln("*** MSG getLocal err.");
|
| + getLocale_ok = FALSE;
|
| + }
|
| +
|
| + msg.applyPattern( formatStr, err);
|
| +
|
| + pos.setField(0);
|
| + result = "";
|
| + result = msg.format(
|
| + arguments,
|
| + 3,
|
| + result,
|
| + pos,
|
| + err);
|
| +
|
| + logln(result);
|
| + if (result == compareStrGer) {
|
| + logln("MSG setLocale tested.");
|
| + }else{
|
| + dataerrln( "*** MSG setLocale err. - %s", u_errorName(err));
|
| + }
|
| +
|
| + if (getLocale_ok) {
|
| + logln("MSG getLocale tested.");
|
| + }
|
| +}
|
| +
|
| +void TestMessageFormat::testFormat()
|
| +{
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + GregorianCalendar cal(err);
|
| +
|
| + const Formattable ftarray[] =
|
| + {
|
| + Formattable( UDate(8.71068e+011), Formattable::kIsDate )
|
| + };
|
| + const int32_t ft_cnt = sizeof(ftarray) / sizeof(Formattable);
|
| + Formattable ft_arr( ftarray, ft_cnt );
|
| +
|
| + Formattable* fmt = new Formattable(UDate(8.71068e+011), Formattable::kIsDate);
|
| +
|
| + UnicodeString result;
|
| +
|
| + //UnicodeString formatStr = "At {1,time} on {1,date}, you made a {2} of {0,number,currency}.";
|
| + UnicodeString formatStr = "On {0,date}, it began.";
|
| + UnicodeString compareStr = "On Aug 8, 1997, it began.";
|
| +
|
| + err = U_ZERO_ERROR;
|
| + MessageFormat msg( formatStr, err);
|
| + FieldPosition fp(0);
|
| +
|
| + result = "";
|
| + fp = 0;
|
| + result = msg.format(
|
| + *fmt,
|
| + result,
|
| + //FieldPosition(0),
|
| + fp,
|
| + err);
|
| +
|
| + if (err != U_ILLEGAL_ARGUMENT_ERROR) {
|
| + dataerrln("*** MSG format without expected error code. - %s", u_errorName(err));
|
| + }
|
| + err = U_ZERO_ERROR;
|
| +
|
| + result = "";
|
| + fp = 0;
|
| + result = msg.format(
|
| + ft_arr,
|
| + result,
|
| + //FieldPosition(0),
|
| + fp,
|
| + err);
|
| +
|
| + logln("MSG format( Formattable&, ... ) expected:" + compareStr);
|
| + logln("MSG format( Formattable&, ... ) result:" + result);
|
| + if (result != compareStr) {
|
| + dataerrln("*** MSG format( Formattable&, .... ) err. - %s", u_errorName(err));
|
| + }else{
|
| + logln("MSG format( Formattable&, ... ) tested.");
|
| + }
|
| +
|
| + delete fmt;
|
| +
|
| +}
|
| +
|
| +void TestMessageFormat::testParse()
|
| +{
|
| + UErrorCode err = U_ZERO_ERROR;
|
| + int32_t count;
|
| + UnicodeString msgFormatString = "{0} =sep= {1}";
|
| + MessageFormat msg( msgFormatString, err);
|
| + UnicodeString source = "abc =sep= def";
|
| + UnicodeString tmp1, tmp2;
|
| +
|
| + Formattable* fmt_arr = msg.parse( source, count, err );
|
| + if (U_FAILURE(err) || (!fmt_arr)) {
|
| + errln("*** MSG parse (ustring, count, err) error.");
|
| + }else{
|
| + logln("MSG parse -- count: %d", count);
|
| + if (count != 2) {
|
| + errln("*** MSG parse (ustring, count, err) count err.");
|
| + }else{
|
| + if ((fmt_arr[0].getType() == Formattable::kString)
|
| + && (fmt_arr[1].getType() == Formattable::kString)
|
| + && (fmt_arr[0].getString(tmp1) == "abc")
|
| + && (fmt_arr[1].getString(tmp2) == "def")) {
|
| + logln("MSG parse (ustring, count, err) tested.");
|
| + }else{
|
| + errln("*** MSG parse (ustring, count, err) result err.");
|
| + }
|
| + }
|
| + }
|
| + delete[] fmt_arr;
|
| +
|
| + ParsePosition pp(0);
|
| +
|
| + fmt_arr = msg.parse( source, pp, count );
|
| + if ((pp == 0) || (!fmt_arr)) {
|
| + errln("*** MSG parse (ustring, parsepos., count) error.");
|
| + }else{
|
| + logln("MSG parse -- count: %d", count);
|
| + if (count != 2) {
|
| + errln("*** MSG parse (ustring, parsepos., count) count err.");
|
| + }else{
|
| + if ((fmt_arr[0].getType() == Formattable::kString)
|
| + && (fmt_arr[1].getType() == Formattable::kString)
|
| + && (fmt_arr[0].getString(tmp1) == "abc")
|
| + && (fmt_arr[1].getString(tmp2) == "def")) {
|
| + logln("MSG parse (ustring, parsepos., count) tested.");
|
| + }else{
|
| + errln("*** MSG parse (ustring, parsepos., count) result err.");
|
| + }
|
| + }
|
| + }
|
| + delete[] fmt_arr;
|
| +
|
| + pp = 0;
|
| + Formattable fmta;
|
| +
|
| + msg.parseObject( source, fmta, pp );
|
| + if (pp == 0) {
|
| + errln("*** MSG parse (ustring, Formattable, parsepos ) error.");
|
| + }else{
|
| + logln("MSG parse -- count: %d", count);
|
| + fmta.getArray(count);
|
| + if (count != 2) {
|
| + errln("*** MSG parse (ustring, Formattable, parsepos ) count err.");
|
| + }else{
|
| + if ((fmta[0].getType() == Formattable::kString)
|
| + && (fmta[1].getType() == Formattable::kString)
|
| + && (fmta[0].getString(tmp1) == "abc")
|
| + && (fmta[1].getString(tmp2) == "def")) {
|
| + logln("MSG parse (ustring, Formattable, parsepos ) tested.");
|
| + }else{
|
| + errln("*** MSG parse (ustring, Formattable, parsepos ) result err.");
|
| + }
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +void TestMessageFormat::testAdopt()
|
| +{
|
| + UErrorCode err = U_ZERO_ERROR;
|
| +
|
| + UnicodeString formatStr("{0,date},{1},{2,number}", "");
|
| + UnicodeString formatStrChange("{0,number},{1,number},{2,date}", "");
|
| + err = U_ZERO_ERROR;
|
| + MessageFormat msg( formatStr, err);
|
| + MessageFormat msgCmp( formatStr, err);
|
| + int32_t count, countCmp;
|
| + const Format** formats = msg.getFormats(count);
|
| + const Format** formatsCmp = msgCmp.getFormats(countCmp);
|
| + const Format** formatsChg = 0;
|
| + const Format** formatsAct = 0;
|
| + int32_t countAct;
|
| + const Format* a;
|
| + const Format* b;
|
| + UnicodeString patCmp;
|
| + UnicodeString patAct;
|
| + Format** formatsToAdopt;
|
| +
|
| + if (!formats || !formatsCmp || (count <= 0) || (count != countCmp)) {
|
| + dataerrln("Error getting Formats");
|
| + return;
|
| + }
|
| +
|
| + int32_t i;
|
| +
|
| + for (i = 0; i < count; i++) {
|
| + a = formats[i];
|
| + b = formatsCmp[i];
|
| + if ((a != NULL) && (b != NULL)) {
|
| + if (*a != *b) {
|
| + errln("a != b");
|
| + return;
|
| + }
|
| + }else if ((a != NULL) || (b != NULL)) {
|
| + errln("(a != NULL) || (b != NULL)");
|
| + return;
|
| + }
|
| + }
|
| +
|
| + msg.applyPattern( formatStrChange, err ); //set msg formats to something different
|
| + int32_t countChg;
|
| + formatsChg = msg.getFormats(countChg); // tested function
|
| + if (!formatsChg || (countChg != count)) {
|
| + errln("Error getting Formats");
|
| + return;
|
| + }
|
| +
|
| + UBool diff;
|
| + diff = TRUE;
|
| + for (i = 0; i < count; i++) {
|
| + a = formatsChg[i];
|
| + b = formatsCmp[i];
|
| + if ((a != NULL) && (b != NULL)) {
|
| + if (*a == *b) {
|
| + logln("formatsChg == formatsCmp at index %d", i);
|
| + diff = FALSE;
|
| + }
|
| + }
|
| + }
|
| + if (!diff) {
|
| + errln("*** MSG getFormats diff err.");
|
| + return;
|
| + }
|
| +
|
| + logln("MSG getFormats tested.");
|
| +
|
| + msg.setFormats( formatsCmp, countCmp ); //tested function
|
| +
|
| + formatsAct = msg.getFormats(countAct);
|
| + if (!formatsAct || (countAct <=0) || (countAct != countCmp)) {
|
| + errln("Error getting Formats");
|
| + return;
|
| + }
|
| +
|
| + assertEquals("msgCmp.toPattern()", formatStr, msgCmp.toPattern(patCmp.remove()));
|
| + assertEquals("msg.toPattern()", formatStr, msg.toPattern(patAct.remove()));
|
| +
|
| + for (i = 0; i < countAct; i++) {
|
| + a = formatsAct[i];
|
| + b = formatsCmp[i];
|
| + if ((a != NULL) && (b != NULL)) {
|
| + if (*a != *b) {
|
| + logln("formatsAct != formatsCmp at index %d", i);
|
| + errln("a != b");
|
| + return;
|
| + }
|
| + }else if ((a != NULL) || (b != NULL)) {
|
| + errln("(a != NULL) || (b != NULL)");
|
| + return;
|
| + }
|
| + }
|
| + logln("MSG setFormats tested.");
|
| +
|
| + //----
|
| +
|
| + msg.applyPattern( formatStrChange, err ); //set msg formats to something different
|
| +
|
| + formatsToAdopt = new Format* [countCmp];
|
| + if (!formatsToAdopt) {
|
| + errln("memory allocation error");
|
| + return;
|
| + }
|
| +
|
| + for (i = 0; i < countCmp; i++) {
|
| + if (formatsCmp[i] == NULL) {
|
| + formatsToAdopt[i] = NULL;
|
| + }else{
|
| + formatsToAdopt[i] = formatsCmp[i]->clone();
|
| + if (!formatsToAdopt[i]) {
|
| + errln("Can't clone format at index %d", i);
|
| + return;
|
| + }
|
| + }
|
| + }
|
| + msg.adoptFormats( formatsToAdopt, countCmp ); // function to test
|
| + delete[] formatsToAdopt;
|
| +
|
| + assertEquals("msgCmp.toPattern()", formatStr, msgCmp.toPattern(patCmp.remove()));
|
| + assertEquals("msg.toPattern()", formatStr, msg.toPattern(patAct.remove()));
|
| +
|
| + formatsAct = msg.getFormats(countAct);
|
| + if (!formatsAct || (countAct <=0) || (countAct != countCmp)) {
|
| + errln("Error getting Formats");
|
| + return;
|
| + }
|
| +
|
| + for (i = 0; i < countAct; i++) {
|
| + a = formatsAct[i];
|
| + b = formatsCmp[i];
|
| + if ((a != NULL) && (b != NULL)) {
|
| + if (*a != *b) {
|
| + errln("a != b");
|
| + return;
|
| + }
|
| + }else if ((a != NULL) || (b != NULL)) {
|
| + errln("(a != NULL) || (b != NULL)");
|
| + return;
|
| + }
|
| + }
|
| + logln("MSG adoptFormats tested.");
|
| +
|
| + //---- adoptFormat
|
| +
|
| + msg.applyPattern( formatStrChange, err ); //set msg formats to something different
|
| +
|
| + formatsToAdopt = new Format* [countCmp];
|
| + if (!formatsToAdopt) {
|
| + errln("memory allocation error");
|
| + return;
|
| + }
|
| +
|
| + for (i = 0; i < countCmp; i++) {
|
| + if (formatsCmp[i] == NULL) {
|
| + formatsToAdopt[i] = NULL;
|
| + }else{
|
| + formatsToAdopt[i] = formatsCmp[i]->clone();
|
| + if (!formatsToAdopt[i]) {
|
| + errln("Can't clone format at index %d", i);
|
| + return;
|
| + }
|
| + }
|
| + }
|
| +
|
| + for ( i = 0; i < countCmp; i++ ) {
|
| + msg.adoptFormat( i, formatsToAdopt[i] ); // function to test
|
| + }
|
| + delete[] formatsToAdopt; // array itself not needed in this case;
|
| +
|
| + assertEquals("msgCmp.toPattern()", formatStr, msgCmp.toPattern(patCmp.remove()));
|
| + assertEquals("msg.toPattern()", formatStr, msg.toPattern(patAct.remove()));
|
| +
|
| + formatsAct = msg.getFormats(countAct);
|
| + if (!formatsAct || (countAct <=0) || (countAct != countCmp)) {
|
| + errln("Error getting Formats");
|
| + return;
|
| + }
|
| +
|
| + for (i = 0; i < countAct; i++) {
|
| + a = formatsAct[i];
|
| + b = formatsCmp[i];
|
| + if ((a != NULL) && (b != NULL)) {
|
| + if (*a != *b) {
|
| + errln("a != b");
|
| + return;
|
| + }
|
| + }else if ((a != NULL) || (b != NULL)) {
|
| + errln("(a != NULL) || (b != NULL)");
|
| + return;
|
| + }
|
| + }
|
| + logln("MSG adoptFormat tested.");
|
| +}
|
| +
|
| +// This test is a regression test for a fixed bug in the copy constructor.
|
| +// It is kept as a global function rather than as a method since the test depends on memory values.
|
| +// (At least before the bug was fixed, whether it showed up or not depended on memory contents,
|
| +// which is probably why it didn't show up in the regular test for the copy constructor.)
|
| +// For this reason, the test isn't changed even though it contains function calls whose results are
|
| +// not tested and had no problems. Actually, the test failed by *crashing*.
|
| +static void _testCopyConstructor2()
|
| +{
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UnicodeString formatStr("Hello World on {0,date,full}", "");
|
| + UnicodeString resultStr(" ", "");
|
| + UnicodeString result;
|
| + FieldPosition fp(0);
|
| + UDate d = Calendar::getNow();
|
| + const Formattable fargs( d, Formattable::kIsDate );
|
| +
|
| + MessageFormat* fmt1 = new MessageFormat( formatStr, status );
|
| + MessageFormat* fmt2 = new MessageFormat( *fmt1 );
|
| + MessageFormat* fmt3;
|
| + MessageFormat* fmt4;
|
| +
|
| + if (fmt1 == NULL) it_err("testCopyConstructor2: (fmt1 != NULL)");
|
| +
|
| + result = fmt1->format( &fargs, 1, resultStr, fp, status );
|
| +
|
| + if (fmt2 == NULL) it_err("testCopyConstructor2: (fmt2 != NULL)");
|
| +
|
| + fmt3 = (MessageFormat*) fmt1->clone();
|
| + fmt4 = (MessageFormat*) fmt2->clone();
|
| +
|
| + if (fmt3 == NULL) it_err("testCopyConstructor2: (fmt3 != NULL)");
|
| + if (fmt4 == NULL) it_err("testCopyConstructor2: (fmt4 != NULL)");
|
| +
|
| + result = fmt1->format( &fargs, 1, resultStr, fp, status );
|
| + result = fmt2->format( &fargs, 1, resultStr, fp, status );
|
| + result = fmt3->format( &fargs, 1, resultStr, fp, status );
|
| + result = fmt4->format( &fargs, 1, resultStr, fp, status );
|
| + delete fmt1;
|
| + delete fmt2;
|
| + delete fmt3;
|
| + delete fmt4;
|
| +}
|
| +
|
| +void TestMessageFormat::testCopyConstructor2() {
|
| + _testCopyConstructor2();
|
| +}
|
| +
|
| +/**
|
| + * Verify that MessageFormat accomodates more than 10 arguments and
|
| + * more than 10 subformats.
|
| + */
|
| +void TestMessageFormat::TestUnlimitedArgsAndSubformats() {
|
| + UErrorCode ec = U_ZERO_ERROR;
|
| + const UnicodeString pattern =
|
| + "On {0,date} (aka {0,date,short}, aka {0,date,long}) "
|
| + "at {0,time} (aka {0,time,short}, aka {0,time,long}) "
|
| + "there were {1,number} werjes "
|
| + "(a {3,number,percent} increase over {2,number}) "
|
| + "despite the {4}''s efforts "
|
| + "and to delight of {5}, {6}, {7}, {8}, {9}, and {10} {11}.";
|
| + MessageFormat msg(pattern, ec);
|
| + if (U_FAILURE(ec)) {
|
| + dataerrln("FAIL: constructor failed - %s", u_errorName(ec));
|
| + return;
|
| + }
|
| +
|
| + const Formattable ARGS[] = {
|
| + Formattable(UDate(1e13), Formattable::kIsDate),
|
| + Formattable((int32_t)1303),
|
| + Formattable((int32_t)1202),
|
| + Formattable(1303.0/1202 - 1),
|
| + Formattable("Glimmung"),
|
| + Formattable("the printers"),
|
| + Formattable("Nick"),
|
| + Formattable("his father"),
|
| + Formattable("his mother"),
|
| + Formattable("the spiddles"),
|
| + Formattable("of course"),
|
| + Formattable("Horace"),
|
| + };
|
| + const int32_t ARGS_LENGTH = sizeof(ARGS) / sizeof(ARGS[0]);
|
| + Formattable ARGS_OBJ(ARGS, ARGS_LENGTH);
|
| +
|
| + UnicodeString expected =
|
| + "On Nov 20, 2286 (aka 11/20/86, aka November 20, 2286) "
|
| + "at 9:46:40 AM (aka 9:46 AM, aka 9:46:40 AM PST) "
|
| + "there were 1,303 werjes "
|
| + "(a 8% increase over 1,202) "
|
| + "despite the Glimmung's efforts "
|
| + "and to delight of the printers, Nick, his father, "
|
| + "his mother, the spiddles, and of course Horace.";
|
| + UnicodeString result;
|
| + msg.format(ARGS_OBJ, result, ec);
|
| + if (result == expected) {
|
| + logln(result);
|
| + } else {
|
| + errln((UnicodeString)"FAIL: Got " + result +
|
| + ", expected " + expected);
|
| + }
|
| +}
|
| +
|
| +// test RBNF extensions to message format
|
| +void TestMessageFormat::TestRBNF(void) {
|
| + // WARNING: this depends on the RBNF formats for en_US
|
| + Locale locale("en", "US", "");
|
| +
|
| + UErrorCode ec = U_ZERO_ERROR;
|
| +
|
| + UnicodeString values[] = {
|
| + // decimal values do not format completely for ordinal or duration, and
|
| + // do not always parse, so do not include them
|
| + "0", "1", "12", "100", "123", "1001", "123,456", "-17",
|
| + };
|
| + int32_t values_count = sizeof(values)/sizeof(values[0]);
|
| +
|
| + UnicodeString formats[] = {
|
| + "There are {0,spellout} files to search.",
|
| + "There are {0,spellout,%simplified} files to search.",
|
| + "The bogus spellout {0,spellout,%BOGUS} files behaves like the default.",
|
| + "This is the {0,ordinal} file to search.", // TODO fix bug, ordinal does not parse
|
| + "Searching this file will take {0,duration} to complete.",
|
| + "Searching this file will take {0,duration,%with-words} to complete.",
|
| + };
|
| + int32_t formats_count = sizeof(formats)/sizeof(formats[0]);
|
| +
|
| + Formattable args[1];
|
| +
|
| + NumberFormat* numFmt = NumberFormat::createInstance(locale, ec);
|
| + if (U_FAILURE(ec)) {
|
| + dataerrln("Error calling NumberFormat::createInstance()");
|
| + return;
|
| + }
|
| +
|
| + for (int i = 0; i < formats_count; ++i) {
|
| + MessageFormat* fmt = new MessageFormat(formats[i], locale, ec);
|
| + logln((UnicodeString)"Testing format pattern: '" + formats[i] + "'");
|
| +
|
| + for (int j = 0; j < values_count; ++j) {
|
| + ec = U_ZERO_ERROR;
|
| + numFmt->parse(values[j], args[0], ec);
|
| + if (U_FAILURE(ec)) {
|
| + errln((UnicodeString)"Failed to parse test argument " + values[j]);
|
| + } else {
|
| + FieldPosition fp(0);
|
| + UnicodeString result;
|
| + fmt->format(args, 1, result, fp, ec);
|
| + logln((UnicodeString)"value: " + toString(args[0]) + " --> " + result + UnicodeString(" ec: ") + u_errorName(ec));
|
| +
|
| + if (i != 3) { // TODO: fix this, for now skip ordinal parsing (format string at index 3)
|
| + int32_t count = 0;
|
| + Formattable* parseResult = fmt->parse(result, count, ec);
|
| + if (count != 1) {
|
| + errln((UnicodeString)"parse returned " + count + " args");
|
| + } else if (parseResult[0] != args[0]) {
|
| + errln((UnicodeString)"parsed argument " + toString(parseResult[0]) + " != " + toString(args[0]));
|
| + }
|
| + delete []parseResult;
|
| + }
|
| + }
|
| + }
|
| + delete fmt;
|
| + }
|
| + delete numFmt;
|
| +}
|
| +
|
| +void TestMessageFormat::testAutoQuoteApostrophe(void) {
|
| + const char* patterns[] = { // pattern, expected pattern
|
| + "'", "''",
|
| + "''", "''",
|
| + "'{", "'{'",
|
| + "' {", "'' {",
|
| + "'a", "''a",
|
| + "'{'a", "'{'a",
|
| + "'{a'", "'{a'",
|
| + "'{}", "'{}'",
|
| + "{'", "{'",
|
| + "{'a", "{'a",
|
| + "{'a{}'a}'a", "{'a{}'a}''a",
|
| + "'}'", "'}'",
|
| + "'} '{'}'", "'} '{'}''",
|
| + "'} {{{''", "'} {{{'''",
|
| + };
|
| + int32_t pattern_count = sizeof(patterns)/sizeof(patterns[0]);
|
| +
|
| + for (int i = 0; i < pattern_count; i += 2) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UnicodeString result = MessageFormat::autoQuoteApostrophe(patterns[i], status);
|
| + UnicodeString target(patterns[i+1]);
|
| + if (target != result) {
|
| + const int BUF2_LEN = 64;
|
| + char buf[256];
|
| + char buf2[BUF2_LEN];
|
| + int32_t len = result.extract(0, result.length(), buf2, BUF2_LEN);
|
| + if (len >= BUF2_LEN) {
|
| + buf2[BUF2_LEN-1] = 0;
|
| + }
|
| + sprintf(buf, "[%2d] test \"%s\": target (\"%s\") != result (\"%s\")\n", i/2, patterns[i], patterns[i+1], buf2);
|
| + errln(buf);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void TestMessageFormat::testCoverage(void) {
|
| + UErrorCode status = U_ZERO_ERROR;
|
| + UnicodeString testformat("{argument, plural, one{C''est # fichier} other {Ce sont # fichiers}} dans la liste.");
|
| + MessageFormat *msgfmt = new MessageFormat(testformat, Locale("fr"), status);
|
| + if (msgfmt == NULL || U_FAILURE(status)) {
|
| + dataerrln("FAIL: Unable to create MessageFormat.: %s", u_errorName(status));
|
| + return;
|
| + }
|
| + if (!msgfmt->usesNamedArguments()) {
|
| + errln("FAIL: Unable to detect usage of named arguments.");
|
| + }
|
| + const double limit[] = {0.0, 1.0, 2.0};
|
| + const UnicodeString formats[] = {"0.0<=Arg<1.0",
|
| + "1.0<=Arg<2.0",
|
| + "2.0<-Arg"};
|
| + ChoiceFormat cf(limit, formats, 3);
|
| +
|
| + msgfmt->setFormat("set", cf, status);
|
| +
|
| + StringEnumeration *en = msgfmt->getFormatNames(status);
|
| + if (en == NULL || U_FAILURE(status)) {
|
| + errln("FAIL: Unable to get format names enumeration.");
|
| + } else {
|
| + int32_t count = 0;
|
| + en->reset(status);
|
| + count = en->count(status);
|
| + if (U_FAILURE(status)) {
|
| + errln("FAIL: Unable to get format name enumeration count.");
|
| + } else {
|
| + for (int32_t i = 0; i < count; i++) {
|
| + en->snext(status);
|
| + if (U_FAILURE(status)) {
|
| + errln("FAIL: Error enumerating through names.");
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + msgfmt->adoptFormat("adopt", &cf, status);
|
| +
|
| + delete en;
|
| + delete msgfmt;
|
| +
|
| + msgfmt = new MessageFormat("'", status);
|
| + if (msgfmt == NULL || U_FAILURE(status)) {
|
| + errln("FAIL: Unable to create MessageFormat.");
|
| + return;
|
| + }
|
| + if (msgfmt->usesNamedArguments()) {
|
| + errln("FAIL: Unable to detect usage of named arguments.");
|
| + }
|
| +
|
| + msgfmt->setFormat("formatName", cf, status);
|
| + if (!U_FAILURE(status)) {
|
| + errln("FAIL: Should fail to setFormat instead of passing.");
|
| + }
|
| + status = U_ZERO_ERROR;
|
| + en = msgfmt->getFormatNames(status);
|
| + if (!U_FAILURE(status)) {
|
| + errln("FAIL: Should fail to get format names enumeration instead of passing.");
|
| + }
|
| +
|
| + delete en;
|
| + delete msgfmt;
|
| +}
|
| +
|
| +#endif /* #if !UCONFIG_NO_FORMATTING */
|
|
|
| Property changes on: icu46/source/test/intltest/tmsgfmt.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|