Blame testing/fulltests/unit-tests/T017strtoull_clib.c

Packit fcad23
/* HEADER Testing strtoull(). */
Packit fcad23
Packit fcad23
#ifdef HAVE_STRTOULL
Packit fcad23
Packit fcad23
OK(1, "Skipping strtoull() test because using strtoull() from C library.\n");
Packit fcad23
Packit fcad23
#else
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * UINT64_C: C99 macro for the suffix for uint64_t constants. 
Packit fcad23
 */
Packit fcad23
#ifndef UINT64_C
Packit fcad23
#ifdef _MSC_VER
Packit fcad23
#define UINT64_C(c) c##ui64
Packit fcad23
#else
Packit fcad23
#define UINT64_C(c) c##ULL
Packit fcad23
#endif
Packit fcad23
#endif
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * According to the C99 standard, the constant ULLONG_MAX must be defined in
Packit fcad23
 * <limits.h>. Define it here for pre-C99 compilers.
Packit fcad23
 */
Packit fcad23
#ifndef ULLONG_MAX
Packit fcad23
#define ULLONG_MAX UINT64_C(0xffffffffffffffff)
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#ifndef PRIu64
Packit fcad23
#ifdef _MSC_VER
Packit fcad23
#define PRIu64 "I64u"
Packit fcad23
#else
Packit fcad23
#define PRIu64 "llu"
Packit fcad23
#endif
Packit fcad23
#endif
Packit fcad23
Packit fcad23
struct strtoull_testcase {
Packit fcad23
    /*
Packit fcad23
     * inputs 
Packit fcad23
     */
Packit fcad23
    const char     *nptr;
Packit fcad23
    int             base;
Packit fcad23
    /*
Packit fcad23
     * expected outputs 
Packit fcad23
     */
Packit fcad23
    int             expected_errno;
Packit fcad23
    int             expected_end;
Packit fcad23
    uint64_t        expected_result;
Packit fcad23
};
Packit fcad23
Packit fcad23
static const struct strtoull_testcase test_input[] = {
Packit fcad23
    {"0x0", 0, 0, 3, 0},
Packit fcad23
    {"1", 0, 0, 1, 1},
Packit fcad23
    {"0x1", 0, 0, 3, 1},
Packit fcad23
    {"  -0666", 0, 0, 7, -0666},
Packit fcad23
    {"  -0x666", 0, 0, 8, -0x666},
Packit fcad23
    {"18446744073709551614", 0, 0, 20, UINT64_C(0xfffffffffffffffe)},
Packit fcad23
    {"0xfffffffffffffffe", 0, 0, 18, UINT64_C(0xfffffffffffffffe)},
Packit fcad23
    {"18446744073709551615", 0, 0, 20, UINT64_C(0xffffffffffffffff)},
Packit fcad23
    {"0xffffffffffffffff", 0, 0, 18, UINT64_C(0xffffffffffffffff)},
Packit fcad23
    {"18446744073709551616", 0, ERANGE, 20, UINT64_C(0xffffffffffffffff)},
Packit fcad23
    {"0x10000000000000000", 0, ERANGE, 19, UINT64_C(0xffffffffffffffff)},
Packit fcad23
    {"ff", 16, 0, 2, 255},
Packit fcad23
    {"0xff", 16, 0, 4, 255},
Packit fcad23
    {" ", 0, 0, 0, 0},
Packit fcad23
    {"0x", 0, 0, 1, 0},
Packit fcad23
    {"0x", 8, 0, 1, 0},
Packit fcad23
    {"0x", 16, 0, 1, 0},
Packit fcad23
    {"zyyy", 0, 0, 0, 0},
Packit fcad23
    {"0xfffffffffffffffff", 0, ERANGE, 19, ULLONG_MAX},
Packit fcad23
    {"0xfffffffffffffffffz", 0, ERANGE, 19, ULLONG_MAX}
Packit fcad23
};
Packit fcad23
Packit fcad23
unsigned int    i;
Packit fcad23
Packit fcad23
for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) {
Packit fcad23
    const struct strtoull_testcase *const p = &test_input[i];
Packit fcad23
    char           *endptr;
Packit fcad23
    uint64_t        result;
Packit fcad23
Packit fcad23
    errno = 0;
Packit fcad23
    result = strtoull(p->nptr, &endptr, p->base);
Packit fcad23
    OKF(errno == p->expected_errno,
Packit fcad23
        ("test %d (input \"%s\"): expected errno %d, got errno %d",
Packit fcad23
         i, p->nptr, p->expected_errno, errno));
Packit fcad23
    OKF(result == p->expected_result,
Packit fcad23
        ("test %d (input \"%s\"): expected result %" PRIu64
Packit fcad23
         ", got result %" PRIu64,
Packit fcad23
         i, p->nptr, p->expected_result, result));
Packit fcad23
    OKF(endptr - p->nptr == p->expected_end,
Packit fcad23
        ("test %d (input \"%s\"): expected end %d, got end %d",
Packit fcad23
         i, p->nptr, p->expected_end, (int) (endptr - p->nptr)));
Packit fcad23
}
Packit fcad23
Packit fcad23
#endif