+typedef struct DTPtnGenOptionsData {
+ const char * locale;
+ const UChar * skel;
+ UDateTimePatternMatchOptions options;
+ const UChar * expectedPattern;
+} DTPtnGenOptionsData;
+enum { kTestOptionsPatLenMax = 32 };
+
+static const UChar skel_Hmm[] = { 0x0048, 0x006D, 0x006D, 0 };
+static const UChar skel_HHmm[] = { 0x0048, 0x0048, 0x006D, 0x006D, 0 };
+static const UChar skel_hhmm[] = { 0x0068, 0x0068, 0x006D, 0x006D, 0 };
+static const UChar patn_hcmm_a[] = { 0x0068, 0x003A, 0x006D, 0x006D, 0x0020, 0x0061, 0 }; /* h:mm a */
+static const UChar patn_HHcmm[] = { 0x0048, 0x0048, 0x003A, 0x006D, 0x006D, 0 }; /* HH:mm */
+static const UChar patn_hhcmm_a[] = { 0x0068, 0x0068, 0x003A, 0x006D, 0x006D, 0x0020, 0x0061, 0 }; /* hh:mm a */
+static const UChar patn_HHpmm[] = { 0x0048, 0x0048, 0x002E, 0x006D, 0x006D, 0 }; /* HH.mm */
+static const UChar patn_hpmm_a[] = { 0x0068, 0x002E, 0x006D, 0x006D, 0x0020, 0x0061, 0 }; /* h.mm a */
+static const UChar patn_Hpmm[] = { 0x0048, 0x002E, 0x006D, 0x006D, 0 }; /* H.mm */
+static const UChar patn_hhpmm_a[] = { 0x0068, 0x0068, 0x002E, 0x006D, 0x006D, 0x0020, 0x0061, 0 }; /* hh.mm a */
+
+static void TestOptions() {
+ const DTPtnGenOptionsData testData[] = {
+ /*loc skel options expectedPattern */
+ { "en", skel_Hmm, UDATPG_MATCH_NO_OPTIONS, patn_HHcmm },
+ { "en", skel_HHmm, UDATPG_MATCH_NO_OPTIONS, patn_HHcmm },
+ { "en", skel_hhmm, UDATPG_MATCH_NO_OPTIONS, patn_hcmm_a },
+ { "en", skel_Hmm, UDATPG_MATCH_HOUR_FIELD_LENGTH, patn_HHcmm },
+ { "en", skel_HHmm, UDATPG_MATCH_HOUR_FIELD_LENGTH, patn_HHcmm },
+ { "en", skel_hhmm, UDATPG_MATCH_HOUR_FIELD_LENGTH, patn_hhcmm_a },
+ { "be", skel_Hmm, UDATPG_MATCH_NO_OPTIONS, patn_HHpmm },
+ { "be", skel_HHmm, UDATPG_MATCH_NO_OPTIONS, patn_HHpmm },
+ { "be", skel_hhmm, UDATPG_MATCH_NO_OPTIONS, patn_hpmm_a },
+ { "be", skel_Hmm, UDATPG_MATCH_HOUR_FIELD_LENGTH, patn_Hpmm },
+ { "be", skel_HHmm, UDATPG_MATCH_HOUR_FIELD_LENGTH, patn_HHpmm },
+ { "be", skel_hhmm, UDATPG_MATCH_HOUR_FIELD_LENGTH, patn_hhpmm_a },
+ };
+
+ int count = sizeof(testData) / sizeof(testData[0]);
+ const DTPtnGenOptionsData * testDataPtr = testData;
+
+ for (; count-- > 0; ++testDataPtr) {
+ UErrorCode status = U_ZERO_ERROR;
+ UDateTimePatternGenerator * dtpgen = udatpg_open(testDataPtr->locale, &status);
+ if ( U_SUCCESS(status) ) {
+ UChar pattern[kTestOptionsPatLenMax];
+ int32_t patLen = udatpg_getBestPatternWithOptions(dtpgen, testDataPtr->skel, -1,
+ testDataPtr->options, pattern,
+ kTestOptionsPatLenMax, &status);
+ if ( U_FAILURE(status) || u_strncmp(pattern, testDataPtr->expectedPattern, patLen+1) != 0 ) {
+ char skelBytes[kTestOptionsPatLenMax];
+ char expectedPatternBytes[kTestOptionsPatLenMax];
+ char patternBytes[kTestOptionsPatLenMax];
+ log_err("ERROR udatpg_getBestPatternWithOptions, locale %s, skeleton %s, options 0x%04X, expected pattern %s, got %s, status %d\n",
+ testDataPtr->locale, u_austrncpy(skelBytes,testDataPtr->skel,kTestOptionsPatLenMax), testDataPtr->options,
+ u_austrncpy(expectedPatternBytes,testDataPtr->expectedPattern,kTestOptionsPatLenMax),
+ u_austrncpy(patternBytes,pattern,kTestOptionsPatLenMax), status );
+ }
+ udatpg_close(dtpgen);
+ } else {
+ log_data_err("ERROR udatpg_open failed for locale %s : %s - (Are you missing data?)\n", testDataPtr->locale, myErrorName(status));
+ }
+ }
+}
+