1 // Copyright 2016 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 "fpdfsdk/cba_annotiterator.h"
6 #include "fpdfsdk/cpdfsdk_annot.h"
7 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
8 #include "fpdfsdk/fsdk_define.h"
9 #include "testing/embedder_test.h"
10 #include "testing/embedder_test_mock_delegate.h"
11 #include "testing/embedder_test_timer_handling_delegate.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace {
16
CheckRect(const CFX_FloatRect & actual,const CFX_FloatRect & expected)17 void CheckRect(const CFX_FloatRect& actual, const CFX_FloatRect& expected) {
18 EXPECT_EQ(expected.left, actual.left);
19 EXPECT_EQ(expected.bottom, actual.bottom);
20 EXPECT_EQ(expected.right, actual.right);
21 EXPECT_EQ(expected.top, actual.top);
22 }
23
24 } // namespace
25
26 class FSDKBaseFormEmbeddertest : public EmbedderTest {};
27
TEST_F(FSDKBaseFormEmbeddertest,CBA_AnnotIterator)28 TEST_F(FSDKBaseFormEmbeddertest, CBA_AnnotIterator) {
29 EXPECT_TRUE(OpenDocument("annotiter.pdf"));
30 FPDF_PAGE page0 = LoadPage(0);
31 FPDF_PAGE page1 = LoadPage(1);
32 FPDF_PAGE page2 = LoadPage(2);
33 EXPECT_TRUE(page0);
34 EXPECT_TRUE(page1);
35 EXPECT_TRUE(page2);
36
37 CFX_FloatRect LeftBottom(200, 200, 220, 220);
38 CFX_FloatRect RightBottom(400, 201, 420, 221);
39 CFX_FloatRect LeftTop(201, 400, 221, 420);
40 CFX_FloatRect RightTop(401, 401, 421, 421);
41
42 CPDFSDK_FormFillEnvironment* pFormFillEnv =
43 static_cast<CPDFSDK_FormFillEnvironment*>(form_handle());
44
45 {
46 // Page 0 specifies "row order".
47 CBA_AnnotIterator iter(pFormFillEnv->GetPageView(0),
48 CPDF_Annot::Subtype::WIDGET);
49 CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot();
50 CheckRect(pAnnot->GetRect(), RightTop);
51 pAnnot = iter.GetNextAnnot(pAnnot);
52 CheckRect(pAnnot->GetRect(), LeftTop);
53 pAnnot = iter.GetNextAnnot(pAnnot);
54 CheckRect(pAnnot->GetRect(), RightBottom);
55 pAnnot = iter.GetNextAnnot(pAnnot);
56 CheckRect(pAnnot->GetRect(), LeftBottom);
57 pAnnot = iter.GetNextAnnot(pAnnot);
58 EXPECT_EQ(iter.GetFirstAnnot(), pAnnot);
59
60 pAnnot = iter.GetLastAnnot();
61 CheckRect(pAnnot->GetRect(), LeftBottom);
62 pAnnot = iter.GetPrevAnnot(pAnnot);
63 CheckRect(pAnnot->GetRect(), RightBottom);
64 pAnnot = iter.GetPrevAnnot(pAnnot);
65 CheckRect(pAnnot->GetRect(), LeftTop);
66 pAnnot = iter.GetPrevAnnot(pAnnot);
67 CheckRect(pAnnot->GetRect(), RightTop);
68 pAnnot = iter.GetPrevAnnot(pAnnot);
69 EXPECT_EQ(iter.GetLastAnnot(), pAnnot);
70 }
71 {
72 // Page 1 specifies "column order"
73 CBA_AnnotIterator iter(pFormFillEnv->GetPageView(1),
74 CPDF_Annot::Subtype::WIDGET);
75 CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot();
76 CheckRect(pAnnot->GetRect(), RightTop);
77 pAnnot = iter.GetNextAnnot(pAnnot);
78 CheckRect(pAnnot->GetRect(), RightBottom);
79 pAnnot = iter.GetNextAnnot(pAnnot);
80 CheckRect(pAnnot->GetRect(), LeftTop);
81 pAnnot = iter.GetNextAnnot(pAnnot);
82 CheckRect(pAnnot->GetRect(), LeftBottom);
83 pAnnot = iter.GetNextAnnot(pAnnot);
84 EXPECT_EQ(iter.GetFirstAnnot(), pAnnot);
85
86 pAnnot = iter.GetLastAnnot();
87 CheckRect(pAnnot->GetRect(), LeftBottom);
88 pAnnot = iter.GetPrevAnnot(pAnnot);
89 CheckRect(pAnnot->GetRect(), LeftTop);
90 pAnnot = iter.GetPrevAnnot(pAnnot);
91 CheckRect(pAnnot->GetRect(), RightBottom);
92 pAnnot = iter.GetPrevAnnot(pAnnot);
93 CheckRect(pAnnot->GetRect(), RightTop);
94 pAnnot = iter.GetPrevAnnot(pAnnot);
95 EXPECT_EQ(iter.GetLastAnnot(), pAnnot);
96 }
97 {
98 // Page 2 specifies "struct order"
99 CBA_AnnotIterator iter(pFormFillEnv->GetPageView(2),
100 CPDF_Annot::Subtype::WIDGET);
101 CPDFSDK_Annot* pAnnot = iter.GetFirstAnnot();
102 CheckRect(pAnnot->GetRect(), LeftBottom);
103 pAnnot = iter.GetNextAnnot(pAnnot);
104 CheckRect(pAnnot->GetRect(), RightTop);
105 pAnnot = iter.GetNextAnnot(pAnnot);
106 CheckRect(pAnnot->GetRect(), LeftTop);
107 pAnnot = iter.GetNextAnnot(pAnnot);
108 CheckRect(pAnnot->GetRect(), RightBottom);
109 pAnnot = iter.GetNextAnnot(pAnnot);
110 EXPECT_EQ(iter.GetFirstAnnot(), pAnnot);
111
112 pAnnot = iter.GetLastAnnot();
113 CheckRect(pAnnot->GetRect(), RightBottom);
114 pAnnot = iter.GetPrevAnnot(pAnnot);
115 CheckRect(pAnnot->GetRect(), LeftTop);
116 pAnnot = iter.GetPrevAnnot(pAnnot);
117 CheckRect(pAnnot->GetRect(), RightTop);
118 pAnnot = iter.GetPrevAnnot(pAnnot);
119 CheckRect(pAnnot->GetRect(), LeftBottom);
120 pAnnot = iter.GetPrevAnnot(pAnnot);
121 EXPECT_EQ(iter.GetLastAnnot(), pAnnot);
122 }
123 UnloadPage(page2);
124 UnloadPage(page1);
125 UnloadPage(page0);
126 }
127