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