• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include <limits>
6 
7 #include "core/fxcrt/fx_number.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 
TEST(fxnumber,Default)10 TEST(fxnumber, Default) {
11   FX_Number number;
12   EXPECT_TRUE(number.IsInteger());
13   EXPECT_FALSE(number.IsSigned());
14   EXPECT_EQ(0, number.GetSigned());
15   EXPECT_FLOAT_EQ(0.0f, number.GetFloat());
16 }
17 
TEST(fxnumber,FromSigned)18 TEST(fxnumber, FromSigned) {
19   FX_Number number(-128);
20   EXPECT_TRUE(number.IsInteger());
21   EXPECT_TRUE(number.IsSigned());
22   EXPECT_EQ(-128, number.GetSigned());
23   EXPECT_FLOAT_EQ(-128.0f, number.GetFloat());
24 
25   // Show that assignment works.
26   FX_Number number2 = number;
27   EXPECT_TRUE(number2.IsInteger());
28   EXPECT_TRUE(number2.IsSigned());
29   EXPECT_EQ(-128, number2.GetSigned());
30   EXPECT_FLOAT_EQ(-128.0f, number2.GetFloat());
31 }
32 
TEST(fxnumber,FromFloat)33 TEST(fxnumber, FromFloat) {
34   FX_Number number(-100.001f);
35   EXPECT_FALSE(number.IsInteger());
36   EXPECT_TRUE(number.IsSigned());
37   EXPECT_EQ(-100, number.GetSigned());
38   EXPECT_FLOAT_EQ(-100.001f, number.GetFloat());
39 
40   // Show that assignment works.
41   FX_Number number2 = number;
42   EXPECT_FALSE(number2.IsInteger());
43   EXPECT_TRUE(number2.IsSigned());
44   EXPECT_EQ(-100, number2.GetSigned());
45   EXPECT_FLOAT_EQ(-100.001f, number2.GetFloat());
46 
47   // Show positive saturation.
48   FX_Number number3(1e17f);
49   EXPECT_FALSE(number3.IsInteger());
50   EXPECT_TRUE(number3.IsSigned());
51   EXPECT_EQ(std::numeric_limits<int32_t>::max(), number3.GetSigned());
52 
53   // Show negative saturation.
54   FX_Number number4(-1e17f);
55   EXPECT_FALSE(number4.IsInteger());
56   EXPECT_TRUE(number4.IsSigned());
57   EXPECT_EQ(std::numeric_limits<int32_t>::min(), number4.GetSigned());
58 }
59 
TEST(fxnumber,FromStringUnsigned)60 TEST(fxnumber, FromStringUnsigned) {
61   struct TestCase {
62     const char* input;
63     int expected_output;
64   };
65 
66   auto test_func = [](pdfium::span<const TestCase> test_cases) {
67     for (const auto& test : test_cases) {
68       FX_Number number(test.input);
69       EXPECT_TRUE(number.IsInteger());
70       EXPECT_FALSE(number.IsSigned());
71       EXPECT_EQ(test.expected_output, number.GetSigned());
72     }
73   };
74 
75   static constexpr TestCase kNormalCases[] = {
76       {"", 0},
77       {"0", 0},
78       {"10", 10},
79   };
80   test_func(kNormalCases);
81 
82   static constexpr TestCase kOverflowCases[] = {
83       {"4223423494965252", 0},
84       {"4294967296", 0},
85       {"4294967297", 0},
86       {"5000000000", 0},
87   };
88   test_func(kOverflowCases);
89 
90   // No explicit sign will allow the number to go negative if retrieved as a
91   // signed value. This is needed for things like the encryption permissions
92   // flag (Table 3.20 PDF 1.7 spec)
93   static constexpr TestCase kNegativeCases[] = {
94       {"4294965252", -2044},
95       {"4294967247", -49},
96       {"4294967248", -48},
97       {"4294967292", -4},
98       {"4294967295", -1},
99   };
100   test_func(kNegativeCases);
101 }
102 
TEST(fxnumber,FromStringSigned)103 TEST(fxnumber, FromStringSigned) {
104   {
105     FX_Number number("-0");
106     EXPECT_TRUE(number.IsInteger());
107     EXPECT_TRUE(number.IsSigned());
108     EXPECT_EQ(0, number.GetSigned());
109   }
110   {
111     FX_Number number("+0");
112     EXPECT_TRUE(number.IsInteger());
113     EXPECT_TRUE(number.IsSigned());
114     EXPECT_EQ(0, number.GetSigned());
115   }
116   {
117     FX_Number number("-10");
118     EXPECT_TRUE(number.IsInteger());
119     EXPECT_TRUE(number.IsSigned());
120     EXPECT_EQ(-10, number.GetSigned());
121   }
122   {
123     FX_Number number("+10");
124     EXPECT_TRUE(number.IsInteger());
125     EXPECT_TRUE(number.IsSigned());
126     EXPECT_EQ(10, number.GetSigned());
127   }
128   {
129     FX_Number number("-2147483648");
130     EXPECT_TRUE(number.IsInteger());
131     EXPECT_TRUE(number.IsSigned());
132     EXPECT_EQ(std::numeric_limits<int32_t>::min(), number.GetSigned());
133   }
134   {
135     FX_Number number("+2147483647");
136     EXPECT_TRUE(number.IsInteger());
137     EXPECT_TRUE(number.IsSigned());
138     EXPECT_EQ(std::numeric_limits<int32_t>::max(), number.GetSigned());
139   }
140   {
141     // Value underflows.
142     FX_Number number("-2147483649");
143     EXPECT_EQ(0, number.GetSigned());
144   }
145   {
146     // Value overflows.
147     FX_Number number("+2147483648");
148     EXPECT_EQ(0, number.GetSigned());
149   }
150 }
151 
TEST(fxnumber,FromStringFloat)152 TEST(fxnumber, FromStringFloat) {
153   FX_Number number("3.24");
154   EXPECT_FLOAT_EQ(3.24f, number.GetFloat());
155 }
156