+typedef struct FieldDisplayNameData {
+ const char * locale;
+ UDateTimePatternField field;
+ UDateTimePGDisplayWidth width;
+ const char * expected;
+} FieldDisplayNameData;
+enum { kFieldDisplayNameMax = 32, kFieldDisplayNameBytesMax = 64};
+
+static void TestGetFieldDisplayNames() {
+ const FieldDisplayNameData testData[] = {
+ /*loc field width expectedName */
+ { "de", UDATPG_QUARTER_FIELD, UDATPG_WIDE, "Quartal" },
+ { "de", UDATPG_QUARTER_FIELD, UDATPG_ABBREVIATED, "Quart." },
+ { "de", UDATPG_QUARTER_FIELD, UDATPG_NARROW, "Q" },
+ { "en", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_WIDE, "weekday of the month" },
+ { "en", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_ABBREVIATED, "wkday. of mo." },
+ { "en", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_NARROW, "wkday. of mo." }, // fallback
+ { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_WIDE, "weekday of the month" },
+ { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_ABBREVIATED, "wkday of mo" }, // override
+ { "en_GB", UDATPG_DAY_OF_WEEK_IN_MONTH_FIELD, UDATPG_NARROW, "wkday of mo" },
+ { "it", UDATPG_SECOND_FIELD, UDATPG_WIDE, "secondo" },
+ { "it", UDATPG_SECOND_FIELD, UDATPG_ABBREVIATED, "s" },
+ { "it", UDATPG_SECOND_FIELD, UDATPG_NARROW, "s" },
+ };
+
+ int count = UPRV_LENGTHOF(testData);
+ const FieldDisplayNameData * testDataPtr = testData;
+ for (; count-- > 0; ++testDataPtr) {
+ UErrorCode status = U_ZERO_ERROR;
+ UDateTimePatternGenerator * dtpgen = udatpg_open(testDataPtr->locale, &status);
+ if ( U_FAILURE(status) ) {
+ log_data_err("ERROR udatpg_open failed for locale %s : %s - (Are you missing data?)\n", testDataPtr->locale, myErrorName(status));
+ } else {
+ UChar expName[kFieldDisplayNameMax];
+ UChar getName[kFieldDisplayNameMax];
+ u_unescape(testDataPtr->expected, expName, kFieldDisplayNameMax);
+
+ int32_t getLen = udatpg_getFieldDisplayName(dtpgen, testDataPtr->field, testDataPtr->width,
+ getName, kFieldDisplayNameMax, &status);
+ if ( U_FAILURE(status) ) {
+ log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, got status %s, len %d\n",
+ testDataPtr->locale, testDataPtr->field, testDataPtr->width, u_errorName(status), getLen);
+ } else if ( u_strncmp(expName, getName, kFieldDisplayNameMax) != 0 ) {
+ char expNameB[kFieldDisplayNameBytesMax];
+ char getNameB[kFieldDisplayNameBytesMax];
+ log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, expected %s, got %s, status %s\n",
+ testDataPtr->locale, testDataPtr->field, testDataPtr->width,
+ u_austrncpy(expNameB,expName,kFieldDisplayNameBytesMax),
+ u_austrncpy(getNameB,getName,kFieldDisplayNameBytesMax), u_errorName(status) );
+ } else if (testDataPtr->width == UDATPG_WIDE && getLen > 1) {
+ // test preflight & inadequate buffer
+ int32_t getNewLen;
+ status = U_ZERO_ERROR;
+ getNewLen = udatpg_getFieldDisplayName(dtpgen, testDataPtr->field, UDATPG_WIDE, NULL, 0, &status);
+ if (U_FAILURE(status) || getNewLen != getLen) {
+ log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, preflight expected len %d, got %d, status %s\n",
+ testDataPtr->locale, testDataPtr->field, testDataPtr->width, getLen, getNewLen, u_errorName(status) );
+ }
+ status = U_ZERO_ERROR;
+ getNewLen = udatpg_getFieldDisplayName(dtpgen, testDataPtr->field, UDATPG_WIDE, getName, getLen-1, &status);
+ if (status!=U_BUFFER_OVERFLOW_ERROR || getNewLen != getLen) {
+ log_err("ERROR udatpg_getFieldDisplayName locale %s field %d width %d, overflow expected len %d & BUFFER_OVERFLOW_ERROR, got %d & status %s\n",
+ testDataPtr->locale, testDataPtr->field, testDataPtr->width, getLen, getNewLen, u_errorName(status) );
+ }
+ }
+ udatpg_close(dtpgen);
+ }
+ }
+}
+
+enum { kUFmtMax = 64, kBFmtMax = 128 };
+static void TestJapaneseCalendarItems(void) { // rdar://52042600
+ static const UChar* jaJpnCalSkelAndFmt[][2] = {
+ { u"yMd", u"GGGGGy/MM/dd" },
+ { u"GGGGGyMd", u"GGGGGy/MM/dd" },
+ { u"GyMd", u"GGGGGy/MM/dd" },
+ { u"yyMMdd", u"GGGGGy/MM/dd" },
+ //{ u"GGGGGyyMMdd", u"GGGGGy/MM/dd" },
+ { u"GyyMMdd", u"GGGGGy/MM/dd" },
+ { u"yyMMEdd", u"GGGGGy/MM/dd(EEE)" },
+ { u"GGGGGyyMMEdd", u"GGGGGy/MM/dd(EEE)" },
+ { u"yyMEdjmma", u"GGGGGy/MM/dd(EEE) H:mm" },
+ { NULL, NULL }
+ };
+ UErrorCode status = U_ZERO_ERROR;
+ UDateTimePatternGenerator* udatpg = udatpg_open("ja@calendar=japanese", &status);
+ if ( U_FAILURE(status) ) {
+ log_data_err("FAIL udatpg_open failed for locale ja@calendar=japanese : %s\n", myErrorName(status));
+ } else {
+ int32_t idx;
+ for (idx = 0; jaJpnCalSkelAndFmt[idx][0] != NULL; idx++) {
+ UChar uget[kUFmtMax];
+ char bskel[kBFmtMax];
+ status = U_ZERO_ERROR;
+ u_strToUTF8(bskel, kBFmtMax, NULL, jaJpnCalSkelAndFmt[idx][0], -1, &status);
+ int32_t ulen = udatpg_getBestPattern(udatpg, jaJpnCalSkelAndFmt[idx][0], -1, uget, kUFmtMax, &status);
+ if ( U_FAILURE(status) ) {
+ log_data_err("FAIL udatpg_getBestPattern status for skeleton %s : %s\n", bskel);
+ } else if (u_strcmp(uget,jaJpnCalSkelAndFmt[idx][1]) != 0) {
+ char bexp[kBFmtMax];
+ char bget[kBFmtMax];
+ u_strToUTF8(bexp, kBFmtMax, NULL, jaJpnCalSkelAndFmt[idx][1], -1, &status);
+ u_strToUTF8(bget, kBFmtMax, NULL, uget, ulen, &status);
+ log_data_err("ERROR udatpg_getBestPattern for skeleton %s, expect %s, get %s\n", bskel, bexp, bget);
+ }
+ }
+ udatpg_close(udatpg);
+ }
+}
+