summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp')
-rw-r--r--Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp
new file mode 100644
index 00000000000..e4900f66756
--- /dev/null
+++ b/Build/source/texk/dvisvgm/dvisvgm-src/tests/FontCacheTest.cpp
@@ -0,0 +1,155 @@
+/*************************************************************************
+** FontCacheTest.cpp **
+** **
+** This file is part of dvisvgm -- a fast DVI to SVG converter **
+** Copyright (C) 2005-2017 Martin Gieseking <martin.gieseking@uos.de> **
+** **
+** This program is free software; you can redistribute it and/or **
+** modify it under the terms of the GNU General Public License as **
+** published by the Free Software Foundation; either version 3 of **
+** the License, or (at your option) any later version. **
+** **
+** This program is distributed in the hope that it will be useful, but **
+** WITHOUT ANY WARRANTY; without even the implied warranty of **
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **
+** GNU General Public License for more details. **
+** **
+** You should have received a copy of the GNU General Public License **
+** along with this program; if not, see <http://www.gnu.org/licenses/>. **
+*************************************************************************/
+
+#include <gtest/gtest.h>
+#include <fstream>
+#include <sstream>
+#include "FileSystem.hpp"
+#include "FontCache.hpp"
+
+#ifndef SRCDIR
+#define SRCDIR "."
+#endif
+
+using namespace std;
+
+class FontCacheTest : public testing::Test
+{
+ protected:
+ FontCacheTest () : testing::Test(), cachedir("data") {
+ glyph1.moveto(0, 0);
+ glyph1.lineto(10, 0);
+ glyph1.lineto(10, 10);
+ glyph1.lineto(0, 10);
+ glyph1.closepath();
+
+ glyph2.moveto(0, 0);
+ glyph2.cubicto(10, 10, 20, 0, 50, 50);
+ glyph2.lineto(30, 20);
+ glyph2.conicto(20, 40, 20, 20);
+ glyph2.closepath();
+ }
+
+ ~FontCacheTest () {
+ FileSystem::remove(cachedir+"/testfont.fgd");
+ }
+
+ Glyph glyph1, glyph2;
+ FontCache cache;
+ string cachedir;
+};
+
+
+static string toSVG (const Glyph &glyph) {
+ ostringstream oss;
+ glyph.writeSVG(oss, false);
+ return oss.str();
+}
+
+
+static bool operator == (const Glyph &glyph1, const Glyph &glyph2) {
+ return toSVG(glyph1) == toSVG(glyph2);
+}
+
+
+TEST_F(FontCacheTest, glyph) {
+ EXPECT_EQ(toSVG(glyph1), "M0 0H10V10H0Z");
+ EXPECT_EQ(toSVG(glyph2), "M0 0C10 10 20 0 50 50L30 20Q20 40 20 20Z");
+ cache.setGlyph(1, glyph1);
+ cache.setGlyph(10, glyph2);
+ ASSERT_NE(cache.getGlyph(1), nullptr);
+ ASSERT_EQ(cache.getGlyph(2), nullptr);
+ ASSERT_NE(cache.getGlyph(10), nullptr);
+ ASSERT_EQ(*cache.getGlyph(1), glyph1);
+ ASSERT_EQ(*cache.getGlyph(10), glyph2);
+}
+
+
+TEST_F(FontCacheTest, write1) {
+ cache.setGlyph(1, glyph1);
+ ASSERT_TRUE(cache.fontname().empty());
+ ASSERT_FALSE(cache.write(cachedir.c_str()));
+}
+
+
+TEST_F(FontCacheTest, write2) {
+ cache.setGlyph(1, glyph1);
+ ASSERT_TRUE(FileSystem::exists(cachedir));
+ ASSERT_TRUE(cache.write("testfont", cachedir.c_str()));
+ cache.setGlyph(10, glyph2);
+ ASSERT_TRUE(cache.write("testfont", cachedir.c_str()));
+ ASSERT_TRUE(cache.fontname().empty());
+}
+
+
+TEST_F(FontCacheTest, read) {
+ cache.setGlyph(1, glyph1);
+ cache.setGlyph(10, glyph2);
+ ASSERT_TRUE(cache.write("testfont", cachedir.c_str()));
+ // clear cache object
+ cache.clear();
+ ASSERT_EQ(cache.getGlyph(1), nullptr);
+ ASSERT_EQ(cache.getGlyph(2), nullptr);
+ ASSERT_EQ(cache.getGlyph(10), nullptr);
+ // read glyph data from cache file
+ ASSERT_TRUE(cache.read("testfont", cachedir.c_str()));
+ ASSERT_EQ(cache.fontname(), "testfont");
+ ASSERT_NE(cache.getGlyph(1), nullptr);
+ ASSERT_EQ(cache.getGlyph(2), nullptr);
+ ASSERT_NE(cache.getGlyph(10), nullptr);
+ ASSERT_EQ(*cache.getGlyph(1), glyph1);
+ ASSERT_EQ(*cache.getGlyph(10), glyph2);
+}
+
+
+TEST_F(FontCacheTest, fontinfo1) {
+ ostringstream oss;
+ cache.clear();
+ FileSystem::remove(cachedir+"/testfont.fgd");
+ cache.fontinfo(cachedir.c_str(), oss);
+ ASSERT_EQ(oss.str(), "cache is empty\n");
+
+ // check removal of invalid cache files
+ ofstream cachefile(cachedir+"/invalid.fgd");
+ cachefile << "invalid cache file";
+ cachefile.close();
+ ASSERT_TRUE(FileSystem::exists(cachedir+"/invalid.fgd"));
+ oss.str("");
+ cache.fontinfo(cachedir.c_str(), oss, true);
+ ASSERT_EQ(oss.str(),
+ "cache is empty\n"
+ "invalid cache file invalid.fgd removed\n"
+ );
+ ASSERT_FALSE(FileSystem::exists(cachedir+"/invalid.fgd"));
+}
+
+
+TEST_F(FontCacheTest, fontinfo2) {
+ cache.setGlyph(1, glyph1);
+ cache.setGlyph(10, glyph2);
+ ASSERT_TRUE(cache.write("testfont", cachedir.c_str()));
+
+ ostringstream oss;
+ cache.fontinfo(cachedir.c_str(), oss);
+ ASSERT_EQ(oss.str(),
+ "cache format version 5\n"
+ "testfont 2 glyphs 10 cmds 58 bytes crc:38cb5c67\n"
+ );
+}