1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2020 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker
5*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_helpers.h"
6*3ac0a46fSAndroid Build Coastguard Worker
7*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
8*3ac0a46fSAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*3ac0a46fSAndroid Build Coastguard Worker
10*3ac0a46fSAndroid Build Coastguard Worker using ::testing::ElementsAre;
11*3ac0a46fSAndroid Build Coastguard Worker using ::testing::IsEmpty;
12*3ac0a46fSAndroid Build Coastguard Worker
TEST(CPDFSDK_HelpersTest,NulTerminateMaybeCopyAndReturnLength)13*3ac0a46fSAndroid Build Coastguard Worker TEST(CPDFSDK_HelpersTest, NulTerminateMaybeCopyAndReturnLength) {
14*3ac0a46fSAndroid Build Coastguard Worker {
15*3ac0a46fSAndroid Build Coastguard Worker const ByteString to_be_copied("toBeCopied");
16*3ac0a46fSAndroid Build Coastguard Worker constexpr size_t kExpectedToBeCopiedLen = 10;
17*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedToBeCopiedLen, to_be_copied.GetLength());
18*3ac0a46fSAndroid Build Coastguard Worker
19*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(kExpectedToBeCopiedLen + 1,
20*3ac0a46fSAndroid Build Coastguard Worker NulTerminateMaybeCopyAndReturnLength(to_be_copied, nullptr, 0));
21*3ac0a46fSAndroid Build Coastguard Worker
22*3ac0a46fSAndroid Build Coastguard Worker // Buffer should not change if declared length is too short.
23*3ac0a46fSAndroid Build Coastguard Worker char buf[kExpectedToBeCopiedLen + 1];
24*3ac0a46fSAndroid Build Coastguard Worker memset(buf, 0x42, kExpectedToBeCopiedLen + 1);
25*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedToBeCopiedLen + 1,
26*3ac0a46fSAndroid Build Coastguard Worker NulTerminateMaybeCopyAndReturnLength(to_be_copied, buf,
27*3ac0a46fSAndroid Build Coastguard Worker kExpectedToBeCopiedLen));
28*3ac0a46fSAndroid Build Coastguard Worker for (char c : buf)
29*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(0x42, c);
30*3ac0a46fSAndroid Build Coastguard Worker
31*3ac0a46fSAndroid Build Coastguard Worker // Buffer should copy over if long enough.
32*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(kExpectedToBeCopiedLen + 1,
33*3ac0a46fSAndroid Build Coastguard Worker NulTerminateMaybeCopyAndReturnLength(to_be_copied, buf,
34*3ac0a46fSAndroid Build Coastguard Worker kExpectedToBeCopiedLen + 1));
35*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(to_be_copied, ByteString(buf));
36*3ac0a46fSAndroid Build Coastguard Worker }
37*3ac0a46fSAndroid Build Coastguard Worker {
38*3ac0a46fSAndroid Build Coastguard Worker // Empty ByteString should still copy NUL terminator.
39*3ac0a46fSAndroid Build Coastguard Worker const ByteString empty;
40*3ac0a46fSAndroid Build Coastguard Worker char buf[1];
41*3ac0a46fSAndroid Build Coastguard Worker ASSERT_EQ(1u, NulTerminateMaybeCopyAndReturnLength(empty, buf, 1));
42*3ac0a46fSAndroid Build Coastguard Worker EXPECT_EQ(empty, ByteString(buf));
43*3ac0a46fSAndroid Build Coastguard Worker }
44*3ac0a46fSAndroid Build Coastguard Worker }
45*3ac0a46fSAndroid Build Coastguard Worker
TEST(CPDFSDK_HelpersTest,ParsePageRangeString)46*3ac0a46fSAndroid Build Coastguard Worker TEST(CPDFSDK_HelpersTest, ParsePageRangeString) {
47*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("", 1), IsEmpty());
48*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString(" ", 1), IsEmpty());
49*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("clams", 1), IsEmpty());
50*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("0", 0), IsEmpty());
51*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1", 0), IsEmpty());
52*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString(",1", 10), IsEmpty());
53*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1,", 10), IsEmpty());
54*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1,clams", 1), IsEmpty());
55*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("clams,1", 1), IsEmpty());
56*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("0-1", 10), IsEmpty());
57*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-0", 10), IsEmpty());
58*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-5", 4), IsEmpty());
59*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-11,", 10), IsEmpty());
60*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString(",1-1", 10), IsEmpty());
61*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-", 10), IsEmpty());
62*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-,", 10), IsEmpty());
63*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("-2,", 10), IsEmpty());
64*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-clams", 10), IsEmpty());
65*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("clams-1,", 10), IsEmpty());
66*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-2clams", 10), IsEmpty());
67*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("0,1", 10), IsEmpty());
68*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1,0", 10), IsEmpty());
69*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-2,,,,3-4", 10), IsEmpty());
70*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-2-", 10), IsEmpty());
71*3ac0a46fSAndroid Build Coastguard Worker
72*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-1", 10), ElementsAre(0));
73*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1", 1), ElementsAre(0));
74*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-4", 4), ElementsAre(0, 1, 2, 3));
75*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1- 4", 4), ElementsAre(0, 1, 2, 3));
76*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1 -4", 4), ElementsAre(0, 1, 2, 3));
77*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1,2", 10), ElementsAre(0, 1));
78*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("2,1", 10), ElementsAre(1, 0));
79*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1,50,2", 100), ElementsAre(0, 49, 1));
80*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-4,50", 100), ElementsAre(0, 1, 2, 3, 49));
81*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("50,1-2", 100), ElementsAre(49, 0, 1));
82*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("5 0, 1-2 ", 100),
83*3ac0a46fSAndroid Build Coastguard Worker ElementsAre(49, 0, 1)); // ???
84*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-3,4-6", 10),
85*3ac0a46fSAndroid Build Coastguard Worker ElementsAre(0, 1, 2, 3, 4, 5));
86*3ac0a46fSAndroid Build Coastguard Worker EXPECT_THAT(ParsePageRangeString("1-4,3-6", 10),
87*3ac0a46fSAndroid Build Coastguard Worker ElementsAre(0, 1, 2, 3, 2, 3, 4, 5));
88*3ac0a46fSAndroid Build Coastguard Worker }
89