[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