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 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 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