this repo has no description
1// Copyright (c) Facebook, Inc. and its affiliates. (http://www.facebook.com)
2#include "float-conversion.h"
3
4#include <cmath>
5#include <cstdlib>
6#include <cstring>
7
8#include "benchmark/benchmark.h"
9#include "gtest/gtest.h"
10
11#include "globals.h"
12#include "runtime.h"
13#include "test-utils.h"
14
15namespace py {
16namespace testing {
17
18using FloatConversionTest = RuntimeFixture;
19
20// Note: The testing here is not comprehensive; we have more testing for the
21// corresponding formatting and parsing library functions.
22
23TEST_F(FloatConversionTest, DoubleToStringWithZeroReturnsString) {
24 unique_c_ptr<char> buf(
25 doubleToString(0., 'g', 6, false, false, false, nullptr));
26 EXPECT_EQ(std::strcmp(buf.get(), "0"), 0);
27}
28
29TEST_F(FloatConversionTest, DoubleToStringWithMinusZeroReturnsString) {
30 unique_c_ptr<char> buf(
31 doubleToString(-0., 'f', 2, false, false, false, nullptr));
32 EXPECT_EQ(std::strcmp(buf.get(), "-0.00"), 0);
33}
34
35TEST_F(FloatConversionTest, DoubleToStringReturnsString) {
36 unique_c_ptr<char> buf(doubleToString(-42.123456789, 'e', 5,
37 /*skip_sign=*/true,
38 /*add_dot_0=*/true,
39 /*use_alt_formatting=*/true, nullptr));
40 EXPECT_EQ(std::strcmp(buf.get(), "4.21235e+01"), 0);
41}
42
43TEST_F(FloatConversionTest, DoubleToStringWithNanReturnsString) {
44 unique_c_ptr<char> buf(
45 doubleToString(kDoubleNaN, 'r', 0, false, false, false, nullptr));
46 EXPECT_EQ(std::strcmp(buf.get(), "nan"), 0);
47}
48
49TEST_F(FloatConversionTest, DoubleToStringWithInfReturnsString) {
50 unique_c_ptr<char> buf(doubleToString(std::numeric_limits<double>::infinity(),
51 'e', 0, false, false, false, nullptr));
52 EXPECT_EQ(std::strcmp(buf.get(), "inf"), 0);
53}
54
55TEST_F(FloatConversionTest, ParseFloatReturnsDouble) {
56 const char* str = "-42.1234567890123456789ABC";
57 char* endptr;
58 ConversionResult result;
59 double value = parseFloat(str, &endptr, &result);
60 EXPECT_EQ(endptr - str, 23);
61 EXPECT_EQ(result, ConversionResult::kSuccess);
62 EXPECT_EQ(value, std::strtod("-0x1.50fcd6e9ba37bp+5", nullptr));
63}
64
65TEST_F(FloatConversionTest, ParseFloatWithNegativeExponentReturnsDouble) {
66 const char* str = "+041524e-2";
67 char* endptr;
68 ConversionResult result;
69 double value = parseFloat(str, &endptr, &result);
70 EXPECT_EQ(endptr - str, 10);
71 EXPECT_EQ(result, ConversionResult::kSuccess);
72 EXPECT_EQ(value, std::strtod("0x1.9f3d70a3d70a4p+8", nullptr));
73}
74
75TEST_F(FloatConversionTest, ParseFloatWithNanReturnsDouble) {
76 const char* str = "NaN";
77 char* endptr;
78 ConversionResult result;
79 double value = parseFloat(str, &endptr, &result);
80 EXPECT_EQ(endptr - str, 3);
81 EXPECT_EQ(result, ConversionResult::kSuccess);
82 EXPECT_TRUE(std::isnan(value));
83}
84
85TEST_F(FloatConversionTest, ParseFloatWithInfReturnsDouble) {
86 const char* str = "InfABC";
87 char* endptr;
88 ConversionResult result;
89 double value = parseFloat(str, &endptr, &result);
90 EXPECT_EQ(endptr - str, 3);
91 EXPECT_EQ(result, ConversionResult::kSuccess);
92 EXPECT_TRUE(std::isinf(value));
93}
94
95TEST_F(FloatConversionTest, ParseFloatWithInfinityReturnsDouble) {
96 const char* str = "-iNfInItY!";
97 char* endptr;
98 ConversionResult result;
99 double value = parseFloat(str, &endptr, &result);
100 EXPECT_EQ(endptr - str, 9);
101 EXPECT_EQ(result, ConversionResult::kSuccess);
102 EXPECT_TRUE(value < 0);
103 EXPECT_TRUE(std::isinf(value));
104}
105
106} // namespace testing
107} // namespace py