xref: /llvm-project/clang/unittests/Frontend/FixedPointString.cpp (revision c03642e9a86d9ed128676d5405a1906282d727ad)
1*c03642e9SLeonard Chan #include "clang/AST/Type.h"
2*c03642e9SLeonard Chan #include "llvm/ADT/APSInt.h"
3*c03642e9SLeonard Chan #include "llvm/ADT/SmallString.h"
4*c03642e9SLeonard Chan #include "gtest/gtest.h"
5*c03642e9SLeonard Chan 
6*c03642e9SLeonard Chan using clang::FixedPointValueToString;
7*c03642e9SLeonard Chan using llvm::APSInt;
8*c03642e9SLeonard Chan using llvm::SmallString;
9*c03642e9SLeonard Chan 
10*c03642e9SLeonard Chan namespace {
11*c03642e9SLeonard Chan 
TEST(FixedPointString,DifferentTypes)12*c03642e9SLeonard Chan TEST(FixedPointString, DifferentTypes) {
13*c03642e9SLeonard Chan   SmallString<64> S;
14*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::get(320), 7);
15*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "2.5");
16*c03642e9SLeonard Chan 
17*c03642e9SLeonard Chan   S.clear();
18*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::get(0), 7);
19*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "0.0");
20*c03642e9SLeonard Chan 
21*c03642e9SLeonard Chan   // signed short _Accum
22*c03642e9SLeonard Chan   S.clear();
23*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/false), 7);
24*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "255.9921875");
25*c03642e9SLeonard Chan 
26*c03642e9SLeonard Chan   // signed _Accum
27*c03642e9SLeonard Chan   S.clear();
28*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/false), 15);
29*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "65535.999969482421875");
30*c03642e9SLeonard Chan 
31*c03642e9SLeonard Chan   // signed long _Accum
32*c03642e9SLeonard Chan   S.clear();
33*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(64, /*Unsigned=*/false), 31);
34*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "4294967295.9999999995343387126922607421875");
35*c03642e9SLeonard Chan 
36*c03642e9SLeonard Chan   // unsigned short _Accum
37*c03642e9SLeonard Chan   S.clear();
38*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/true), 8);
39*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "255.99609375");
40*c03642e9SLeonard Chan 
41*c03642e9SLeonard Chan   // unsigned _Accum
42*c03642e9SLeonard Chan   S.clear();
43*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/true), 16);
44*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "65535.9999847412109375");
45*c03642e9SLeonard Chan 
46*c03642e9SLeonard Chan   // unsigned long _Accum
47*c03642e9SLeonard Chan   S.clear();
48*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(64, /*Unsigned=*/true), 32);
49*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "4294967295.99999999976716935634613037109375");
50*c03642e9SLeonard Chan 
51*c03642e9SLeonard Chan   // signed short _Fract
52*c03642e9SLeonard Chan   S.clear();
53*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(8, /*Unsigned=*/false), 7);
54*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "0.9921875");
55*c03642e9SLeonard Chan 
56*c03642e9SLeonard Chan   // signed _Fract
57*c03642e9SLeonard Chan   S.clear();
58*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/false), 15);
59*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "0.999969482421875");
60*c03642e9SLeonard Chan 
61*c03642e9SLeonard Chan   // signed long _Fract
62*c03642e9SLeonard Chan   S.clear();
63*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/false), 31);
64*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "0.9999999995343387126922607421875");
65*c03642e9SLeonard Chan 
66*c03642e9SLeonard Chan   // unsigned short _Fract
67*c03642e9SLeonard Chan   S.clear();
68*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(8, /*Unsigned=*/true), 8);
69*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "0.99609375");
70*c03642e9SLeonard Chan 
71*c03642e9SLeonard Chan   // unsigned _Fract
72*c03642e9SLeonard Chan   S.clear();
73*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(16, /*Unsigned=*/true), 16);
74*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "0.9999847412109375");
75*c03642e9SLeonard Chan 
76*c03642e9SLeonard Chan   // unsigned long _Fract
77*c03642e9SLeonard Chan   S.clear();
78*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMaxValue(32, /*Unsigned=*/true), 32);
79*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "0.99999999976716935634613037109375");
80*c03642e9SLeonard Chan }
81*c03642e9SLeonard Chan 
TEST(FixedPointString,Negative)82*c03642e9SLeonard Chan TEST(FixedPointString, Negative) {
83*c03642e9SLeonard Chan   SmallString<64> S;
84*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::get(-320), 7);
85*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "-2.5");
86*c03642e9SLeonard Chan 
87*c03642e9SLeonard Chan   S.clear();
88*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::get(-64), 7);
89*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "-0.5");
90*c03642e9SLeonard Chan 
91*c03642e9SLeonard Chan   // signed short _Accum
92*c03642e9SLeonard Chan   S.clear();
93*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMinValue(16, /*Unsigned=*/false), 7);
94*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "-256.0");
95*c03642e9SLeonard Chan 
96*c03642e9SLeonard Chan   // signed _Accum
97*c03642e9SLeonard Chan   S.clear();
98*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMinValue(32, /*Unsigned=*/false), 15);
99*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "-65536.0");
100*c03642e9SLeonard Chan 
101*c03642e9SLeonard Chan   // signed long _Accum
102*c03642e9SLeonard Chan   S.clear();
103*c03642e9SLeonard Chan   FixedPointValueToString(S, APSInt::getMinValue(64, /*Unsigned=*/false), 31);
104*c03642e9SLeonard Chan   ASSERT_STREQ(S.c_str(), "-4294967296.0");
105*c03642e9SLeonard Chan }
106*c03642e9SLeonard Chan 
107*c03642e9SLeonard Chan } // namespace
108