[prev in list] [next in list] [prev in thread] [next in thread]
List: lyx-devel
Subject: [patch] Tests for Layout::write()
From: Georg Baum <Georg.Baum () post ! rwth-aachen ! de>
Date: 2013-03-31 16:43:34
Message-ID: kj9p3i$381$1 () ger ! gmane ! org
[Download RAW message or body]
As you probably all know, features which are not covered by regularly
executed tests will break over time. Therefore I created a test for the new
Layout::write() functionality (see attached). It works, and it already found
a couple of bugs in my first implementation. However, there are several
things I don't like about it:
- It does not belong to support, but I used the test infrastructure there
- The exclusion of alignmentToCSS() is wrong, but otherwise much more
dependencies are needed
- The linker flag to ignore the double definition of _(). I guess that this
would be a problem in the other tests as well if _() would actually be used
in the code.
- It is not a 100% test: It does not test modules, and since it compares two
times the output of write() it is not 100% safe even for the layouts it
tests. The reason for this is that operator==() is rather incomplete for
layouts.
Nevertheless, I'd like to put it in in some form or the other, but would
like to avoid bigger infrastructure changes. Do you have any
thoughts/suggestions?
Georg
["writelayouttest.diff" (text/x-patch)]
diff --git a/src/support/Makefile.am b/src/support/Makefile.am
index 5ab3ef9..b78fd28 100644
--- a/src/support/Makefile.am
+++ b/src/support/Makefile.am
@@ -146,11 +146,13 @@ EXTRA_DIST += \
TESTS = \
tests/test_convert \
tests/test_filetools \
+ tests/test_Layout \
tests/test_lstrings
check_PROGRAMS = \
check_convert \
check_filetools \
+ check_Layout \
check_lstrings
check_convert_LDADD = liblyxsupport.a $(INTLLIBS) $(LIBICONV) $(BOOST_LIBS) \
$(QT4_CORE_LIBS) $(LIBSHLWAPI) @@ -167,6 +169,27 @@ check_filetools_SOURCES = \
tests/dummy_functions.cpp \
tests/boost.cpp
+check_Layout_CPPFLAGS = $(AM_CPPFLAGS) -DNO_LAYOUT_CSS
+check_Layout_LDADD = liblyxsupport.a $(INTLLIBS) $(LIBICONV) $(BOOST_LIBS) @LIBS@ \
$(QT4_CORE_LIBS) $(LIBSHLWAPI) +# need to allow multiple definitions of _() (see \
dummy_functions.cpp) +check_Layout_LDFLAGS = $(QT4_CORE_LDFLAGS) \
-Wl,--allow-multiple-definition +check_Layout_SOURCES = \
+ ../insets/InsetLayout.cpp \
+ ../Color.cpp \
+ ../Counters.cpp \
+ ../Floating.cpp \
+ ../FloatList.cpp \
+ ../FontInfo.cpp \
+ ../Layout.cpp \
+ ../LayoutFile.cpp \
+ ../Lexer.cpp \
+ ../ModuleList.cpp \
+ ../Spacing.cpp \
+ ../TextClass.cpp \
+ tests/check_Layout.cpp \
+ tests/boost.cpp \
+ tests/dummy_functions.cpp
+
check_lstrings_LDADD = liblyxsupport.a $(INTLLIBS) $(LIBICONV) $(BOOST_LIBS) \
$(QT4_CORE_LIBS) $(LIBSHLWAPI) check_lstrings_LDFLAGS = $(QT4_CORE_LDFLAGS)
check_lstrings_SOURCES = \
diff --git a/src/support/tests/check_Layout.cpp b/src/support/tests/check_Layout.cpp
index 6464ba6..1cc8e70 100644
--- a/src/support/tests/check_Layout.cpp
+++ b/src/support/tests/check_Layout.cpp
@@ -0,0 +1,130 @@
+#include <config.h>
+
+#include "../FileName.h"
+#include "../filetools.h"
+#include "../../Format.h"
+#include "../../LayoutFile.h"
+#include "../../LaTeXFeatures.h"
+#include "../../Lexer.h"
+#include "../Messages.h"
+#include "../os.h"
+#include "../Package.h"
+
+#include <cstdlib>
+#include <iostream>
+
+
+namespace lyx {
+namespace frontend {
+namespace Alert {
+void warning(docstring const & title, docstring const & message, bool const &)
+{
+ LYXERR0(title);
+ LYXERR0(message);
+}
+}
+}
+
+bool LaTeXFeatures::isAvailable(std::string const &)
+{
+ return false;
+}
+
+Formats formats;
+bool Formats::isZippedFile(support::FileName const &) const
+{
+ return false;
+}
+}
+
+
+using namespace lyx::support;
+using namespace lyx;
+
+using namespace std;
+
+
+bool test_Layout(string const & input, string const & output)
+{
+ FileName const ifn(makeAbsPath(input));
+ LayoutFileList l;
+ LayoutFileIndex i = l.addLocalLayout(ifn.onlyFileName(), \
ifn.onlyPath().absFileName()); + if (i.empty()) {
+ cerr << "Could not read layout file " << input << ".layout.\n";
+ return false;
+ }
+ LayoutFile const & f = l[i];
+ ostream * os = NULL;
+ if (output == "-")
+ os = &cout;
+ else if (!output.empty())
+ os = new ofstream(output.c_str());
+ bool success = true;
+ for (TextClass::const_iterator it = f.begin(); it != f.end(); ++it) {
+ if (os)
+ it->write(*os);
+ ostringstream oss;
+ it->write(oss);
+ istringstream iss(oss.str());
+ // swallow "Style Standard" line
+ string line;
+ if (getline(iss, line)) {
+ Lexer lex;
+ lex.setStream(iss);
+ Layout test;
+ test.setName(it->name());
+ if (test.read(lex, f)) {
+ // Caution: operator==() is incomplete!
+ // Testing test == *it does not make much sense
+ // therefore.
+ // It does not work either for styles with
+ // non-empty obsoletedby if the obsoletedby
+ // style was modified after the obsolete style
+ // was defined: Layout::write() writes only the
+ // final version, but the obsolete style was
+ // set to the version at the time it was
+ // defined, and therefore they differ. See e.g.
+ // the obsolete style AMS which is replaced by
+ // Subjectclass in amsdefs.inc, and
+ // Subjectclass is modified later in siamltex.layout.
+ ostringstream osstest;
+ test.write(osstest);
+ if (osstest.str() != oss.str()) {
+ cerr << "Round trip for style "
+ << to_utf8(it->name())
+ << " failed:\n"
+ << osstest.str() << oss.str();
+ success = false;
+ }
+ } else {
+ cerr << "Could not read style "
+ << to_utf8(it->name()) << ".\n";
+ success = false;
+ }
+ } else {
+ cerr << "Could not read first line for style "
+ << to_utf8(it->name()) << ".\n";
+ success = false;
+ }
+ }
+ if (output != "-")
+ delete os;
+ return success;
+}
+
+
+int main(int argc, char * argv[])
+{
+ os::init(argc, argv);
+ lyxerr.setStream(cerr);
+ if (argc < 2 || argc > 3) {
+ cerr << "Usage: " << argv[0] << " <input layout file> [<output layout file>]\n";
+ return EXIT_FAILURE;
+ }
+ FileName const exe(makeAbsPath(os::internal_path(os::utf8_argv(0))));
+ string const lyxexe = addName(addPath(exe.onlyPath().absFileName(), "../"), "lyx");
+ init_package(lyxexe, string(), string());
+ if (test_Layout(argv[1], argc > 2 ? argv[2] : ""))
+ return EXIT_SUCCESS;
+ return EXIT_FAILURE;
+}
diff --git a/src/support/tests/dummy_functions.cpp \
b/src/support/tests/dummy_functions.cpp index bfec86f..63f16db 100644
--- a/src/support/tests/dummy_functions.cpp
+++ b/src/support/tests/dummy_functions.cpp
@@ -20,4 +20,10 @@ namespace lyx {
return lyx_messages;
}
+ Messages const & getMessages(string const &)
+ {
+ static Messages lyx_messages;
+
+ return lyx_messages;
+ }
}
diff --git a/src/support/tests/test_Layout b/src/support/tests/test_Layout
index f470c63..1d07f09 100755
--- a/src/support/tests/test_Layout
+++ b/src/support/tests/test_Layout
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+retval=0
+for i in ${srcdir}/../../lib/layouts/*.layout
+do
+ echo Testing $i...
+ dn=`dirname $i`
+ bn=`basename $i .layout`
+ if ! ./check_Layout ${dn}/${bn}; then
+ retval=1
+ fi
+done
+exit $retval
diff --git a/src/tex2lyx/CMakeLists.txt b/src/tex2lyx/CMakeLists.txt
index ee36c5f..751926e 100644
--- a/src/tex2lyx/CMakeLists.txt
+++ b/src/tex2lyx/CMakeLists.txt
@@ -30,6 +30,7 @@ include_directories(BEFORE
${ZLIB_INCLUDE_DIR})
add_definitions(-DTEX2LYX)
+add_definitions(-DNO_LAYOUT_CSS)
if(WIN32)
set(FILE_RC ${TOP_CMAKE_PATH}/lyx.rc)
diff --git a/src/tex2lyx/Makefile.am b/src/tex2lyx/Makefile.am
index 0da4b02..5be47e7 100644
--- a/src/tex2lyx/Makefile.am
+++ b/src/tex2lyx/Makefile.am
@@ -16,7 +16,7 @@ bin_PROGRAMS = tex2lyx
DEFAULT_INCLUDES =
-AM_CPPFLAGS += -DTEX2LYX $(PCH_FLAGS) -I$(top_srcdir)/src/tex2lyx \
+AM_CPPFLAGS += -DTEX2LYX -DNO_LAYOUT_CSS $(PCH_FLAGS) -I$(top_srcdir)/src/tex2lyx \
-I$(top_srcdir)/src -I$(top_builddir) $(BOOST_INCLUDES)
TEST_FILES = \
diff --git a/src/Layout.cpp b/src/Layout.cpp
index b48b764..4603551 100644
--- a/src/Layout.cpp
+++ b/src/Layout.cpp
@@ -1478,7 +1478,7 @@ void Layout::makeDefaultCSS() const
}
// tex2lyx does not see output_xhtml.cpp
-#ifndef TEX2LYX
+#ifndef NO_LAYOUT_CSS
// alignment
string where = alignmentToCSS(align);
if (!where.empty()) {
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic