summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tesseract/unittest/ligature_table_test.cc')
-rw-r--r--tesseract/unittest/ligature_table_test.cc111
1 files changed, 111 insertions, 0 deletions
diff --git a/tesseract/unittest/ligature_table_test.cc b/tesseract/unittest/ligature_table_test.cc
new file mode 100644
index 00000000..0047f857
--- /dev/null
+++ b/tesseract/unittest/ligature_table_test.cc
@@ -0,0 +1,111 @@
+// (C) Copyright 2017, Google Inc.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+// http://www.apache.org/licenses/LICENSE-2.0
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "commandlineflags.h"
+#include "fileio.h"
+#include "include_gunit.h"
+#include "ligature_table.h"
+#include "pango_font_info.h"
+
+namespace tesseract {
+
+const char kEngNonLigatureText[] = "fidelity effigy ſteep";
+// Same as above text, but with "fi" in the first word and "ffi" in the second
+// word replaced with their respective ligatures.
+const char kEngLigatureText[] = "fidelity effigy ſteep";
+// Same as kEngLigatureText but with "fi" in both words replaced with their
+// ligature. The test Verdana font does not support the "ffi" or "ſt" ligature.
+const char kRenderableEngLigatureText[] = "fidelity effigy ſteep";
+
+static PangoFontMap* font_map;
+
+class LigatureTableTest : public ::testing::Test {
+ protected:
+ void SetUp() override {
+ lig_table_ = LigatureTable::Get();
+ if (!font_map) {
+ font_map = pango_cairo_font_map_new_for_font_type(CAIRO_FONT_TYPE_FT);
+ }
+ pango_cairo_font_map_set_default(PANGO_CAIRO_FONT_MAP(font_map));
+ }
+
+ static void SetUpTestCase() {
+ static std::locale system_locale("");
+ std::locale::global(system_locale);
+
+ FLAGS_fonts_dir = TESTING_DIR;
+ FLAGS_fontconfig_tmpdir = FLAGS_test_tmpdir;
+ file::MakeTmpdir();
+ PangoFontInfo::SoftInitFontConfig(); // init early
+ }
+ LigatureTable* lig_table_;
+};
+
+TEST_F(LigatureTableTest, DoesFillLigatureTables) {
+ EXPECT_GT(lig_table_->norm_to_lig_table().size(), 0);
+ EXPECT_GT(lig_table_->lig_to_norm_table().size(), 0);
+}
+
+TEST_F(LigatureTableTest, DoesAddLigatures) {
+ EXPECT_STREQ(kEngLigatureText,
+ lig_table_->AddLigatures(kEngNonLigatureText, nullptr).c_str());
+}
+
+TEST_F(LigatureTableTest, DoesAddLigaturesWithSupportedFont) {
+ PangoFontInfo font;
+ EXPECT_TRUE(font.ParseFontDescriptionName("Verdana"));
+printf("1:%s\n", kRenderableEngLigatureText);
+printf("2:%s\n", lig_table_->AddLigatures(kEngNonLigatureText, &font).c_str());
+ EXPECT_STREQ(kRenderableEngLigatureText,
+ lig_table_->AddLigatures(kEngNonLigatureText, &font).c_str());
+}
+
+TEST_F(LigatureTableTest, DoesNotAddLigaturesWithUnsupportedFont) {
+ PangoFontInfo font;
+ EXPECT_TRUE(font.ParseFontDescriptionName("Lohit Hindi"));
+ EXPECT_STREQ(kEngNonLigatureText,
+ lig_table_->AddLigatures(kEngNonLigatureText, &font).c_str());
+}
+
+TEST_F(LigatureTableTest, DoesRemoveLigatures) {
+ EXPECT_STREQ(kEngNonLigatureText,
+ lig_table_->RemoveLigatures(kEngLigatureText).c_str());
+}
+
+TEST_F(LigatureTableTest, TestCustomLigatures) {
+ const char* kTestCases[] = {
+ "act", "a\uE003", "publiſh", "publi\uE006", "ſince",
+ "\uE007nce", "aſleep", "a\uE008eep", "neceſſary", "nece\uE009ary",
+ };
+ for (size_t i = 0; i < ARRAYSIZE(kTestCases); i += 2) {
+ EXPECT_STREQ(kTestCases[i + 1],
+ lig_table_->AddLigatures(kTestCases[i], nullptr).c_str());
+ EXPECT_STREQ(kTestCases[i],
+ lig_table_->RemoveLigatures(kTestCases[i + 1]).c_str());
+ EXPECT_STREQ(kTestCases[i],
+ lig_table_->RemoveCustomLigatures(kTestCases[i + 1]).c_str());
+ }
+}
+
+TEST_F(LigatureTableTest, TestRemovesCustomLigatures) {
+ const char* kTestCases[] = {
+ "fiction",
+ "fi\uE003ion",
+ "fiction",
+ };
+ for (size_t i = 0; i < ARRAYSIZE(kTestCases); i += 3) {
+ EXPECT_STREQ(kTestCases[i + 1],
+ lig_table_->AddLigatures(kTestCases[i], nullptr).c_str());
+ EXPECT_STREQ(kTestCases[i + 2],
+ lig_table_->RemoveCustomLigatures(kTestCases[i + 1]).c_str());
+ }
+}
+} // namespace