14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved. 24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file. 44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <limits> 64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fxcrt/fx_basic.h" 84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "testing/fx_string_testhelpers.h" 94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "testing/gtest/include/gtest/gtest.h" 104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace { 124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannuint32_t ReferenceGetBits32(const uint8_t* pData, int bitpos, int nbits) { 144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int result = 0; 154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int i = 0; i < nbits; i++) { 164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann if (pData[(bitpos + i) / 8] & (1 << (7 - (bitpos + i) % 8))) 174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann result |= 1 << (nbits - i - 1); 184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann return result; 204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} // namespace 234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(fxge, GetBits32) { 254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann unsigned char data[] = {0xDE, 0x3F, 0xB1, 0x7C, 0x12, 0x9A, 0x04, 0x56}; 264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int nbits = 1; nbits <= 32; ++nbits) { 274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann for (int bitpos = 0; bitpos < (int)sizeof(data) * 8 - nbits; ++bitpos) { 284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(ReferenceGetBits32(data, bitpos, nbits), 294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann GetBits32(data, bitpos, nbits)); 304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann } 324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannTEST(fxcrt, FX_atonum) { 354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann int i; 364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("10", &i)); 374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(10, i); 384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("-10", &i)); 404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(-10, i); 414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("+10", &i)); 434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(10, i); 444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("-2147483648", &i)); 464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(std::numeric_limits<int>::min(), i); 474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("2147483647", &i)); 494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(2147483647, i); 504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Value overflows. 524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("-2147483649", &i)); 534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0, i); 544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Value overflows. 564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("+2147483648", &i)); 574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0, i); 584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // Value overflows. 604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("4223423494965252", &i)); 614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0, i); 624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // No explicit sign will allow the number to go negative. This is for things 644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann // like the encryption Permissions flag (Table 3.20 PDF 1.7 spec) 654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("4294965252", &i)); 664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(-2044, i); 674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("-4294965252", &i)); 694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0, i); 704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_TRUE(FX_atonum("+4294965252", &i)); 724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_EQ(0, i); 734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann 744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann float f; 754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FALSE(FX_atonum("3.24", &f)); 764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann EXPECT_FLOAT_EQ(3.24f, f); 774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann} 78