this repo has no description
at trunk 107 lines 3.5 kB view raw
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