e72290c45e
This adds a separate CI build that enables -Werror for clang. This also fixes all of the -Wall -Wextra warnings in the tests, and all the -Wextra-semi warnings as well.
276 lines
8.4 KiB
C
276 lines
8.4 KiB
C
// © 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 */
|