Improve tests when float-point is disabled. Minor error code change related to disabling floating-point
Attempts to decode floating-point dates with use of floating-point HW no longer returns QCBOR_ERR_FLOAT_DATE_DISABLED sometimes. Now, in all cases it returns QCBOR_ERR_HW_FLOAT_DISABLED.
This PR also simplifies the test code for floating point and increases test coverage for cases when floating-point is disabled.
Documentation for disabled floating point is improved.
diff --git a/test/float_tests.c b/test/float_tests.c
index 99297c0..3484084 100644
--- a/test/float_tests.c
+++ b/test/float_tests.c
@@ -18,6 +18,23 @@
#include "qcbor/qcbor_spiffy_decode.h"
#include <math.h> // For INFINITY and NAN and isnan()
+
+/* Make a test results code that includes three components
+ * Return code is
+ * xxxyyyzzz where zz is the error code, yy is the test number and zz is
+ * check being performed
+ */
+static inline int32_t MakeTestResultCode(uint32_t uTestCase,
+ uint32_t uTestNumber,
+ QCBORError uErrorCode)
+{
+ uint32_t uCode = (uTestCase * 1000000) +
+ (uTestNumber * 1000) +
+ (uint32_t)uErrorCode;
+ return (int32_t)uCode;
+}
+
+
#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
#include "half_to_double_from_rfc7049.h"
@@ -606,18 +623,21 @@
/*
-[0.0, // Half
- 3.14, // Double
- 0.0, // Double
- NaN, // Double
- Infinity, // Double
- 0.0, // Half
- 3.140000104904175, // Single
- 0.0, // Single
- NaN, // Single
- Infinity, // Single
- {100: 0.0, 101: 3.1415926, "euler": 2.718281828459045, 105: 0.0,
- 102: 0.0, 103: 3.141592502593994, "euler2": 2.7182817459106445, 106: 0.0}]
+ * Some encoded floating point numbers that are used for both
+ * encode and decode tests.
+ *
+ * [0.0, // Half
+ * 3.14, // Double
+ * 0.0, // Double
+ * NaN, // Double
+ * Infinity, // Double
+ * 0.0, // Half (Duplicate because of use in encode tests)
+ * 3.140000104904175, // Single
+ * 0.0, // Single
+ * NaN, // Single
+ * Infinity, // Single
+ * {100: 0.0, 101: 3.1415926, "euler": 2.718281828459045, 105: 0.0,
+ * 102: 0.0, 103: 3.141592502593994, "euler2": 2.7182817459106445, 106: 0.0}]
*/
static const uint8_t spExpectedFloats[] = {
0x8B,
@@ -756,419 +776,270 @@
int32_t GeneralFloatDecodeTests()
{
- UsefulBufC TestData = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedFloats);
-
+ QCBORItem Item;
+ QCBORError uErr;
QCBORDecodeContext DC;
- QCBORDecode_Init(&DC, TestData, 0);
- QCBORItem Item;
- QCBORError uErr;
+ UsefulBufC TestData = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedFloats);
+ QCBORDecode_Init(&DC, TestData, 0);
QCBORDecode_GetNext(&DC, &Item);
if(Item.uDataType != QCBOR_TYPE_ARRAY) {
- return -1;
+ return MakeTestResultCode(0, 1, 0);
}
+ /* 0.0 half-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_HALF_PREC(QCBOR_SUCCESS)
#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
|| Item.uDataType != QCBOR_TYPE_DOUBLE
|| Item.val.dfnum != 0.0
+#else /* QCBOR_DISABLE_PREFERRED_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
) {
- return -2;
+ return MakeTestResultCode(0, 2, uErr);
}
+ /* 3.14 double-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
|| Item.uDataType != QCBOR_TYPE_DOUBLE
|| Item.val.dfnum != 3.14
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -4;
+ return MakeTestResultCode(0, 3, uErr);
}
+ /* 0.0 double-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
|| Item.uDataType != QCBOR_TYPE_DOUBLE
|| Item.val.dfnum != 0.0
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -5;
+ return MakeTestResultCode(0, 4, uErr);
}
+ /* NaN double-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
|| Item.uDataType != QCBOR_TYPE_DOUBLE
|| !isnan(Item.val.dfnum)
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -6;
+ return MakeTestResultCode(0, 5, uErr);
}
+ /* Infinity double-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
|| Item.uDataType != QCBOR_TYPE_DOUBLE
|| Item.val.dfnum != INFINITY
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -7;
+ return MakeTestResultCode(0, 6, uErr);
}
-// Tests for normal config
+ /* 0.0 half-precision (again) */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_HALF_PREC(QCBOR_SUCCESS)
#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
|| Item.uDataType != QCBOR_TYPE_DOUBLE
|| Item.val.dfnum != 0.0
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
) {
- return -8;
+ return MakeTestResultCode(0, 7, uErr);
}
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ /* 3.140000104904175 single-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
|| Item.uDataType != QCBOR_TYPE_DOUBLE
|| CHECK_EXPECTED_DOUBLE(3.14, Item.val.dfnum)
-#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
- ) {
- return -9;
- }
-
- uErr = QCBORDecode_GetNext(&DC, &Item);
- if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
- || Item.uDataType != QCBOR_TYPE_DOUBLE
- || Item.val.dfnum != 0.0
-#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
- ) {
- return -10;
- }
-
- uErr = QCBORDecode_GetNext(&DC, &Item);
- if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
- || Item.uDataType != QCBOR_TYPE_DOUBLE
- || !isnan(Item.val.dfnum)
-#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
- ) {
- return -11;
- }
-
- uErr = QCBORDecode_GetNext(&DC, &Item);
- if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
- || Item.uDataType != QCBOR_TYPE_DOUBLE
- || Item.val.dfnum != INFINITY
-#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
- ) {
- return -12;
- }
-
#else /* QCBOR_DISABLE_FLOAT_HW_USE */
- // Tests for floating point HW use disabled
- uErr = QCBORDecode_GetNext(&DC, &Item);
- if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
|| Item.uDataType != QCBOR_TYPE_FLOAT
|| CHECK_EXPECTED_DOUBLE(3.14, Item.val.fnum)
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -9;
+ return MakeTestResultCode(0, 8, uErr);
}
+ /* 0.0 single-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || Item.uDataType != QCBOR_TYPE_DOUBLE
+ || Item.val.dfnum != 0.0
+#else /* QCBOR_DISABLE_FLOAT_HW_USE */
|| Item.uDataType != QCBOR_TYPE_FLOAT
|| Item.val.fnum != 0.0
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -10;
+ return MakeTestResultCode(0, 9, uErr);
}
+ /* NaN single-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || Item.uDataType != QCBOR_TYPE_DOUBLE
+ || !isnan(Item.val.dfnum)
+#else /* QCBOR_DISABLE_FLOAT_HW_USE */
|| Item.uDataType != QCBOR_TYPE_FLOAT
|| !isnan(Item.val.fnum)
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -11;
+ return MakeTestResultCode(0, 10, uErr);
}
+ /* Infinity single-precision */
uErr = QCBORDecode_GetNext(&DC, &Item);
if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS)
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || Item.uDataType != QCBOR_TYPE_DOUBLE
+ || Item.val.dfnum != INFINITY
+#else /* QCBOR_DISABLE_FLOAT_HW_USE */
|| Item.uDataType != QCBOR_TYPE_FLOAT
|| Item.val.fnum != INFINITY
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+#else /* USEFULBUF_DISABLE_ALL_FLOAT */
+ || Item.uDataType != QCBOR_TYPE_NONE
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
) {
- return -12;
+ return MakeTestResultCode(0, 11, uErr);
}
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ /* Sufficent test coverage. Don't need to decode the rest. */
- /* Sufficent test coverage. Don't need to decode the rest */
-
-
- // Now tests for spiffy decode
- TestData = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedFloats);
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+ /* Now tests for spiffy decode main function */
+ TestData = UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spExpectedFloats);
double d;
-#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
QCBORDecode_Init(&DC, TestData, 0);
QCBORDecode_EnterArray(&DC, NULL);
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
+ /* 0.0 half-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != FLOAT_ERR_CODE_NO_HALF_PREC(QCBOR_SUCCESS)
#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- // Spiffy decode tests for normal full float support
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -100;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 3.14) {
- return -101;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -102;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- !isnan(d)) {
- return -103;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != INFINITY) {
- return -104;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -105;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 3.140000104904175) {
- return -106;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -107;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- !isnan(d)) {
- return -108;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != INFINITY) {
- return -109;
- }
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
- // Spiffy decode tests for float HW disabled
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -200;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 3.14) {
- return -201;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -202;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- !isnan(d)) {
- return -203;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != INFINITY) {
- return -204;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -205;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_ERR_HW_FLOAT_DISABLED) {
- return -206;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_ERR_HW_FLOAT_DISABLED) {
- return -207;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_ERR_HW_FLOAT_DISABLED ) {
- return -208;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_ERR_HW_FLOAT_DISABLED ) {
- return -209;
- }
-
-
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-#else /* QCBOR_DISABLE_PREFERRED_FLOAT */
- // Spiffy decode tests for half-precision disabled
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_ERR_HALF_PRECISION_DISABLED) {
- return -300;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 3.14) {
- return -301;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -302;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- !isnan(d)) {
- return -303;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_SUCCESS ||
- d != INFINITY) {
- return -304;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
- if(uErr != QCBOR_ERR_HALF_PRECISION_DISABLED) {
- return -305;
- }
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(uErr != QCBOR_SUCCESS ||
- d != 3.140000104904175) {
- return -306;
- }
-#else
- // Disabled use of HW to convert from single to double
- if(uErr != QCBOR_ERR_HW_FLOAT_DISABLED) {
- return -316;
- }
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(uErr != QCBOR_SUCCESS ||
- d != 0.0) {
- return -307;
- }
-#else
- // Disabled use of HW to convert from single to double
- if(uErr == QCBOR_SUCCESS) {
- return -317;
- }
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(uErr != QCBOR_SUCCESS ||
- !isnan(d)) {
- return -308;
- }
-#else
- // Disabled use of HW to convert from single to double
- if(uErr == QCBOR_SUCCESS) {
- return -318;
- }
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-
- QCBORDecode_GetDouble(&DC, &d);
- uErr = QCBORDecode_GetAndResetError(&DC);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(uErr != QCBOR_SUCCESS ||
- d != INFINITY) {
- return -309;
- }
-#else
- // Disabled use of HW to convert from single to double
- if(uErr == QCBOR_SUCCESS) {
- return -318;
- }
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ || d != 0.0
#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
+ ) {
+ return MakeTestResultCode(1, 1, uErr);
+ }
+
+ /* 3.14 double-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != QCBOR_SUCCESS || d != 3.14) {
+ return MakeTestResultCode(1, 2, uErr);
+ }
+
+ /* 0.0 double-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != QCBOR_SUCCESS || d != 0.0) {
+ return MakeTestResultCode(1, 3, uErr);
+ }
+
+ /* NaN double-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != QCBOR_SUCCESS || !isnan(d)) {
+ return MakeTestResultCode(1, 4, uErr);
+ }
+
+ /* Infinity double-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != QCBOR_SUCCESS || d != INFINITY) {
+ return MakeTestResultCode(1, 5, uErr);
+ }
+
+ /* 0.0 half-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != FLOAT_ERR_CODE_NO_HALF_PREC(QCBOR_SUCCESS)
+#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
+ || d != 0.0
+#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
+ ) {
+ return MakeTestResultCode(1, 6, uErr);
+ }
+
+ /* 3.140000104904175 single-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || d != 3.140000104904175
+#endif
+ ) {
+ return MakeTestResultCode(1, 7, uErr);
+ }
+
+ /* 0.0 single-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || d != 0.0
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ ) {
+ return MakeTestResultCode(1, 8, uErr);
+ }
+
+ /* NaN single-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ if(uErr != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || !isnan(d)
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ ) {
+ return MakeTestResultCode(1, 9, uErr);
+ }
+
+ /* Infinity single-precision */
+ QCBORDecode_GetDouble(&DC, &d);
+ uErr = QCBORDecode_GetAndResetError(&DC);
+ if(uErr != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || d != INFINITY
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ ) {
+ return MakeTestResultCode(1, 10, uErr);
+ }
+
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
return 0;
diff --git a/test/qcbor_decode_tests.c b/test/qcbor_decode_tests.c
index aebe492..c440fb0 100644
--- a/test/qcbor_decode_tests.c
+++ b/test/qcbor_decode_tests.c
@@ -2331,44 +2331,57 @@
static const uint8_t spDateTestInput[] = {
+ /* 1. The valid date string "1985-04-12" */
0xc0, // tag for string date
0x6a, '1','9','8','5','-','0','4','-','1','2', // Date string
+ /* 2. An invalid date string due to wrong tag content type */
0xc0, // tag for string date
0x00, // Wrong type for a string date
+ /* 3. A valid epoch date, 1400000000; Tue, 13 May 2014 16:53:20 GMT */
0xc1, // tag for epoch date
0x1a, 0x53, 0x72, 0x4E, 0x00, // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
+ /* 4. An invalid epoch date due to wrong tag content type */
0xc1,
0x62, 'h', 'i', // wrong type tagged
+ /* 5. Valid epoch date tag as content for a two other nested tags */
// CBOR_TAG_ENC_AS_B64
- 0xcf, 0xd8, 0x16, 0xc1, // 0xee, // Epoch date with extra tags
+ 0xcf, 0xd8, 0x16, 0xc1, // Epoch date with extra tags
0x1a, 0x53, 0x72, 0x4E, 0x01,
+ /* 6. Epoch date with value to large to fit into int64 */
0xc1, // tag for epoch date
0x1b, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, // Too large integer
+ /* 7. Epoch date with single-precision value of 1.1. */
0xc1, // tag for epoch date
0xfa, 0x3f, 0x8c, 0xcc, 0xcd, // single with value 1.1
+ /* 8. Epoch date with too-large single precision float */
0xc1, // tag for epoch date
0xfa, 0x7f, 0x7f, 0xff, 0xff, // 3.4028234663852886e+38 too large
+ /* 9. Epoch date with slightly too-large double precision value */
0xc1, // tag for epoch date
0xfb, 0x43, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 9223372036854775808.000000 just barely too large
//0xfa, 0x7f, 0x7f, 0xff, 0xff // 3.4028234663852886e+38 too large
+ /* 10. Epoch date with largest supported double precision value */
0xc1, // tag for epoch date
0xfb, 0x43, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, // 9223372036854773760 largest supported
+ /* 11. Epoch date with single-precision NaN */
0xc1, // tag for epoch date
0xfa, 0x7f, 0xc0, 0x00, 0x00, // Single-precision NaN
+ /* 12. Epoch date with double precision plus infinity */
0xc1,
0xfb, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // +infinity
+ /* 13. Epoch date with half-precision negative infinity */
0xc1, // tag for epoch date
0xf9, 0xfc, 0x00, // -Infinity
};
@@ -2399,7 +2412,7 @@
UsefulBuf_FROM_BYTE_ARRAY_LITERAL(spDateTestInput),
QCBOR_DECODE_MODE_NORMAL);
- // String date
+ /* 1. The valid date string "1985-04-12" */
if((uError = QCBORDecode_GetNext(&DCtx, &Item))) {
return -1;
}
@@ -2408,30 +2421,34 @@
return -2;
}
- // Wrong type for a string date
+ /* 2. An invalid date string due to wrong tag content type */
uError = QCBORDecode_GetNext(&DCtx, &Item);
if(uError != QCBOR_ERR_BAD_OPT_TAG) {
return -3;
}
- // Epoch date 1400000000; Tue, 13 May 2014 16:53:20 GMT
- if((uError = QCBORDecode_GetNext(&DCtx, &Item))) {
+ /* 3. A valid epoch date, 1400000000; Tue, 13 May 2014 16:53:20 GMT */
+ uError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(uError != QCBOR_SUCCESS) {
return -4;
}
- if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
- Item.val.epochDate.nSeconds != 1400000000
+ if(uError == QCBOR_SUCCESS) {
+ if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
+ Item.val.epochDate.nSeconds != 1400000000
#ifndef USEFULBUF_DISABLE_ALL_FLOAT
- || Item.val.epochDate.fSecondsFraction != 0
+ || Item.val.epochDate.fSecondsFraction != 0
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
- ) {
- return -5;
+ ) {
+ return -5;
+ }
}
- // Wrong type for an epoch date
+ /* 4. An invalid epoch date due to wrong tag content type */
if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_BAD_OPT_TAG) {
return -6;
}
+ /* 5. Valid epoch date tag as content for a two other nested tags */
// Epoch date wrapped in an CBOR_TAG_ENC_AS_B64 and an unknown tag.
// The date is decoded and the two tags are returned. This is to
// make sure the wrapping of epoch date in another tag works OK.
@@ -2447,96 +2464,70 @@
return -8;
}
- // Epoch date that is too large for our representation
+ /* 6. Epoch date with value to large to fit into int64 */
if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
return -9;
}
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- // Epoch date in float format with fractional seconds
- if((uError = QCBORDecode_GetNext(&DCtx, &Item))) {
+ /* 7. Epoch date with single-precision value of 1.1. */
+ uError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)) {
return -10;
}
- if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
- Item.val.epochDate.nSeconds != 1
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
- || CHECK_EXPECTED_DOUBLE(Item.val.epochDate.fSecondsFraction, 0.1 )
+ if(uError == QCBOR_SUCCESS) {
+ if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
+ Item.val.epochDate.nSeconds != 1
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || CHECK_EXPECTED_DOUBLE(Item.val.epochDate.fSecondsFraction, 0.1)
#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
- ) {
- return -11;
+ ) {
+ return -11;
+ }
}
- // Epoch date float that is too large for our representation
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
+ /* 8. Epoch date with too-large single-precision float */
+ uError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return -12;
}
- // Epoch date double that is just slightly too large
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
+ /* 9. Epoch date with slightly too-large double-precision value */
+ uError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return -13;
}
- // Largest double epoch date supported
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_SUCCESS ||
- Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
- Item.val.epochDate.nSeconds != 9223372036854773760 ||
- Item.val.epochDate.nSeconds == 0) {
- return -14;
- }
+ /* 10. Epoch date with largest supported double-precision value */
+ uError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)) {
+ return -14;
+ }
+ if(uError == QCBOR_SUCCESS) {
+ if(Item.uDataType != QCBOR_TYPE_DATE_EPOCH ||
+ Item.val.epochDate.nSeconds != 9223372036854773760
+#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+ || Item.val.epochDate.fSecondsFraction != 0.0
+#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ ) {
+ return -14;
+ }
+ }
- // Nan
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
+ /* 11. Epoch date with single-precision NaN */
+ if(QCBORDecode_GetNext(&DCtx, &Item) != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return -15;
}
- // +Inifinity double-precision
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
+ /* 12. Epoch date with double-precision plus infinity */
+ if(QCBORDecode_GetNext(&DCtx, &Item) != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return -16;
}
-#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
- // -Inifinity half-precision
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_DATE_OVERFLOW) {
+ /* 13. Epoch date with half-precision negative infinity */
+ uError = QCBORDecode_GetNext(&DCtx, &Item);
+ if(uError != FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return -17;
}
-#else
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_HALF_PRECISION_DISABLED) {
- return -18;
- }
-#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
-
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
- return -19;
- }
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
- return -20;
- }
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
- return -21;
- }
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
- return -22;
- }
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
- return -23;
- }
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
- return -24;
- }
-#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_FLOAT_DATE_DISABLED) {
- return -25;
- }
-#else
- if(QCBORDecode_GetNext(&DCtx, &Item) != QCBOR_ERR_HALF_PRECISION_DISABLED) {
- return -26;
- }
-#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
-
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
return 0;
}
@@ -2665,15 +2656,9 @@
// Too-negative float, -9.2233720368547748E+18
QCBORDecode_GetEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
uError = QCBORDecode_GetAndResetError(&DC);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(uError != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_DATE_OVERFLOW)) {
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return 1111;
}
-#else
- if(uError != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_FLOAT_DATE_DISABLED)) {
- return 1112;
- }
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
// Too-large integer
QCBORDecode_GetEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
@@ -2685,16 +2670,7 @@
// Half-precision minus infinity
QCBORDecode_GetEpochDate(&DC, QCBOR_TAG_REQUIREMENT_TAG, &nEpochDateFail);
uError = QCBORDecode_GetAndResetError(&DC);
-#ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- const QCBORError uExpectedforHalfMinusInfinity = FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_DATE_OVERFLOW);
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
- const QCBORError uExpectedforHalfMinusInfinity = FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_FLOAT_DATE_DISABLED);
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-#else /* QCBOR_DISABLE_PREFERRED_FLOAT */
- const QCBORError uExpectedforHalfMinusInfinity = FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_HALF_PRECISION_DISABLED);
-#endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
- if(uError != uExpectedforHalfMinusInfinity) {
+ if(uError != FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return 2;
}
@@ -2720,59 +2696,54 @@
QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG |
QCBOR_TAG_REQUIREMENT_ALLOW_ADDITIONAL_TAGS,
&nEpochDate2);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(nEpochDate2 != -9223372036854773760LL) {
- return 101;
- }
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
uError = QCBORDecode_GetAndResetError(&DC);
- if(uError != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_FLOAT_DATE_DISABLED)) {
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)) {
return 102;
}
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ if(uError == QCBOR_SUCCESS) {
+ if(nEpochDate2 != -9223372036854773760LL) {
+ return 101;
+ }
+ }
// Get largest double precision epoch date allowed
QCBORDecode_GetEpochDateInMapN(&DC, 7, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
&nEpochDate2);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(nEpochDate2 != 9223372036854773760ULL) {
- return 111;
- }
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
uError = QCBORDecode_GetAndResetError(&DC);
- if(uError != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_FLOAT_DATE_DISABLED)) {
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)) {
return 112;
}
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ if(uError == QCBOR_SUCCESS) {
+ if(nEpochDate2 != 9223372036854773760ULL) {
+ return 111;
+ }
+ }
// A single-precision date
QCBORDecode_GetEpochDateInMapSZ(&DC, "x", QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
&nEpochDate5);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(nEpochDate5 != 3) {
- return 103;
- }
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
uError = QCBORDecode_GetAndResetError(&DC);
- if(uError != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_FLOAT_DATE_DISABLED)) {
+ if(uError != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)) {
return 104;
}
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ if(uError == QCBOR_SUCCESS) {
+ if(nEpochDate5 != 3) {
+ return 103;
+ }
+ }
// A half-precision date with value -2 FFF
QCBORDecode_GetEpochDateInMapN(&DC, 9, QCBOR_TAG_REQUIREMENT_OPTIONAL_TAG,
&nEpochDate4);
-#if !defined(QCBOR_DISABLE_FLOAT_HW_USE) && !defined(QCBOR_DISABLE_PREFERRED_FLOAT)
- if(nEpochDate4 != -2) {
- return 105;
- }
-#else
uError = QCBORDecode_GetAndResetError(&DC);
- if(uError == QCBOR_SUCCESS) {
+ if(uError != FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_SUCCESS)) {
return 106;
}
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
-
+ if(uError == QCBOR_SUCCESS) {
+ if(nEpochDate4 != -2) {
+ return 105;
+ }
+ }
// Fail to get an epoch date by string label
QCBORDecode_GetEpochDateInMapSZ(&DC, "no-label",
@@ -5493,15 +5464,9 @@
QCBORDecode_GetEpochDateInMapN(&DCtx, 0x04, QCBOR_TAG_REQUIREMENT_TAG, &nInt);
uErr = QCBORDecode_GetAndResetError(&DCtx);
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
- if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_DATE_OVERFLOW)) {
+ if(uErr != FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_DATE_OVERFLOW)) {
return 2024;
}
-#else
- if(uErr != FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_FLOAT_DATE_DISABLED)) {
- return 2027;
- }
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
QCBORDecode_GetInt64InMapN(&DCtx, 0x05, &nInt);
uErr = QCBORDecode_GetAndResetError(&DCtx);
@@ -5625,6 +5590,13 @@
QCBORError uErrorDouble;
};
+#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
+#define EXP_AND_MANTISSA_ERROR(x) x
+#else
+#define EXP_AND_MANTISSA_ERROR(x) QCBOR_ERR_UNEXPECTED_TYPE
+#endif
+
+
static const struct NumberConversion NumberConversions[] = {
{
"too large to fit into int64_t",
@@ -5634,7 +5606,7 @@
0,
QCBOR_ERR_NUMBER_SIGN_CONVERSION,
((double)INT64_MIN) + 1 ,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
"largest negative int that fits in int64_t",
@@ -5644,7 +5616,7 @@
0,
QCBOR_ERR_NUMBER_SIGN_CONVERSION,
(double)INT64_MIN,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
"negative bignum -1",
@@ -5654,67 +5626,40 @@
0,
QCBOR_ERR_NUMBER_SIGN_CONVERSION,
-1.0,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
"Decimal Fraction with positive bignum 257 * 10e3",
{(uint8_t[]){0xC4, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0xC2, 0x42, 0x01, 0x01}, 15},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
257000,
- QCBOR_SUCCESS,
+ EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS),
257000,
- QCBOR_SUCCESS,
+ EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS),
257000.0,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA*/
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
"bigfloat with negative bignum -258 * 2e3",
{(uint8_t[]){0xC5, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0xC3, 0x42, 0x01, 0x01}, 15},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
-2064,
- QCBOR_SUCCESS,
+ EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS),
0,
- QCBOR_ERR_NUMBER_SIGN_CONVERSION,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_NUMBER_SIGN_CONVERSION),
-2064.0,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA*/
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
"bigfloat with positive bignum 257 * 2e3",
{(uint8_t[]){0xC5, 0x82, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0xC2, 0x42, 0x01, 0x01}, 15},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
2056,
- QCBOR_SUCCESS,
+ EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS),
2056,
- QCBOR_SUCCESS,
+ EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS),
2056.0,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA*/
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
"negative bignum 0xc349010000000000000000 -18446744073709551617",
@@ -5724,7 +5669,7 @@
0,
QCBOR_ERR_NUMBER_SIGN_CONVERSION,
-18446744073709551617.0,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
#ifndef QCBOR_DISABLE_INDEFINITE_LENGTH_STRINGS
{
@@ -5735,67 +5680,40 @@
0x01020304,
QCBOR_SUCCESS,
16909060.0,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
#endif /* QCBOR_DISABLE_INDEFINITE_LENGTH_STRINGS */
{
"Decimal Fraction with neg bignum [9223372036854775807, -4759477275222530853137]",
{(uint8_t[]){0xC4, 0x82, 0x1B, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xC3, 0x4A, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10,}, 23},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
0,
- QCBOR_ERR_NUMBER_SIGN_CONVERSION,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_NUMBER_SIGN_CONVERSION),
-INFINITY,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
"big float [9223372036854775806, 9223372036854775806]",
{(uint8_t[]){0xC5, 0x82, 0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE}, 20},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
INFINITY,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
"Big float 3 * 2^^2",
{(uint8_t[]){0xC5, 0x82, 0x02, 0x03}, 4},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
12,
- QCBOR_SUCCESS,
+ EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS),
12,
- QCBOR_SUCCESS,
+ EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS),
12.0,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
"Positive integer 18446744073709551615",
@@ -5805,7 +5723,7 @@
18446744073709551615ULL,
QCBOR_SUCCESS,
18446744073709551615.0,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
"Positive bignum 0xffff",
@@ -5815,7 +5733,7 @@
0xffff,
QCBOR_SUCCESS,
65535.0,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
"Postive integer 0",
@@ -5825,7 +5743,7 @@
0ULL,
QCBOR_SUCCESS,
0.0,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
"Negative integer -18446744073709551616",
@@ -5835,24 +5753,17 @@
0ULL,
QCBOR_ERR_NUMBER_SIGN_CONVERSION,
-9223372036854775808.0,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
"Double Floating point value 100.3",
{(uint8_t[]){0xfb, 0x40, 0x59, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33}, 9},
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
100L,
- FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS),
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS),
100ULL,
- FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS),
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
- 0,
- FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_HW_FLOAT_DISABLED),
- 0,
- FLOAT_ERR_CODE_NO_FLOAT(QCBOR_ERR_HW_FLOAT_DISABLED),
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS),
100.3,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT(QCBOR_SUCCESS),
},
{
"Floating point value NaN 0xfa7fc00000",
@@ -5862,56 +5773,38 @@
0,
FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_FLOAT_EXCEPTION),
NAN,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS),
},
{
"half-precision Floating point value -4",
{(uint8_t[]){0xf9, 0xc4, 0x00}, 3},
-#ifndef USEFULBUF_DISABLE_ALL_FLOAT
// Normal case with all enabled.
-4,
FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_SUCCESS),
0,
FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_ERR_NUMBER_SIGN_CONVERSION),
-4.0,
- FLOAT_ERR_CODE_NO_HALF_PREC_NO_FLOAT_HW(QCBOR_SUCCESS)
-#else /* USEFULBUF_DISABLE_ALL_FLOAT */
- 0,
- QCBOR_ERR_ALL_FLOAT_DISABLED,
- 0,
- QCBOR_ERR_ALL_FLOAT_DISABLED,
- 0,
- QCBOR_ERR_ALL_FLOAT_DISABLED,
-#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
+ FLOAT_ERR_CODE_NO_HALF_PREC(QCBOR_SUCCESS)
},
{
"Decimal fraction 3/10",
{(uint8_t[]){0xC4, 0x82, 0x20, 0x03}, 4},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
0.30000000000000004,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
- "+inifinity",
+ "+inifinity single precision",
{(uint8_t[]){0xfa, 0x7f, 0x80, 0x00, 0x00}, 5},
0,
FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_FLOAT_EXCEPTION),
0,
FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
INFINITY,
- QCBOR_SUCCESS
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
@@ -5973,13 +5866,8 @@
QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
0,
QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
INFINITY,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
- 0,
- QCBOR_ERR_HW_FLOAT_DISABLED,
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS),
},
{
@@ -6041,13 +5929,8 @@
QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
0,
QCBOR_ERR_NUMBER_SIGN_CONVERSION,
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
-INFINITY,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_FLOAT_HW_USE */
- 0,
- QCBOR_ERR_HW_FLOAT_DISABLED,
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(QCBOR_SUCCESS)
},
{
@@ -6056,21 +5939,12 @@
0xC5, 0x82,
0x3B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE,
0x1B, 0x7f, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE}, 20},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
0,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA */
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
{
@@ -6079,21 +5953,12 @@
0xC5, 0x82,
0x1B, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
0xC3, 0x42, 0x01, 0x01}, 15},
-#ifndef QCBOR_DISABLE_EXP_AND_MANTISSA
0,
- QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_CONVERSION_UNDER_OVER_FLOW),
0,
- QCBOR_ERR_NUMBER_SIGN_CONVERSION,
+ EXP_AND_MANTISSA_ERROR(QCBOR_ERR_NUMBER_SIGN_CONVERSION),
-INFINITY,
- QCBOR_SUCCESS
-#else /* QCBOR_DISABLE_EXP_AND_MANTISSA */
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0,
- QCBOR_ERR_UNEXPECTED_TYPE,
- 0.0,
- QCBOR_ERR_UNEXPECTED_TYPE
-#endif /* QCBOR_DISABLE_EXP_AND_MANTISSA*/
+ FLOAT_ERR_CODE_NO_FLOAT_HW(EXP_AND_MANTISSA_ERROR(QCBOR_SUCCESS))
},
};
@@ -6159,7 +6024,8 @@
if(SetUpDecoder(&DCtx, pF->CBOR, Pool)) {
return (int32_t)(3333+nIndex);
}
-#ifndef QCBOR_DISABLE_FLOAT_HW_USE
+
+#ifndef USEFULBUF_DISABLE_ALL_FLOAT
double d;
QCBORDecode_GetDoubleConvertAll(&DCtx, 0xffff, &d);
if(QCBORDecode_GetError(&DCtx) != pF->uErrorDouble) {
@@ -6178,7 +6044,7 @@
}
}
}
-#endif /* QCBOR_DISABLE_FLOAT_HW_USE */
+#endif /* USEFULBUF_DISABLE_ALL_FLOAT */
}
return 0;