The branch, master, has been updated. - Log -----------------------------------------------------------------
commit b79c88034edaa6cc256c8869820b5d8f943d3bbf Author: Georg Baum <[email protected]> Date: Mon May 13 21:53:28 2013 +0200 Add test for Layout::write() When running the test, you'll get the following messages: Testing ../../src/../lib/layouts/siamltex.layout... Layout.cpp (268): Cannot copy unknown style `Enumerate' Testing ../../src/../lib/layouts/svglobal.layout... Cannot delete style `Dedication' Testing ../../src/../lib/layouts/svjog.layout... Cannot delete style `Dedication' Testing ../../src/../lib/layouts/svprobth.layout... Cannot delete style `Dedication' These are no errors of Layout::write(), but they indicate problems in the definition of the layout files. Kornel, it would be nice if you could do the cmake part. diff --git a/src/Layout.cpp b/src/Layout.cpp index b48b764..5ac163a 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()) { diff --git a/src/Makefile.am b/src/Makefile.am index bdf0c7b..780b710 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -666,3 +666,38 @@ else liblyxinsets_a_SOURCES = $(SOURCEFILESINSETS) $(HEADERFILESINSETS) endif + + +############################## Tests ################################## + +EXTRA_DIST += \ + tests/test_Layout + + +TESTS = \ + tests/test_Layout + +check_PROGRAMS = \ + check_Layout + +check_Layout_CPPFLAGS = $(AM_CPPFLAGS) -DNO_LAYOUT_CSS +check_Layout_LDADD = support/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 \ + support/tests/boost.cpp \ + support/tests/dummy_functions.cpp + 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/tests/check_Layout.cpp b/src/tests/check_Layout.cpp new file mode 100644 index 0000000..b4ecad9 --- /dev/null +++ b/src/tests/check_Layout.cpp @@ -0,0 +1,130 @@ +#include <config.h> + +#include "../support/FileName.h" +#include "../support/filetools.h" +#include "../Format.h" +#include "../LayoutFile.h" +#include "../LaTeXFeatures.h" +#include "../Lexer.h" +#include "../support/Messages.h" +#include "../support/os.h" +#include "../support/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(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/tests/test_Layout b/src/tests/test_Layout new file mode 100755 index 0000000..02431ea --- /dev/null +++ b/src/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 = \ ----------------------------------------------------------------------- Summary of changes: src/Layout.cpp | 2 +- src/Makefile.am | 35 +++++++++ src/support/tests/dummy_functions.cpp | 6 ++ src/tests/check_Layout.cpp | 130 +++++++++++++++++++++++++++++++++ src/tests/test_Layout | 13 +++ src/tex2lyx/CMakeLists.txt | 1 + src/tex2lyx/Makefile.am | 2 +- 7 files changed, 187 insertions(+), 2 deletions(-) create mode 100644 src/tests/check_Layout.cpp create mode 100755 src/tests/test_Layout hooks/post-receive -- The LyX Source Repository
