diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index 5d1512f..57d8c34 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -97,6 +97,15 @@ cc_test( ], ) +cc_test( + name = "supported_chars_test", + srcs = ["supported_chars_test.cpp"], + deps = [ + "//:fast_float", + "@doctest//doctest", + ], +) + cc_test( name = "string_test", srcs = ["string_test.cpp"], diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 63df2e5..c4e43b2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -68,6 +68,7 @@ endfunction(fast_float_add_cpp_test) fast_float_add_cpp_test(rcppfastfloat_test) fast_float_add_cpp_test(wide_char_test) +fast_float_add_cpp_test(supported_chars_test) fast_float_add_cpp_test(example_test) fast_float_add_cpp_test(example_comma_test) fast_float_add_cpp_test(basictest) diff --git a/tests/supported_chars_test.cpp b/tests/supported_chars_test.cpp new file mode 100644 index 0000000..3660f81 --- /dev/null +++ b/tests/supported_chars_test.cpp @@ -0,0 +1,53 @@ +#include "fast_float/fast_float.h" +#include +#include +#include + +template bool test(std::string s, double expected) { + std::basic_string input(s.begin(), s.end()); + double result; + auto answer = + fast_float::from_chars(input.data(), input.data() + input.size(), result); + if (answer.ec != std::errc()) { + std::cerr << "parsing of \"" << s << "\" should succeed\n"; + return false; + } + if (result != expected && !(std::isnan(result) && std::isnan(expected))) { + std::cerr << "parsing of \"" << s << "\" succeeded, expected " << expected + << " got " << result << "\n"; + return false; + } + return true; +} + +int main() { + if (!test("4.2", 4.2)) { + std::cout << "test failure for char" << std::endl; + return EXIT_FAILURE; + } + + if (!test("4.2", 4.2)) { + std::cout << "test failure for wchar_t" << std::endl; + return EXIT_FAILURE; + } + +#ifdef __cpp_char8_t + if (!test("4.2", 4.2)) { + std::cout << "test failure for char8_t" << std::endl; + return EXIT_FAILURE; + } +#endif + + if (!test("4.2", 4.2)) { + std::cout << "test failure for char16_t" << std::endl; + return EXIT_FAILURE; + } + + if (!test("4.2", 4.2)) { + std::cout << "test failure for char32_t" << std::endl; + return EXIT_FAILURE; + } + + std::cout << "all ok" << std::endl; + return EXIT_SUCCESS; +}