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
15namespace {
16
17void 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
26class FSDKBaseFormEmbeddertest : public EmbedderTest {};
27
28TEST_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