
* constness in ternary expressions * removal of OS_MAX_INTEGER * inclusion of dds/ddsrt/attributes.h everywhere DDS_EXPORT inline occurs * _POSIX_PTHREAD_SEMANTICS in ddsperf Signed-off-by: Erik Boasson <eb@ilities.com>
343 lines
8.2 KiB
C
343 lines
8.2 KiB
C
/*
|
|
* Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
|
|
*
|
|
* This program and the accompanying materials are made available under the
|
|
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
* http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
|
|
* v. 1.0 which is available at
|
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
|
*
|
|
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
|
|
*/
|
|
#include "CUnit/Test.h"
|
|
#include "dds/ddsrt/cdtors.h"
|
|
#include "dds/ddsrt/misc.h"
|
|
#include "dds/ddsrt/strtol.h"
|
|
|
|
const char *str;
|
|
char *ptr;
|
|
char buf[100];
|
|
char str_llmin[100];
|
|
char str_llmax[100];
|
|
char str_ullmax[100];
|
|
char str_llrange[100];
|
|
char str_ullrange[100];
|
|
|
|
char str_xllmin[99], str_xllmax[99];
|
|
|
|
/* Really test with the maximum values supported on a platform, not some
|
|
made up number. */
|
|
long long llmin = INT64_MIN;
|
|
long long llmax = INT64_MAX;
|
|
unsigned long long ullmax = UINT64_MAX;
|
|
|
|
CU_Init(ddsrt_strtoll)
|
|
{
|
|
ddsrt_init();
|
|
(void)snprintf (str_llmin, sizeof(str_llmin), "%lld", llmin);
|
|
(void)snprintf (str_llmax, sizeof(str_llmax), "%lld", llmax);
|
|
(void)snprintf (str_llrange, sizeof(str_llrange), "%lld1", llmax);
|
|
(void)snprintf (str_ullmax, sizeof(str_ullmax), "%llu", ullmax);
|
|
(void)snprintf (str_ullrange, sizeof(str_ullrange), "%llu1", ullmax);
|
|
(void)snprintf (str_xllmin, sizeof(str_xllmin), "-%llx", llmin);
|
|
(void)snprintf (str_xllmax, sizeof(str_xllmax), "+%llx", llmax);
|
|
return 0;
|
|
}
|
|
|
|
CU_Clean(ddstr_strtoll)
|
|
{
|
|
ddsrt_fini();
|
|
return 0;
|
|
}
|
|
|
|
CU_Test(ddsrt_strtoll, strtoll)
|
|
{
|
|
dds_return_t rc;
|
|
long long ll;
|
|
static char dummy[] = "dummy";
|
|
|
|
str = "gibberish";
|
|
ll = -1;
|
|
rc = ddsrt_strtoll(str, &ptr, 0, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0 && ptr == str);
|
|
|
|
str = "+gibberish";
|
|
ll = -2;
|
|
rc = ddsrt_strtoll(str, &ptr, 0, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0 && ptr == str);
|
|
|
|
str = "-gibberish";
|
|
ll = -3;
|
|
rc = ddsrt_strtoll(str, &ptr, 0, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0 && ptr == str);
|
|
|
|
str = "gibberish";
|
|
ptr = NULL;
|
|
ll = -4;
|
|
rc = ddsrt_strtoll(str, &ptr, 36, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 46572948005345 && ptr && *ptr == '\0');
|
|
|
|
str = "1050505055";
|
|
ptr = dummy;
|
|
ll = -5;
|
|
rc = ddsrt_strtoll(str, &ptr, 37, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_BAD_PARAMETER);
|
|
CU_ASSERT (ll == -5 && ptr == dummy);
|
|
|
|
str = " \t \n 1050505055";
|
|
ll = -6;
|
|
rc = ddsrt_strtoll(str, NULL, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 1050505055LL);
|
|
|
|
str = " \t \n -1050505055";
|
|
ptr = NULL;
|
|
ll = -7;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == -1050505055LL);
|
|
|
|
str = " \t \n - \t \n 1050505055";
|
|
ptr = NULL;
|
|
ll = -8;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0LL && ptr == str);
|
|
|
|
str = "10x";
|
|
ptr = NULL;
|
|
ll = -9;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 10LL && ptr && *ptr == 'x');
|
|
|
|
str = "+10x";
|
|
ll = -10;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 10LL && ptr && *ptr == 'x');
|
|
|
|
str = "-10x";
|
|
ll = -11;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == -10LL && ptr && *ptr == 'x');
|
|
|
|
str = (const char *)str_llmax;
|
|
ll = -12;
|
|
rc = ddsrt_strtoll(str, NULL, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == llmax);
|
|
|
|
str = (const char *)str_llmin;
|
|
ll = -13;
|
|
rc = ddsrt_strtoll(str, NULL, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == llmin);
|
|
|
|
str = (const char *)str_llrange;
|
|
ll = -14;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OUT_OF_RANGE);
|
|
CU_ASSERT (ll == llmax && *ptr == '1');
|
|
|
|
str = "0x100";
|
|
ll = -15;
|
|
rc = ddsrt_strtoll(str, NULL, 16, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0x100LL);
|
|
|
|
str = "0X100";
|
|
ll = -16;
|
|
rc = ddsrt_strtoll(str, NULL, 16, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0x100LL);
|
|
|
|
str = "0x1DEFCAB";
|
|
ll = -17;
|
|
rc = ddsrt_strtoll(str, NULL, 16, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0x1DEFCABLL);
|
|
|
|
str = "0x1defcab";
|
|
ll = -18;
|
|
rc = ddsrt_strtoll(str, NULL, 16, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0x1DEFCABLL);
|
|
|
|
str = (char *)str_xllmin;
|
|
ll = -19;
|
|
rc = ddsrt_strtoll(str, NULL, 16, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == llmin);
|
|
|
|
str = (char *)str_xllmax;
|
|
ll = -20;
|
|
rc = ddsrt_strtoll(str, NULL, 16, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == llmax);
|
|
|
|
str = "0x100";
|
|
ll = -21;
|
|
rc = ddsrt_strtoll(str, NULL, 0, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0x100LL);
|
|
|
|
str = "100";
|
|
ll = -22;
|
|
rc = ddsrt_strtoll(str, NULL, 16, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0x100LL);
|
|
|
|
/* calling os_strtoll with \"%s\" and base 10, expected result 0 */
|
|
str = "0x100";
|
|
ll = -23;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 0 && ptr && *ptr == 'x');
|
|
|
|
/* calling os_strtoll with \"%s\" and base 0, expected result 256 */
|
|
str = "0x100g";
|
|
ll = -24;
|
|
rc = ddsrt_strtoll(str, &ptr, 0, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 256 && ptr && *ptr == 'g');
|
|
|
|
str = "0100";
|
|
ll = -25;
|
|
rc = ddsrt_strtoll(str, NULL, 0, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 64LL);
|
|
|
|
str = "0100";
|
|
ll = -26;
|
|
rc = ddsrt_strtoll(str, NULL, 8, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 64LL);
|
|
|
|
str = "100";
|
|
ll = -27;
|
|
rc = ddsrt_strtoll(str, NULL, 8, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 64LL);
|
|
|
|
/* calling os_strtoll with \"%s\" and base 10, expected result 100 */
|
|
str = "0100";
|
|
ll = -28;
|
|
rc = ddsrt_strtoll(str, &ptr, 10, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 100);
|
|
|
|
/* calling os_strtoll with \"%s\" and base 0, expected result 64 */
|
|
str = "01008";
|
|
ll = -29;
|
|
rc = ddsrt_strtoll(str, &ptr, 8, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 64LL && ptr && *ptr == '8');
|
|
|
|
str = "00001010";
|
|
ll = -30;
|
|
rc = ddsrt_strtoll(str, NULL, 2, &ll);
|
|
CU_ASSERT (rc == DDS_RETCODE_OK);
|
|
CU_ASSERT (ll == 10LL);
|
|
}
|
|
|
|
CU_Test(ddsrt_strtoll, strtoull)
|
|
{
|
|
dds_return_t rc;
|
|
unsigned long long ull;
|
|
|
|
str = "0xffffffffffffffff";
|
|
ull = 1;
|
|
rc = ddsrt_strtoull(str, NULL, 0, &ull);
|
|
CU_ASSERT_EQUAL(rc, DDS_RETCODE_OK);
|
|
CU_ASSERT(ull == ullmax);
|
|
|
|
str = "-1";
|
|
ull = 2;
|
|
rc = ddsrt_strtoull(str, NULL, 0, &ull);
|
|
CU_ASSERT_EQUAL(rc, DDS_RETCODE_OK);
|
|
CU_ASSERT(ull == ullmax);
|
|
|
|
str = "-2";
|
|
ull = 3;
|
|
rc = ddsrt_strtoull(str, NULL, 0, &ull);
|
|
CU_ASSERT_EQUAL(rc, DDS_RETCODE_OK);
|
|
CU_ASSERT(ull == (ullmax - 1));
|
|
}
|
|
|
|
CU_Test(ddsrt_strtoll, atoll)
|
|
{
|
|
dds_return_t rc;
|
|
long long ll;
|
|
|
|
str = "10";
|
|
ll = -1;
|
|
rc = ddsrt_atoll(str, &ll);
|
|
CU_ASSERT_EQUAL(rc, DDS_RETCODE_OK);
|
|
CU_ASSERT(ll == 10);
|
|
}
|
|
|
|
CU_Test(ddsrt_strtoll, atoull)
|
|
{
|
|
dds_return_t rc;
|
|
unsigned long long ull;
|
|
|
|
str = "10";
|
|
ull = 1;
|
|
rc = ddsrt_atoull(str, &ull);
|
|
CU_ASSERT_EQUAL(rc, DDS_RETCODE_OK);
|
|
CU_ASSERT(ull == 10);
|
|
}
|
|
|
|
CU_Test(ddsrt_strtoll, lltostr)
|
|
{
|
|
long long ll;
|
|
|
|
ll = llmax;
|
|
ptr = ddsrt_lltostr(ll, buf, 0, NULL);
|
|
CU_ASSERT(ptr == NULL);
|
|
|
|
/* calling os_lltostr with %lld with buffer size of 5, expected result \"5432\" */
|
|
ll = 54321;
|
|
ptr = ddsrt_lltostr(ll, buf, 5, NULL);
|
|
CU_ASSERT(strcmp(ptr, "5432") == 0);
|
|
|
|
ll = llmax;
|
|
ptr = ddsrt_lltostr(ll, buf, sizeof(buf), NULL);
|
|
CU_ASSERT(strcmp(ptr, str_llmax) == 0);
|
|
|
|
ll = llmin;
|
|
ptr = ddsrt_lltostr(ll, buf, sizeof(buf), NULL);
|
|
CU_ASSERT(strcmp(ptr, str_llmin) == 0);
|
|
|
|
ll = 1;
|
|
ptr = ddsrt_lltostr(ll, buf, sizeof(buf), NULL);
|
|
CU_ASSERT(strcmp(ptr, "1") == 0);
|
|
|
|
ll = 0;
|
|
ptr = ddsrt_lltostr(ll, buf, sizeof(buf), NULL);
|
|
CU_ASSERT(strcmp(ptr, "0") == 0);
|
|
|
|
ll = -1;
|
|
ptr = ddsrt_lltostr(ll, buf, sizeof(buf), NULL);
|
|
CU_ASSERT(strcmp(ptr, "-1") == 0);
|
|
}
|
|
|
|
CU_Test(ddsrt_strtoll, ulltostr)
|
|
{
|
|
unsigned long long ull;
|
|
|
|
ull = ullmax;
|
|
ptr = ddsrt_ulltostr(ull, buf, sizeof(buf), NULL);
|
|
CU_ASSERT(strcmp(ptr, str_ullmax) == 0);
|
|
|
|
ull = 0ULL;
|
|
ptr = ddsrt_ulltostr(ull, buf, sizeof(buf), NULL);
|
|
CU_ASSERT(strcmp(ptr, "0") == 0);
|
|
}
|
|
|