static void TestGetRulesAndSourceSet() { UErrorCode status = U_ZERO_ERROR; UTransliterator *utrans = utrans_openU(transSimpleID, -1, UTRANS_FORWARD, NULL, 0, NULL, &status); if ( U_SUCCESS(status) ) { USet* uset; UChar ubuf[kUBufMax]; int32_t ulen; status = U_ZERO_ERROR; ulen = utrans_toRules(utrans, FALSE, ubuf, kUBufMax, &status); if ( U_FAILURE(status) || ulen <= 50 || ulen >= 100) { log_err("FAIL: utrans_toRules unescaped, expected noErr and len 50-100, got error=%s and len=%d\n", u_errorName(status), ulen); } status = U_ZERO_ERROR; ulen = utrans_toRules(utrans, FALSE, NULL, 0, &status); if ( status != U_BUFFER_OVERFLOW_ERROR || ulen <= 50 || ulen >= 100) { log_err("FAIL: utrans_toRules unescaped, expected U_BUFFER_OVERFLOW_ERROR and len 50-100, got error=%s and len=%d\n", u_errorName(status), ulen); } status = U_ZERO_ERROR; ulen = utrans_toRules(utrans, TRUE, ubuf, kUBufMax, &status); if ( U_FAILURE(status) || ulen <= 100 || ulen >= 200) { log_err("FAIL: utrans_toRules escaped, expected noErr and len 100-200, got error=%s and len=%d\n", u_errorName(status), ulen); } status = U_ZERO_ERROR; uset = utrans_getSourceSet(utrans, FALSE, NULL, &status); ulen = uset_toPattern(uset, ubuf, kUBufMax, FALSE, &status); uset_close(uset); if ( U_FAILURE(status) || ulen <= 4 || ulen >= 20) { log_err("FAIL: utrans_getSourceSet useFilter, expected noErr and len 4-20, got error=%s and len=%d\n", u_errorName(status), ulen); } status = U_ZERO_ERROR; uset = utrans_getSourceSet(utrans, TRUE, NULL, &status); ulen = uset_toPattern(uset, ubuf, kUBufMax, FALSE, &status); uset_close(uset); if ( U_FAILURE(status) || ulen <= 4 || ulen >= 20) { log_err("FAIL: utrans_getSourceSet ignoreFilter, expected noErr and len 4-20, got error=%s and len=%d\n", u_errorName(status), ulen); } utrans_close(utrans); } else { log_data_err("FAIL: utrans_openRules(%s) failed, error=%s (Are you missing data?)\n", transSimpleCName, u_errorName(status)); } }
static void expectItems(const USet* set, const char* items) { const char* p = items; UChar ustr[4096], itemStr[4096]; char buf[4096]; char *pat; UErrorCode ec; int32_t expectedSize = 0; int32_t itemCount = uset_getItemCount(set); int32_t itemIndex = 0; UChar32 start = 1, end = 0; int32_t itemLen = 0, length; ec = U_ZERO_ERROR; length = uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); if (U_FAILURE(ec)) { log_err("FAIL: uset_toPattern => %s\n", u_errorName(ec)); return; } pat=aescstrdup(ustr, length); if (uset_isEmpty(set) != (strlen(items)==0)) { log_data_err("FAIL: %s should return %s from isEmpty (Are you missing data?)\n", pat, strlen(items)==0 ? "TRUE" : "FALSE"); } /* Don't test patterns starting with "[^" */ if (u_strlen(ustr) > 2 && ustr[1] == 0x5e /*'^'*/) { return; } while (*p) { ++expectedSize; if (start > end || start == -1) { /* Fetch our next item */ if (itemIndex >= itemCount) { log_data_err("FAIL: ran out of items iterating %s (Are you missing data?)\n", pat); return; } itemLen = uset_getItem(set, itemIndex, &start, &end, itemStr, sizeof(itemStr), &ec); if (U_FAILURE(ec) || itemLen < 0) { log_err("FAIL: uset_getItem => %s\n", u_errorName(ec)); return; } if (itemLen == 0) { log_verbose("Ok: %s item %d is %c-%c\n", pat, itemIndex, oneUCharToChar(start), oneUCharToChar(end)); } else { itemStr[itemLen] = 0; u_UCharsToChars(itemStr, buf, itemLen+1); log_verbose("Ok: %s item %d is \"%s\"\n", pat, itemIndex, buf); } ++itemIndex; } if (*p=='{') { const char* stringStart = ++p; int32_t stringLength = 0; char strCopy[64]; while (*p++ != '}') { } stringLength = (int32_t)(p - stringStart - 1); strncpy(strCopy, stringStart, stringLength); strCopy[stringLength] = 0; u_charsToUChars(stringStart, ustr, stringLength); ustr[stringLength] = 0; if (itemLen == 0) { log_err("FAIL: for %s expect \"%s\" next, but got a char\n", pat, strCopy); return; } if (u_strcmp(ustr, itemStr) != 0) { log_err("FAIL: for %s expect \"%s\" next\n", pat, strCopy); return; } } else { UChar32 c; u_charsToUChars(p, ustr, 1); c = ustr[0]; if (itemLen != 0) { log_err("FAIL: for %s expect '%c' next, but got a string\n", pat, *p); return; } if (c != start++) { log_err("FAIL: for %s expect '%c' next\n", pat, *p); return; } ++p; } } if (uset_size(set) == expectedSize) { log_verbose("Ok: %s size is %d\n", pat, expectedSize); } else { log_err("FAIL: %s size is %d, expected %d\n", pat, uset_size(set), expectedSize); } }
static void expectContainment(const USet* set, const char* list, UBool isIn) { const char* p = list; UChar ustr[4096]; char *pat; UErrorCode ec; int32_t rangeStart = -1, rangeEnd = -1, length; ec = U_ZERO_ERROR; length = uset_toPattern(set, ustr, sizeof(ustr), TRUE, &ec); if(U_FAILURE(ec)) { log_err("FAIL: uset_toPattern() fails in expectContainment() - %s\n", u_errorName(ec)); return; } pat=aescstrdup(ustr, length); while (*p) { if (*p=='{') { const char* stringStart = ++p; int32_t stringLength = 0; char strCopy[64]; while (*p++ != '}') { } stringLength = (int32_t)(p - stringStart - 1); strncpy(strCopy, stringStart, stringLength); strCopy[stringLength] = 0; u_charsToUChars(stringStart, ustr, stringLength); if (uset_containsString(set, ustr, stringLength) == isIn) { log_verbose("Ok: %s %s \"%s\"\n", pat, (isIn ? "contains" : "does not contain"), strCopy); } else { log_data_err("FAIL: %s %s \"%s\" (Are you missing data?)\n", pat, (isIn ? "does not contain" : "contains"), strCopy); } } else { UChar32 c; u_charsToUChars(p, ustr, 1); c = ustr[0]; if (uset_contains(set, c) == isIn) { log_verbose("Ok: %s %s '%c'\n", pat, (isIn ? "contains" : "does not contain"), *p); } else { log_data_err("FAIL: %s %s '%c' (Are you missing data?)\n", pat, (isIn ? "does not contain" : "contains"), *p); } /* Test the range API too by looking for ranges */ if (c == rangeEnd+1) { rangeEnd = c; } else { if (rangeStart >= 0) { if (uset_containsRange(set, rangeStart, rangeEnd) == isIn) { log_verbose("Ok: %s %s U+%04X-U+%04X\n", pat, (isIn ? "contains" : "does not contain"), rangeStart, rangeEnd); } else { log_data_err("FAIL: %s %s U+%04X-U+%04X (Are you missing data?)\n", pat, (isIn ? "does not contain" : "contains"), rangeStart, rangeEnd); } } rangeStart = rangeEnd = c; } ++p; } } if (rangeStart >= 0) { if (uset_containsRange(set, rangeStart, rangeEnd) == isIn) { log_verbose("Ok: %s %s U+%04X-U+%04X\n", pat, (isIn ? "contains" : "does not contain"), rangeStart, rangeEnd); } else { log_data_err("FAIL: %s %s U+%04X-U+%04X (Are you missing data?)\n", pat, (isIn ? "does not contain" : "contains"), rangeStart, rangeEnd); } } }