Home | History | Annotate | Download | only in fpdfsdk
      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