Skip to content

Commit 8f5be6a

Browse files
committed
Tests: add unit test coverage for NumberUtils::from_chars directly
Currently it was only tested indirectly via XMLReaderUtils_tests and file format tests Signed-off-by: Aras Pranckevicius <[email protected]>
1 parent 74b465a commit 8f5be6a

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

tests/utils/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ include(ExternalProject)
55

66
set(SOURCES
77
UnitTestMain.cpp
8+
NumberUtils_tests.cpp
89
StringUtils_tests.cpp
910
)
1011

tests/utils/NumberUtils_tests.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
// Copyright Contributors to the OpenColorIO Project.
3+
4+
5+
#include "testutils/UnitTest.h"
6+
#include "utils/NumberUtils.h"
7+
8+
namespace OCIO = OCIO_NAMESPACE;
9+
10+
OCIO_ADD_TEST(NumberUtils, from_chars_float)
11+
{
12+
#define TEST_FROM_CHARS(text) \
13+
str = text; \
14+
res = OCIO::NumberUtils::from_chars(str.data(), str.data() + str.size(), val); \
15+
OCIO_CHECK_ASSERT(res.ec == std::errc()); \
16+
OCIO_CHECK_ASSERT(res.ptr == str.data() + str.size())
17+
18+
std::string str;
19+
float val;
20+
OCIO::NumberUtils::from_chars_result res;
21+
22+
// regular numbers
23+
TEST_FROM_CHARS("-7"); OCIO_CHECK_EQUAL(val, -7.0f);
24+
TEST_FROM_CHARS("1.5"); OCIO_CHECK_EQUAL(val, 1.5f);
25+
TEST_FROM_CHARS("-17.25"); OCIO_CHECK_EQUAL(val, -17.25f);
26+
TEST_FROM_CHARS("-.75"); OCIO_CHECK_EQUAL(val, -.75f);
27+
TEST_FROM_CHARS("11."); OCIO_CHECK_EQUAL(val, 11.0f);
28+
// exponent notation
29+
TEST_FROM_CHARS("1e3"); OCIO_CHECK_EQUAL(val, 1000.0f);
30+
TEST_FROM_CHARS("1e+2"); OCIO_CHECK_EQUAL(val, 100.0f);
31+
TEST_FROM_CHARS("50e-2"); OCIO_CHECK_EQUAL(val, 0.5f);
32+
TEST_FROM_CHARS("-1.5e2"); OCIO_CHECK_EQUAL(val, -150.0f);
33+
// whitespace/prefix handling
34+
TEST_FROM_CHARS("+57.125"); OCIO_CHECK_EQUAL(val, +57.125f);
35+
TEST_FROM_CHARS(" \t 123.5"); OCIO_CHECK_EQUAL(val, 123.5f);
36+
// special values
37+
TEST_FROM_CHARS("-infinity"); OCIO_CHECK_EQUAL(val, -std::numeric_limits<float>::infinity());
38+
TEST_FROM_CHARS("nan"); OCIO_CHECK_ASSERT(std::isnan(val));
39+
// hex format should be parsed
40+
TEST_FROM_CHARS("0x42"); OCIO_CHECK_EQUAL(val, 66.0f);
41+
TEST_FROM_CHARS("0x42ab.c"); OCIO_CHECK_EQUAL(val, 17067.75f);
42+
43+
// valid numbers with trailing non-number chars should stop there
44+
str = "-7.5ab";
45+
res = OCIO::NumberUtils::from_chars(str.data(), str.data() + str.size(), val);
46+
OCIO_CHECK_ASSERT(res.ptr == str.data() + 4);
47+
OCIO_CHECK_EQUAL(val, -7.5f);
48+
str = "infinitya";
49+
res = OCIO::NumberUtils::from_chars(str.data(), str.data() + str.size(), val);
50+
OCIO_CHECK_ASSERT(res.ptr == str.data() + 8);
51+
OCIO_CHECK_EQUAL(val, std::numeric_limits<float>::infinity());
52+
str = "0x18g";
53+
res = OCIO::NumberUtils::from_chars(str.data(), str.data() + str.size(), val);
54+
OCIO_CHECK_ASSERT(res.ptr == str.data() + 4);
55+
OCIO_CHECK_EQUAL(val, 24.0f);
56+
57+
#undef TEST_FROM_CHARS
58+
}
59+
60+
OCIO_ADD_TEST(NumberUtils, from_chars_float_failures)
61+
{
62+
#define TEST_FROM_CHARS(text) \
63+
str = text; \
64+
res = OCIO::NumberUtils::from_chars(str.data(), str.data() + str.size(), val); \
65+
OCIO_CHECK_EQUAL(val, 7.5f); \
66+
OCIO_CHECK_ASSERT(res.ec == std::errc::invalid_argument)
67+
68+
std::string str;
69+
float val = 7.5f;
70+
OCIO::NumberUtils::from_chars_result res;
71+
72+
TEST_FROM_CHARS("");
73+
TEST_FROM_CHARS("ab");
74+
TEST_FROM_CHARS(" ");
75+
TEST_FROM_CHARS("---");
76+
TEST_FROM_CHARS("e3");
77+
TEST_FROM_CHARS("_x");
78+
TEST_FROM_CHARS("+.");
79+
80+
#undef TEST_FROM_CHARS
81+
}

0 commit comments

Comments
 (0)