1 // Copyright 2018 PDFium Authors. All rights reserved.
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   {
50     FX_Number number("");
51     EXPECT_TRUE(number.IsInteger());
52     EXPECT_FALSE(number.IsSigned());
53   }
54   {
55     FX_Number number("0");
56     EXPECT_TRUE(number.IsInteger());
57     EXPECT_FALSE(number.IsSigned());
58   }
59   {
60     FX_Number number("10");
61     EXPECT_TRUE(number.IsInteger());
62     EXPECT_FALSE(number.IsSigned());
63   }
64   {
65     FX_Number number("4294967295");
66     EXPECT_TRUE(number.IsInteger());
67     EXPECT_FALSE(number.IsSigned());
68   }
69   {
70     // Value overflows.
71     FX_Number number("4223423494965252");
72     EXPECT_TRUE(number.IsInteger());
73     EXPECT_FALSE(number.IsSigned());
74   }
75   {
76     // No explicit sign will allow the number to go negative if we retrieve
77     // it as a signed value. This is needed for things like the encryption
78     // Permissions flag (Table 3.20 PDF 1.7 spec)
79     FX_Number number("4294965252");
80     EXPECT_EQ(-2044, number.GetSigned());
81   }
82 }
83 
TEST(fxnumber,FromStringSigned)84 TEST(fxnumber, FromStringSigned) {
85   {
86     FX_Number number("-0");
87     EXPECT_TRUE(number.IsInteger());
88     EXPECT_TRUE(number.IsSigned());
89     EXPECT_EQ(0, number.GetSigned());
90   }
91   {
92     FX_Number number("+0");
93     EXPECT_TRUE(number.IsInteger());
94     EXPECT_TRUE(number.IsSigned());
95     EXPECT_EQ(0, number.GetSigned());
96   }
97   {
98     FX_Number number("-10");
99     EXPECT_TRUE(number.IsInteger());
100     EXPECT_TRUE(number.IsSigned());
101     EXPECT_EQ(-10, number.GetSigned());
102   }
103   {
104     FX_Number number("+10");
105     EXPECT_TRUE(number.IsInteger());
106     EXPECT_TRUE(number.IsSigned());
107     EXPECT_EQ(10, number.GetSigned());
108   }
109   {
110     FX_Number number("-2147483648");
111     EXPECT_TRUE(number.IsInteger());
112     EXPECT_TRUE(number.IsSigned());
113     EXPECT_EQ(std::numeric_limits<int32_t>::min(), number.GetSigned());
114   }
115   {
116     FX_Number number("+2147483647");
117     EXPECT_TRUE(number.IsInteger());
118     EXPECT_TRUE(number.IsSigned());
119     EXPECT_EQ(std::numeric_limits<int32_t>::max(), number.GetSigned());
120   }
121   {
122     // Value underflows.
123     FX_Number number("-2147483649");
124     EXPECT_EQ(0, number.GetSigned());
125   }
126   {
127     // Value overflows.
128     FX_Number number("+2147483648");
129     EXPECT_EQ(0, number.GetSigned());
130   }
131 }
132 
TEST(fxnumber,FromStringFloat)133 TEST(fxnumber, FromStringFloat) {
134   FX_Number number("3.24");
135   EXPECT_FLOAT_EQ(3.24f, number.GetFloat());
136 }
137