Add embedder tests for public/fpdf_searchex.h.

Exercise FPDFText_GetCharIndexFromTextIndex() and
FPDFText_GetTextIndexFromCharIndex().

Change-Id: I0e74b0cd88cbc7bf28d046dd24829c0dde0a39f1
Reviewed-on: https://pdfium-review.googlesource.com/c/50692
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn
index adea01c..68de270 100644
--- a/fpdfsdk/BUILD.gn
+++ b/fpdfsdk/BUILD.gn
@@ -124,6 +124,7 @@
     "fpdf_formfill_embeddertest.cpp",
     "fpdf_ppo_embeddertest.cpp",
     "fpdf_save_embeddertest.cpp",
+    "fpdf_searchex_embeddertest.cpp",
     "fpdf_structtree_embeddertest.cpp",
     "fpdf_sysfontinfo_embeddertest.cpp",
     "fpdf_text_embeddertest.cpp",
diff --git a/fpdfsdk/fpdf_searchex_embeddertest.cpp b/fpdfsdk/fpdf_searchex_embeddertest.cpp
new file mode 100644
index 0000000..54b4799
--- /dev/null
+++ b/fpdfsdk/fpdf_searchex_embeddertest.cpp
@@ -0,0 +1,121 @@
+// Copyright 2019 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 "public/cpp/fpdf_scopers.h"
+#include "public/fpdf_searchex.h"
+#include "testing/embedder_test.h"
+
+class FPDFSearchExEmbedderTest : public EmbedderTest {};
+
+TEST_F(FPDFSearchExEmbedderTest, GetCharIndexFromTextIndex) {
+  ASSERT_TRUE(OpenDocument("hello_world.pdf"));
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+
+  {
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ASSERT_TRUE(textpage);
+
+    EXPECT_EQ(-2, FPDFText_GetCharIndexFromTextIndex(textpage.get(), -2));
+    EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), -1));
+    EXPECT_EQ(0, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 0));
+    EXPECT_EQ(1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 1));
+    EXPECT_EQ(2, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 2));
+    EXPECT_EQ(5, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 5));
+    EXPECT_EQ(10, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 10));
+    EXPECT_EQ(29, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 29));
+    EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 30));
+  }
+
+  UnloadPage(page);
+}
+
+TEST_F(FPDFSearchExEmbedderTest,
+       GetCharIndexFromTextIndexWithNonPrintableChar) {
+  ASSERT_TRUE(OpenDocument("bug_1139.pdf"));
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+
+  {
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ASSERT_TRUE(textpage);
+
+    EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), -2));
+    EXPECT_EQ(0, FPDFText_GetCharIndexFromTextIndex(textpage.get(), -1));
+    EXPECT_EQ(1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 0));
+    EXPECT_EQ(2, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 1));
+    EXPECT_EQ(3, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 2));
+    EXPECT_EQ(6, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 5));
+    EXPECT_EQ(11, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 10));
+    EXPECT_EQ(30, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 29));
+    EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 30));
+    EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(textpage.get(), 31));
+  }
+
+  UnloadPage(page);
+}
+
+TEST_F(FPDFSearchExEmbedderTest, GetCharIndexFromTextIndexInvalid) {
+  EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(nullptr, -2));
+  EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(nullptr, -1));
+  EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(nullptr, 0));
+  EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(nullptr, 1));
+  EXPECT_EQ(-1, FPDFText_GetCharIndexFromTextIndex(nullptr, 2));
+}
+
+TEST_F(FPDFSearchExEmbedderTest, GetTextIndexFromCharIndex) {
+  ASSERT_TRUE(OpenDocument("hello_world.pdf"));
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+
+  {
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ASSERT_TRUE(textpage);
+
+    EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), -2));
+    EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), -1));
+    EXPECT_EQ(0, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 0));
+    EXPECT_EQ(1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 1));
+    EXPECT_EQ(2, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 2));
+    EXPECT_EQ(5, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 5));
+    EXPECT_EQ(10, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 10));
+    EXPECT_EQ(29, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 29));
+    EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 30));
+  }
+
+  UnloadPage(page);
+}
+
+TEST_F(FPDFSearchExEmbedderTest,
+       GetTextIndexFromCharIndexWithNonPrintableChar) {
+  ASSERT_TRUE(OpenDocument("bug_1139.pdf"));
+  FPDF_PAGE page = LoadPage(0);
+  ASSERT_TRUE(page);
+
+  {
+    ScopedFPDFTextPage textpage(FPDFText_LoadPage(page));
+    ASSERT_TRUE(textpage);
+
+    EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), -2));
+    EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), -1));
+    EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 0));
+    EXPECT_EQ(0, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 1));
+    EXPECT_EQ(1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 2));
+    EXPECT_EQ(4, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 5));
+    EXPECT_EQ(9, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 10));
+    EXPECT_EQ(28, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 29));
+    EXPECT_EQ(29, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 30));
+    EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(textpage.get(), 31));
+  }
+
+  UnloadPage(page);
+}
+
+TEST_F(FPDFSearchExEmbedderTest, GetTextIndexFromCharIndexInvalid) {
+  EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(nullptr, -2));
+  EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(nullptr, -1));
+  EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(nullptr, 0));
+  EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(nullptr, 1));
+  EXPECT_EQ(-1, FPDFText_GetTextIndexFromCharIndex(nullptr, 2));
+}