blob: 93fde1c13663938b92bd3ac6050f79760b8d1d37 [file]
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Unit tests for strfromf128.
///
//===----------------------------------------------------------------------===//
#include "src/__support/FPUtil/FPBits.h"
#include "src/__support/macros/properties/architectures.h"
#include "src/stdlib/strfromf128.h"
#include "test/UnitTest/ErrnoCheckingTest.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
#define EXPECT_STREQ_LEN(str_size_needed, actual_str, expected_str) \
EXPECT_EQ(str_size_needed, static_cast<int>(sizeof(expected_str) - 1)); \
EXPECT_STREQ(actual_str, expected_str);
namespace {
using LlvmLibcStrfromlTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;
using LIBC_NAMESPACE::fputil::FPBits;
TEST_F(LlvmLibcStrfromlTest, DecimalFormat) {
char buff[64];
int result;
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%f", 1.0);
EXPECT_STREQ_LEN(result, buff, "1.000000");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%.F", -2.5);
EXPECT_STREQ_LEN(result, buff, "-2");
}
TEST_F(LlvmLibcStrfromlTest, HexExponentFormat) {
char buff[64];
int result;
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%a", 1.0);
EXPECT_STREQ_LEN(result, buff, "0x1p+0");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%A", -1.0);
EXPECT_STREQ_LEN(result, buff, "-0X1P+0");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%a", -0x1.abcdef12345p0);
EXPECT_STREQ_LEN(result, buff, "-0x1.abcdef12345p+0");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%.5A", 0x1.abcdef12345p0);
EXPECT_STREQ_LEN(result, buff, "0X1.ABCDFP+0");
}
TEST_F(LlvmLibcStrfromlTest, DecimalExponentFormat) {
char buff[64] = {};
int result;
result =
LIBC_NAMESPACE::strfromf128(buff, 63, "%.9e", 1000000000500000000.1L);
EXPECT_STREQ_LEN(result, buff, "1.000000001e+18");
result =
LIBC_NAMESPACE::strfromf128(buff, 63, "%.9E", 1000000000500000000.0L);
EXPECT_STREQ_LEN(result, buff, "1.000000000E+18");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%e", -1e100L);
EXPECT_STREQ_LEN(result, buff, "-1.000000e+100");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%E", 1.0L);
EXPECT_STREQ_LEN(result, buff, "1.000000E+00");
}
TEST_F(LlvmLibcStrfromlTest, DecimalAutoFormat) {
char buff[64] = {};
int result;
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%g", 9.99999999999e-100L);
EXPECT_STREQ_LEN(result, buff, "1e-99");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%G", 1e100L);
EXPECT_STREQ_LEN(result, buff, "1E+100");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%g", 1.0);
EXPECT_STREQ_LEN(result, buff, "1");
result = LIBC_NAMESPACE::strfromf128(buff, 63, "%g", -0.1);
EXPECT_STREQ_LEN(result, buff, "-0.1");
}
TEST_F(LlvmLibcStrfromlTest, InsufficientBufferSize) {
char buff[6] = {'a', 'b', 'c', 'd', 'e', '\0'};
int result;
result = LIBC_NAMESPACE::strfromf128(buff, 0, "%g", 1.0);
EXPECT_EQ(result, 1);
ASSERT_STREQ(buff, "abcde");
result = LIBC_NAMESPACE::strfromf128(buff, 5, "%f", 1234567890.0L);
EXPECT_EQ(result, 17);
ASSERT_STREQ(buff, "1234");
result = LIBC_NAMESPACE::strfromf128(buff, 5, "%.5f", 1.05);
EXPECT_EQ(result, 7);
ASSERT_STREQ(buff, "1.05");
}
TEST_F(LlvmLibcStrfromlTest, InfNanValues) {
char buff[64] = {};
int result;
float128 inf = FPBits<float128>::inf().get_val();
float128 nan = FPBits<float128>::quiet_nan().get_val();
const char *lower_formats[] = {"%f", "%e", "%a", "%g"};
const char *upper_formats[] = {"%F", "%E", "%A", "%G"};
for (int i = 0; i < 4; ++i) {
result = LIBC_NAMESPACE::strfromf128(buff, 63, lower_formats[i], inf);
EXPECT_STREQ_LEN(result, buff, "inf");
result = LIBC_NAMESPACE::strfromf128(buff, 63, lower_formats[i], -inf);
EXPECT_STREQ_LEN(result, buff, "-inf");
result = LIBC_NAMESPACE::strfromf128(buff, 63, lower_formats[i], nan);
EXPECT_STREQ_LEN(result, buff, "nan");
result = LIBC_NAMESPACE::strfromf128(buff, 63, lower_formats[i], -nan);
EXPECT_STREQ_LEN(result, buff, "-nan");
result = LIBC_NAMESPACE::strfromf128(buff, 63, upper_formats[i], inf);
EXPECT_STREQ_LEN(result, buff, "INF");
result = LIBC_NAMESPACE::strfromf128(buff, 63, upper_formats[i], -inf);
EXPECT_STREQ_LEN(result, buff, "-INF");
result = LIBC_NAMESPACE::strfromf128(buff, 63, upper_formats[i], nan);
EXPECT_STREQ_LEN(result, buff, "NAN");
result = LIBC_NAMESPACE::strfromf128(buff, 63, upper_formats[i], -nan);
EXPECT_STREQ_LEN(result, buff, "-NAN");
}
}
} // namespace