blob: deb4cf3c13013667a8cccc2c64e16076d3395073 [file] [log] [blame]
kumarashishg826308d2023-06-23 13:21:22 +00001// Copyright 2018 The PDFium Authors
Haibo Huang49cc9302020-04-27 16:14:24 -07002// 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
10TEST(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
18TEST(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
33TEST(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
48TEST(fxnumber, FromStringUnsigned) {
kumarashishg826308d2023-06-23 13:21:22 +000049 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);
Haibo Huang49cc9302020-04-27 16:14:24 -070089}
90
91TEST(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
140TEST(fxnumber, FromStringFloat) {
141 FX_Number number("3.24");
142 EXPECT_FLOAT_EQ(3.24f, number.GetFloat());
143}