You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

276 lines
8.4 KiB

// © 2018 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
#include "unicode/utypes.h"
#if !UCONFIG_NO_FORMATTING
#include "unicode/uformattedvalue.h"
#include "unicode/unum.h"
#include "unicode/ustring.h"
#include "cformtst.h"
#include "cintltst.h"
#include "cmemory.h"
#include "cstring.h"
#include "uassert.h"
static void TestBasic(void);
static void TestSetters(void);
static void AssertAllPartsEqual(
const char* messagePrefix,
const UConstrainedFieldPosition* ucfpos,
int32_t matching,
UFieldCategory category,
int32_t field,
int32_t start,
int32_t limit,
int64_t context);
void addUFormattedValueTest(TestNode** root);
#define TESTCASE(x) addTest(root, &x, "tsformat/uformattedvalue/" #x)
void addUFormattedValueTest(TestNode** root) {
TESTCASE(TestBasic);
TESTCASE(TestSetters);
}
static void TestBasic() {
UErrorCode status = U_ZERO_ERROR;
UConstrainedFieldPosition* ucfpos = ucfpos_open(&status);
assertSuccess("opening ucfpos", &status);
assertTrue("ucfpos should not be null", ucfpos != NULL);
AssertAllPartsEqual(
"basic",
ucfpos,
7,
UFIELD_CATEGORY_UNDEFINED,
0,
0,
0,
0LL);
ucfpos_close(ucfpos);
}
void TestSetters() {
UErrorCode status = U_ZERO_ERROR;
UConstrainedFieldPosition* ucfpos = ucfpos_open(&status);
assertSuccess("opening ucfpos", &status);
assertTrue("ucfpos should not be null", ucfpos != NULL);
ucfpos_constrainCategory(ucfpos, UFIELD_CATEGORY_DATE, &status);
assertSuccess("setters 0", &status);
AssertAllPartsEqual(
"setters 0",
ucfpos,
4,
UFIELD_CATEGORY_DATE,
0,
0,
0,
0LL);
ucfpos_constrainField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, &status);
assertSuccess("setters 1", &status);
AssertAllPartsEqual(
"setters 1",
ucfpos,
2,
UFIELD_CATEGORY_NUMBER,
UNUM_COMPACT_FIELD,
0,
0,
0LL);
ucfpos_setInt64IterationContext(ucfpos, 42424242424242LL, &status);
assertSuccess("setters 2", &status);
AssertAllPartsEqual(
"setters 2",
ucfpos,
2,
UFIELD_CATEGORY_NUMBER,
UNUM_COMPACT_FIELD,
0,
0,
42424242424242LL);
ucfpos_setState(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, 5, 10, &status);
assertSuccess("setters 3", &status);
AssertAllPartsEqual(
"setters 3",
ucfpos,
2,
UFIELD_CATEGORY_NUMBER,
UNUM_COMPACT_FIELD,
5,
10,
42424242424242LL);
ucfpos_reset(ucfpos, &status);
assertSuccess("setters 4", &status);
AssertAllPartsEqual(
"setters 4",
ucfpos,
7,
UFIELD_CATEGORY_UNDEFINED,
0,
0,
0,
0LL);
ucfpos_close(ucfpos);
}
/** For matching, turn on these bits:
*
* 1 = UNUM_INTEGER_FIELD
* 2 = UNUM_COMPACT_FIELD
* 4 = UDAT_AM_PM_FIELD
*/
static void AssertAllPartsEqual(
const char* messagePrefix,
const UConstrainedFieldPosition* ucfpos,
int32_t matching,
UFieldCategory category,
int32_t field,
int32_t start,
int32_t limit,
int64_t context) {
UErrorCode status = U_ZERO_ERROR;
char message[256];
uprv_strncpy(message, messagePrefix, 256);
int32_t prefixEnd = (int32_t)uprv_strlen(messagePrefix);
message[prefixEnd++] = ':';
message[prefixEnd++] = ' ';
U_ASSERT(prefixEnd < 256);
#define AAPE_MSG(suffix) (uprv_strncpy(message+prefixEnd, suffix, 256-prefixEnd)-prefixEnd)
UFieldCategory _category = ucfpos_getCategory(ucfpos, &status);
assertSuccess(AAPE_MSG("_"), &status);
assertIntEquals(AAPE_MSG("category"), category, _category);
int32_t _field = ucfpos_getField(ucfpos, &status);
assertSuccess(AAPE_MSG("field"), &status);
assertIntEquals(AAPE_MSG("field"), field, _field);
int32_t _start, _limit;
ucfpos_getIndexes(ucfpos, &_start, &_limit, &status);
assertSuccess(AAPE_MSG("indexes"), &status);
assertIntEquals(AAPE_MSG("start"), start, _start);
assertIntEquals(AAPE_MSG("limit"), limit, _limit);
int64_t _context = ucfpos_getInt64IterationContext(ucfpos, &status);
assertSuccess(AAPE_MSG("context"), &status);
assertIntEquals(AAPE_MSG("context"), context, _context);
UBool _matchesInteger = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_INTEGER_FIELD, &status);
assertSuccess(AAPE_MSG("integer field"), &status);
assertTrue(AAPE_MSG("integer field"),
((matching & 1) != 0) ? _matchesInteger : !_matchesInteger);
UBool _matchesCompact = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_NUMBER, UNUM_COMPACT_FIELD, &status);
assertSuccess(AAPE_MSG("compact field"), &status);
assertTrue(AAPE_MSG("compact field"),
((matching & 2) != 0) ? _matchesCompact : !_matchesCompact);
UBool _matchesDate = ucfpos_matchesField(ucfpos, UFIELD_CATEGORY_DATE, UDAT_AM_PM_FIELD, &status);
assertSuccess(AAPE_MSG("date field"), &status);
assertTrue(AAPE_MSG("date field"),
((matching & 4) != 0) ? _matchesDate : !_matchesDate);
}
static void checkFormattedValueString(
const char* message,
const UFormattedValue* fv,
const UChar* expectedString,
UErrorCode* ec) {
int32_t length;
const UChar* actualString = ufmtval_getString(fv, &length, ec);
if (U_FAILURE(*ec)) {
assertIntEquals(message, 0, length);
return;
}
assertSuccess(message, ec);
// The string is guaranteed to be NUL-terminated.
int32_t actualLength = u_strlen(actualString);
assertIntEquals(message, actualLength, length);
assertUEquals(message, expectedString, actualString);
}
// Declared in cformtst.h
void checkFormattedValue(
const char* message,
const UFormattedValue* fv,
const UChar* expectedString,
UFieldCategory expectedCategory,
const UFieldPosition* expectedFieldPositions,
int32_t expectedFieldPositionsLength) {
(void)expectedFieldPositionsLength; // suppress compiler warnings about unused variable
UErrorCode ec = U_ZERO_ERROR;
checkFormattedValueString(message, fv, expectedString, &ec);
if (U_FAILURE(ec)) { return; }
// Basic loop over the fields (more rigorous testing in C++)
UConstrainedFieldPosition* ucfpos = ucfpos_open(&ec);
int32_t i = 0;
while (ufmtval_nextPosition(fv, ucfpos, &ec)) {
assertIntEquals("category",
expectedCategory, ucfpos_getCategory(ucfpos, &ec));
assertIntEquals("field",
expectedFieldPositions[i].field, ucfpos_getField(ucfpos, &ec));
int32_t start, limit;
ucfpos_getIndexes(ucfpos, &start, &limit, &ec);
assertIntEquals("start",
expectedFieldPositions[i].beginIndex, start);
assertIntEquals("limit",
expectedFieldPositions[i].endIndex, limit);
i++;
}
assertTrue("After loop", !ufmtval_nextPosition(fv, ucfpos, &ec));
assertSuccess("After loop", &ec);
ucfpos_close(ucfpos);
}
void checkMixedFormattedValue(
const char* message,
const UFormattedValue* fv,
const UChar* expectedString,
const UFieldPositionWithCategory* expectedFieldPositions,
int32_t length) {
(void)length; // suppress compiler warnings about unused variable
UErrorCode ec = U_ZERO_ERROR;
checkFormattedValueString(message, fv, expectedString, &ec);
if (U_FAILURE(ec)) { return; }
// Basic loop over the fields (more rigorous testing in C++)
UConstrainedFieldPosition* ucfpos = ucfpos_open(&ec);
int32_t i = 0;
while (ufmtval_nextPosition(fv, ucfpos, &ec)) {
assertIntEquals("category",
expectedFieldPositions[i].category, ucfpos_getCategory(ucfpos, &ec));
assertIntEquals("field",
expectedFieldPositions[i].field, ucfpos_getField(ucfpos, &ec));
int32_t start, limit;
ucfpos_getIndexes(ucfpos, &start, &limit, &ec);
assertIntEquals("start",
expectedFieldPositions[i].beginIndex, start);
assertIntEquals("limit",
expectedFieldPositions[i].endIndex, limit);
i++;
}
assertTrue("After loop", !ufmtval_nextPosition(fv, ucfpos, &ec));
assertSuccess("After loop", &ec);
ucfpos_close(ucfpos);
}
#endif /* #if !UCONFIG_NO_FORMATTING */