• 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 
TEST(fxnumber,FromStringUnsigned)48 TEST(fxnumber, FromStringUnsigned) {
49   struct TestCase {
50     const char* input;
51     int expected_output;
52   };
53 
54   auto test_func = [](pdfium::span<const TestCase> test_cases) {
55     for (const auto& test : test_cases) {
56       FX_Number number(test.input);
57       EXPECT_TRUE(number.IsInteger());
58       EXPECT_FALSE(number.IsSigned());
59       EXPECT_EQ(test.expected_output, number.GetSigned());
60     }
61   };
62 
63   static constexpr TestCase kNormalCases[] = {
64       {"", 0},
65       {"0", 0},
66       {"10", 10},
67   };
68   test_func(kNormalCases);
69 
70   static constexpr TestCase kOverflowCases[] = {
71       {"4223423494965252", 0},
72       {"4294967296", 0},
73       {"4294967297", 0},
74       {"5000000000", 0},
75   };
76   test_func(kOverflowCases);
77 
78   // No explicit sign will allow the number to go negative if retrieved as a
79   // signed value. This is needed for things like the encryption permissions
80   // flag (Table 3.20 PDF 1.7 spec)
81   static constexpr TestCase kNegativeCases[] = {
82       {"4294965252", -2044},
83       {"4294967247", -49},
84       {"4294967248", -48},
85       {"4294967292", -4},
86       {"4294967295", -1},
87   };
88   test_func(kNegativeCases);
89 }
90 
TEST(fxnumber,FromStringSigned)91 TEST(fxnumber, FromStringSigned) {
92   {
93     FX_Number number("-0");
94     EXPECT_TRUE(number.IsInteger());
95     EXPECT_TRUE(number.IsSigned());
96     EXPECT_EQ(0, number.GetSigned());
97   }
98   {
99     FX_Number number("+0");
100     EXPECT_TRUE(number.IsInteger());
101     EXPECT_TRUE(number.IsSigned());
102     EXPECT_EQ(0, number.GetSigned());
103   }
104   {
105     FX_Number number("-10");
106     EXPECT_TRUE(number.IsInteger());
107     EXPECT_TRUE(number.IsSigned());
108     EXPECT_EQ(-10, number.GetSigned());
109   }
110   {
111     FX_Number number("+10");
112     EXPECT_TRUE(number.IsInteger());
113     EXPECT_TRUE(number.IsSigned());
114     EXPECT_EQ(10, number.GetSigned());
115   }
116   {
117     FX_Number number("-2147483648");
118     EXPECT_TRUE(number.IsInteger());
119     EXPECT_TRUE(number.IsSigned());
120     EXPECT_EQ(std::numeric_limits<int32_t>::min(), number.GetSigned());
121   }
122   {
123     FX_Number number("+2147483647");
124     EXPECT_TRUE(number.IsInteger());
125     EXPECT_TRUE(number.IsSigned());
126     EXPECT_EQ(std::numeric_limits<int32_t>::max(), number.GetSigned());
127   }
128   {
129     // Value underflows.
130     FX_Number number("-2147483649");
131     EXPECT_EQ(0, number.GetSigned());
132   }
133   {
134     // Value overflows.
135     FX_Number number("+2147483648");
136     EXPECT_EQ(0, number.GetSigned());
137   }
138 }
139 
TEST(fxnumber,FromStringFloat)140 TEST(fxnumber, FromStringFloat) {
141   FX_Number number("3.24");
142   EXPECT_FLOAT_EQ(3.24f, number.GetFloat());
143 }
144