Add API tests: NamedDestsByName, DestGetPageIndex.
authorTom Sepez <tsepez@chromium.org>
Thu, 22 Jan 2015 19:11:45 +0000 (11:11 -0800)
committerTom Sepez <tsepez@chromium.org>
Thu, 22 Jan 2015 19:11:45 +0000 (11:11 -0800)
This also adds a fpdfdoc_embeddertest.cpp to keep the test
file name matching with the API call under test.

R=bo_xu@foxitsoftware.com

Review URL: https://codereview.chromium.org/812933004

fpdfsdk/src/fpdfdoc_embeddertest.cpp [new file with mode: 0644]
fpdfsdk/src/fpdfview_embeddertest.cpp
pdfium.gyp
testing/resources/named_dests.in
testing/resources/named_dests.pdf

diff --git a/fpdfsdk/src/fpdfdoc_embeddertest.cpp b/fpdfsdk/src/fpdfdoc_embeddertest.cpp
new file mode 100644 (file)
index 0000000..dadaf1d
--- /dev/null
@@ -0,0 +1,38 @@
+// Copyright 2015 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "../../testing/embedder_test.h"
+#include "../../fpdfsdk/include/fpdfview.h"
+#include "../../fpdfsdk/include/fpdfdoc.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class FPDFDocEmbeddertest : public EmbedderTest {
+};
+
+TEST_F(FPDFDocEmbeddertest, DestGetPageIndex) {
+  EXPECT_TRUE(OpenDocument("testing/resources/named_dests.pdf"));
+
+  // NULL FPDF_DEST case.
+  EXPECT_EQ(0, FPDFDest_GetPageIndex(document(), nullptr));
+
+  // Page number directly in item from Dests NameTree.
+  FPDF_DEST dest = FPDF_GetNamedDestByName(document(), "First");
+  EXPECT_NE(nullptr, dest);
+  EXPECT_EQ(1, FPDFDest_GetPageIndex(document(), dest));
+
+  // Page number via object reference in item from Dests NameTree.
+  dest = FPDF_GetNamedDestByName(document(), "Next");
+  EXPECT_NE(nullptr, dest);
+  EXPECT_EQ(1, FPDFDest_GetPageIndex(document(), dest));
+
+  // Page number directly in item from Dests dictionary.
+  dest = FPDF_GetNamedDestByName(document(), "FirstAlternate");
+  EXPECT_NE(nullptr, dest);
+  EXPECT_EQ(11, FPDFDest_GetPageIndex(document(), dest));
+
+  // Invalid object reference in item from Dests NameTree.
+  dest = FPDF_GetNamedDestByName(document(), "LastAlternate");
+  EXPECT_NE(nullptr, dest);
+  EXPECT_EQ(0, FPDFDest_GetPageIndex(document(), dest));
+}
index 55c159a..ee32727 100644 (file)
@@ -140,3 +140,40 @@ TEST_F(FPDFViewEmbeddertest, NamedDests) {
   EXPECT_EQ(nullptr, dest);
   EXPECT_EQ(sizeof(fixed_buffer), buffer_size);  // unmodified.
 }
+
+TEST_F(FPDFViewEmbeddertest, NamedDestsByName) {
+  EXPECT_TRUE(OpenDocument("testing/resources/named_dests.pdf"));
+
+  // Null pointer returns NULL.
+  FPDF_DEST dest = FPDF_GetNamedDestByName(document(), nullptr);
+  EXPECT_EQ(nullptr, dest);
+
+  // Empty string returns NULL.
+  dest = FPDF_GetNamedDestByName(document(), "");
+  EXPECT_EQ(nullptr, dest);
+
+  // Item from Dests NameTree.
+  dest = FPDF_GetNamedDestByName(document(), "First");
+  EXPECT_NE(nullptr, dest);
+
+  long ignore_len = 0;
+  FPDF_DEST dest_by_index =
+      FPDF_GetNamedDest(document(), 0, nullptr, ignore_len);
+  EXPECT_EQ(dest_by_index, dest);
+
+  // Item from Dests dictionary.
+  dest = FPDF_GetNamedDestByName(document(), "FirstAlternate");
+  EXPECT_NE(nullptr, dest);
+
+  ignore_len = 0;
+  dest_by_index = FPDF_GetNamedDest(document(), 4, nullptr, ignore_len);
+  EXPECT_EQ(dest_by_index, dest);
+
+  // Bad value type for item from Dests NameTree array.
+  dest = FPDF_GetNamedDestByName(document(), "WrongType");
+  EXPECT_EQ(nullptr, dest);
+
+  // No such destination in either Dest NameTree or dictionary.
+  dest = FPDF_GetNamedDestByName(document(), "Bogus");
+  EXPECT_EQ(nullptr, dest);
+}
index b454573..2125852 100644 (file)
         '<(DEPTH)'
       ],
       'sources': [
+        'fpdfsdk/src/fpdfdoc_embeddertest.cpp',
         'fpdfsdk/src/fpdfview_embeddertest.cpp',
         'testing/embedder_test.cpp',
         'testing/embedder_test.h',
index 6655be9..5309ee2 100644 (file)
@@ -1,34 +1,43 @@
 {{header}}
 {{object 1 0}} <<
-  /Type /Pages
-  /Count 1
-  /Kids [3 0 R]
->>
-endobj
-{{object 2 0}} <<
   /Type /Catalog
-  /Pages 1 0 R
+  /Pages 2 0 R
   /Names <<
     /Dests 10 0 R
   >>
   /Dests 14 0 R
 >>
 endobj
+{{object 2 0}} <<
+  /Type /Pages
+  /Count 2
+  /Kids [
+    3 0 R
+    4 0 R
+  ]
+>>
+endobj
+% Page number 0.
 {{object 3 0}} <<
   /Type /Page
-  /Parent 1 0 R
+  /Parent 2 0 R
   /Resources <<
-    /ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
+    /Font <</F1 15 0 R>>
   >>
+  /Contents [21 0 R]
   /MediaBox [0 0 612 792]
-  /Contents 5 0 R
 >>
 endobj
-{{object 5 0}} <<
-  /Length 18
->> stream
-1 0 0 -1 29 763 cm
-endstream
+% Page number 1.
+{{object 4 0}} <<
+  /Type /Page
+  /Parent 2 0 R
+  /Resources  <<
+    /Font <</F1 15 0 R>>
+  >>
+  /Contents [22 0 R]
+  /MediaBox [0 0 612 792]
+>>
 endobj
 % Root of Dests NameTree
 {{object 10 0}} <<
@@ -41,8 +50,8 @@ endobj
 % Left child for Dests NameTree
 {{object 11 0}} <<
   /Names [
-    (First) [0 /XYZ 0 0 1]
-    (Next) <</D [4 /Fit]>>
+    (First) [1 /XYZ 0 0 1]
+    (Next) <</D [4 0 R /Fit]>>
   ]
 >>
 endobj
@@ -54,16 +63,47 @@ endobj
   ]
 >>
 endobj
-% Old-style top-level Dests dictionary.
+% Old-style top-level Dests dictionary. Note that FirstAlternate
+% intentionally references non-exisstant page 11 and LastAlternate
+% intentionally references non-existant object 999.
 {{object 14 0}} <<
-  /FirstAlternate [10 /XYZ 200 400 800]
-  /LastAlternate  <</D [14 /XYZ 0 0 -200]>>
+  /FirstAlternate [11 /XYZ 200 400 800]
+  /LastAlternate  <</D [999 0 R /XYZ 0 0 -200]>>
 >>
 endobj
+% Font resource.
+{{object 15 0}} <<
+  /Type /Font
+  /Subtype /Type1
+  /BaseFont /Arial
+>>
+endobj
+% Content for page 0.
+{{object 21 0}} <<
+  /Length 0
+>>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page1)Tj
+ET
+endstream
+endobj
+% Content for page 1.
+{{object 22 0}} <<
+  /Length 0
+>>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page2)Tj
+ET
+endstream
+endobj
 {{xref}}
 trailer <<
   /Size 6
-  /Root 2 0 R
+  /Root 1 0 R
 >>
 {{startxref}}
 %%EOF
index 1f650e7..e302c19 100644 (file)
@@ -1,35 +1,44 @@
 %PDF-1.7
 % ò¤ô
 1 0 obj <<
-  /Type /Pages
-  /Count 1
-  /Kids [3 0 R]
->>
-endobj
-2 0 obj <<
   /Type /Catalog
-  /Pages 1 0 R
+  /Pages 2 0 R
   /Names <<
     /Dests 10 0 R
   >>
   /Dests 14 0 R
 >>
 endobj
+2 0 obj <<
+  /Type /Pages
+  /Count 2
+  /Kids [
+    3 0 R
+    4 0 R
+  ]
+>>
+endobj
+% Page number 0.
 3 0 obj <<
   /Type /Page
-  /Parent 1 0 R
+  /Parent 2 0 R
   /Resources <<
-    /ProcSets [/PDF /Text /ImageB /ImageC /ImageI]
+    /Font <</F1 15 0 R>>
   >>
+  /Contents [21 0 R]
   /MediaBox [0 0 612 792]
-  /Contents 5 0 R
 >>
 endobj
-5 0 obj <<
-  /Length 18
->> stream
-1 0 0 -1 29 763 cm
-endstream
+% Page number 1.
+4 0 obj <<
+  /Type /Page
+  /Parent 2 0 R
+  /Resources  <<
+    /Font <</F1 15 0 R>>
+  >>
+  /Contents [22 0 R]
+  /MediaBox [0 0 612 792]
+>>
 endobj
 % Root of Dests NameTree
 10 0 obj <<
@@ -42,8 +51,8 @@ endobj
 % Left child for Dests NameTree
 11 0 obj <<
   /Names [
-    (First) [0 /XYZ 0 0 1]
-    (Next) <</D [4 /Fit]>>
+    (First) [1 /XYZ 0 0 1]
+    (Next) <</D [4 0 R /Fit]>>
   ]
 >>
 endobj
@@ -55,33 +64,72 @@ endobj
   ]
 >>
 endobj
-% Old-style top-level Dests dictionary.
+% Old-style top-level Dests dictionary. Note that FirstAlternate
+% intentionally references non-exisstant page 11 and LastAlternate
+% intentionally references non-existant object 999.
 14 0 obj <<
-  /FirstAlternate [10 /XYZ 200 400 800]
-  /LastAlternate  <</D [14 /XYZ 0 0 -200]>>
+  /FirstAlternate [11 /XYZ 200 400 800]
+  /LastAlternate  <</D [999 0 R /XYZ 0 0 -200]>>
+>>
+endobj
+% Font resource.
+15 0 obj <<
+  /Type /Font
+  /Subtype /Type1
+  /BaseFont /Arial
+>>
+endobj
+% Content for page 0.
+21 0 obj <<
+  /Length 0
+>>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page1)Tj
+ET
+endstream
+endobj
+% Content for page 1.
+22 0 obj <<
+  /Length 0
 >>
+stream
+BT
+/F1 20 Tf
+100 600 TD (Page2)Tj
+ET
+endstream
 endobj
 xref
-0 15
+0 23
 0000000000 65536 f
 0000000015 00000 n
-0000000078 00000 n
-0000000182 00000 n
+0000000119 00000 n
+0000000217 00000 n
+0000000378 00000 n
+0000000000 65536 f
+0000000000 65536 f
+0000000000 65536 f
+0000000000 65536 f
+0000000000 65536 f
+0000000548 00000 n
+0000000638 00000 n
+0000000766 00000 n
 0000000000 65536 f
-0000000349 00000 n
+0000001060 00000 n
+0000001188 00000 n
 0000000000 65536 f
 0000000000 65536 f
 0000000000 65536 f
 0000000000 65536 f
-0000000444 00000 n
-0000000534 00000 n
-0000000658 00000 n
 0000000000 65536 f
-0000000808 00000 n
+0000001283 00000 n
+0000001393 00000 n
 trailer <<
   /Size 6
-  /Root 2 0 R
+  /Root 1 0 R
 >>
 startxref
-914
+1481
 %%EOF