57 lines
1.9 KiB
C
57 lines
1.9 KiB
C
|
|
/**
|
||
|
|
* @file convert.c
|
||
|
|
* @brief Tests the strict string-to-number converters.
|
||
|
|
*
|
||
|
|
* These exist because libakstdlib's aksl_ato* family cannot report a conversion
|
||
|
|
* failure. Every assertion here is one that family would get wrong.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include <errno.h>
|
||
|
|
|
||
|
|
#include <akbasic/convert.h>
|
||
|
|
#include <akbasic/error.h>
|
||
|
|
|
||
|
|
#include "testutil.h"
|
||
|
|
|
||
|
|
int main(void)
|
||
|
|
{
|
||
|
|
int64_t i = 0;
|
||
|
|
double d = 0.0;
|
||
|
|
|
||
|
|
TEST_REQUIRE_OK(akbasic_error_register());
|
||
|
|
|
||
|
|
/* Valid decimal, hex and negative. */
|
||
|
|
TEST_REQUIRE_OK(akbasic_str_to_int64("1234", 10, &i));
|
||
|
|
TEST_REQUIRE_INT(i, 1234);
|
||
|
|
TEST_REQUIRE_OK(akbasic_str_to_int64("0xff", 16, &i));
|
||
|
|
TEST_REQUIRE_INT(i, 255);
|
||
|
|
TEST_REQUIRE_OK(akbasic_str_to_int64("-256", 10, &i));
|
||
|
|
TEST_REQUIRE_INT(i, -256);
|
||
|
|
|
||
|
|
/*
|
||
|
|
* The whole point: aksl_atoi returns success with 0 for each of these.
|
||
|
|
*/
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_int64("", 10, &i), AKBASIC_ERR_VALUE);
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_int64("not a number", 10, &i), AKBASIC_ERR_VALUE);
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_int64("12abc", 10, &i), AKBASIC_ERR_VALUE);
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_int64("12 ", 10, &i), AKBASIC_ERR_VALUE);
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_int64("99999999999999999999999", 10, &i), ERANGE);
|
||
|
|
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_int64(NULL, 10, &i), AKERR_NULLPOINTER);
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_int64("1", 10, NULL), AKERR_NULLPOINTER);
|
||
|
|
|
||
|
|
/* Floats. */
|
||
|
|
TEST_REQUIRE_OK(akbasic_str_to_double("123.456", &d));
|
||
|
|
TEST_REQUIRE_FEQ(d, 123.456);
|
||
|
|
TEST_REQUIRE_OK(akbasic_str_to_double("-2.5", &d));
|
||
|
|
TEST_REQUIRE_FEQ(d, -2.5);
|
||
|
|
TEST_REQUIRE_OK(akbasic_str_to_double("32", &d));
|
||
|
|
TEST_REQUIRE_FEQ(d, 32.0);
|
||
|
|
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_double("", &d), AKBASIC_ERR_VALUE);
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_double("garbage", &d), AKBASIC_ERR_VALUE);
|
||
|
|
TEST_REQUIRE_STATUS(akbasic_str_to_double("1.5x", &d), AKBASIC_ERR_VALUE);
|
||
|
|
|
||
|
|
return akbasic_test_failures;
|
||
|
|
}
|