]> git.lyx.org Git - lyx.git/blob - development/autotests/export.cmake
ctests: invert 'wontfix' failing lyx2lyx tests
[lyx.git] / development / autotests / export.cmake
1 # This file is part of LyX, the document processor.
2 # Licence details can be found in the file COPYING.
3 #
4 # Copyright (c) 2012 Kornel Benko kornel@lyx.org
5 #
6 #
7 # LYX_ROOT  = ${TOP_SRC_DIR}/lib/{doc,examples,templates,tabletemplates}
8 # LYX_USERDIR_VER = Name of environment variable for the user directory
9 # lyx       =
10 # format    = lyx16x|lyx20x|lyx21x|lyx22x|xhtml|docbook5
11 # extension = 16.lyx|20.lyx|21.lyx|22.lyx|xhtml|xml
12 # file      = xxx
13 #
14 # Script should be called like:
15 # cmake -DLYX_ROOT=xxx \
16 #       -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR} \
17 #       -DWORKDIR=${BUILD_DIR}/autotests/out-home \
18 #       -DLYX_USERDIR_VER=${LYX_USERDIR_VER} \
19 #       -Dlyx=xxx \
20 #       -Dformat=xxx \
21 #       -Dfonttype=xxx \
22 #       -Dextension=xxx \
23 #       -DLYX_FORMAT_NUM=${_lyx_format_num} \
24 #       -Dfile=xxx \
25 #       -Dinverted=[01] \
26 #       -DTOP_SRC_DIR=${TOP_SRC_DIR} \
27 #       -DIgnoreErrorMessage=(ON/OFF) \
28 #       -DPERL_EXECUTABLE=${PERL_EXECUTABLE} \
29 #       -DXMLLINT_EXECUTABLE=${XMLLINT_EXECUTABLE} \
30 #       -DENCODING=xxx \
31 #       -P "${TOP_SRC_DIR}/development/autotests/export.cmake"
32 #
33
34 set(_TestResultMessage "")
35 message(STATUS "IgnoreErrorMessage = \"${IgnoreErrorMessage}\"")
36 set(Perl_Script "${TOP_SRC_DIR}/development/autotests/useSystemFonts.pl")
37 set(Structure_Script "${TOP_SRC_DIR}/development/autotests/beginEndStructureCheck.pl")
38 set(LanguageFile "${TOP_SRC_DIR}/lib/languages")
39 set(GetTempDir "${TOP_SRC_DIR}/development/autotests/getTempDir.pl")
40 set(_ft ${fonttype})
41 execute_process(COMMAND ${PERL_EXECUTABLE} "${GetTempDir}" "${WORKDIR}" OUTPUT_VARIABLE TempDir)
42 message(STATUS "using fonttype = ${_ft}")
43 if(NOT ENCODING)
44   set(ENCODING "default")
45 endif()
46 if(ENCODING STREQUAL "default")
47   set(_enc)
48 else()
49   set(_enc "_${ENCODING}")
50 endif()
51
52 # move the the last directory part of LYX_ROOT to filename
53 # to make the destination unique for otherwise identical
54 # filenames
55 get_filename_component(updir_ "${LYX_ROOT}" DIRECTORY)
56 get_filename_component(updir2_ "${LYX_ROOT}" NAME)
57 set(file "${updir2_}/${file}")
58 set(LYX_ROOT "${updir_}")
59
60 if(format MATCHES "dvi|pdf")
61   message(STATUS "LYX_TESTS_USERDIR = ${LYX_TESTS_USERDIR}")
62   message(STATUS "Converting with perl ${Perl_Script}")
63   set(LYX_SOURCE "${TempDir}/${file}_${format}_${_ft}${_enc}.lyx")
64   message(STATUS "Using source \"${LYX_ROOT}/${file}.lyx\"")
65   message(STATUS "Using dest \"${LYX_SOURCE}\"")
66   if(NOT "${ENCODING}" STREQUAL "default")
67     # message(STATUS "ENCODING = ${ENCODING}")
68   endif()
69   message(STATUS "Executing ${PERL_EXECUTABLE} \"${Perl_Script}\" \"${LYX_ROOT}/${file}.lyx\" \"${LYX_SOURCE}\" ${format} ${_ft} ${ENCODING} ${LanguageFile}")
70   execute_process(COMMAND ${PERL_EXECUTABLE} "${Perl_Script}" "${LYX_ROOT}/${file}.lyx" "${LYX_SOURCE}" ${format} ${_ft} ${ENCODING} ${LanguageFile}
71     RESULT_VARIABLE _err)
72   string(COMPARE EQUAL  ${_err} 0 _erg)
73   if(NOT _erg)
74     message(FATAL_ERROR "Export failed while converting")
75   endif()
76   set(result_file_name ${file}_${_ft}.${extension})
77 else()
78   message(STATUS "Converting with perl ${Perl_Script}")
79   set(LYX_SOURCE "${TempDir}/${file}.lyx")
80   message(STATUS "Using source \"${LYX_ROOT}/${file}.lyx\"")
81   message(STATUS "Using dest \"${LYX_SOURCE}\"")
82   execute_process(COMMAND ${PERL_EXECUTABLE} "${Perl_Script}" "${LYX_ROOT}/${file}.lyx" "${LYX_SOURCE}" ${format} "dontChange" "default" ${LanguageFile}
83     RESULT_VARIABLE _err)
84   string(COMPARE EQUAL  ${_err} 0 _erg)
85   if(NOT _erg)
86     message(FATAL_ERROR "Export failed while converting")
87     endif()
88   if(extension MATCHES "\\.lyx$")
89     # Font-type not relevant for lyx16/lyx2[0123] exports
90     set(result_file_base "${TempDir}/${file}")
91   else()
92     set(result_file_name ${file}.${extension})
93   endif()
94 endif()
95
96 function(get_md5sum msource mresult mreserr)
97   execute_process(
98     COMMAND ${CMAKE_COMMAND} -E md5sum ${${msource}}
99     OUTPUT_VARIABLE msource_md5sum_x
100     RESULT_VARIABLE mres_err)
101   if (NOT mres_err)
102     string(REGEX REPLACE " .*" "" msource_md5sum ${msource_md5sum_x})
103     set(${mresult} ${msource_md5sum} PARENT_SCOPE)
104     message(STATUS "MD5SUM of \"${${msource}}\" is ${msource_md5sum}")
105   else()
106     set(${mresult} "xx" PARENT_SCOPE)
107     message(STATUS "Error getting MD5SUM of \"${${msource}}\"")
108   endif()
109   set(${mreserr} ${mres_err} PARENT_SCOPE)
110 endfunction()
111
112 macro(Summary _err _msg)
113   if (${_err})
114     list(APPEND _TestResultMessage "Error: ${_msg}")
115   else()
116     list(APPEND _TestResultMessage "OK: ${_msg}")
117   endif()
118 endmacro()
119
120 set(ENV{${LYX_USERDIR_VER}} "${LYX_TESTS_USERDIR}")
121 set(ENV{LANG} "en_US.UTF-8") # to get all error-messages in english
122 set(ENV{LANGUAGE} "US:en")
123 #set(ENV{LC_ALL} "C")
124 if (extension MATCHES "\\.lyx$")
125   include(${TOP_SRC_DIR}/development/autotests/CheckLoadErrors.cmake)
126   get_md5sum(LYX_SOURCE source_md5sum _err)
127   foreach(_lv RANGE 1 20)
128     set(used_tex_file "${result_file_base}.tex")
129     set(result_file_base "${result_file_base}.${LYX_FORMAT_NUM}")
130     set(result_file_name "${result_file_base}.lyx")
131     file(REMOVE "${result_file_name}" "${result_file_name}.emergency" )
132     message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
133     message(STATUS "This implicitly checks load of ${LYX_SOURCE}")
134     execute_process(
135       COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
136       RESULT_VARIABLE _err
137       ERROR_VARIABLE lyxerr)
138     Summary(_err "Converting \"${LYX_SOURCE}\" to format ${format}")
139     if(_err)
140       break()
141     else()
142       if(NOT EXISTS "${result_file_name}")
143         set(_err -1)
144         Summary(_err "Expected result file \"${result_file_name}\" does not exist")
145         break()
146       else()
147         message(STATUS "Expected result file \"${result_file_name}\" exists")
148         execute_process(
149           COMMAND ${PERL_EXECUTABLE} ${Structure_Script} "${result_file_name}"
150           RESULT_VARIABLE _err)
151         Summary(_err "Structure of the intermediate file \"${result_file_name}\"")
152         if(_err)
153           break()
154         endif()
155         checkLoadErrors(lyxerr "${TOP_SRC_DIR}/development/autotests" _err)
156         Summary(_err "Examination of error/warning messages of the conversion of \"${LYX_SOURCE}\" to format ${format}")
157         if(_err)
158           break()
159         endif()
160         message(STATUS "Create the corresponding .tex file \"${used_tex_file}\"")
161         execute_process(
162           COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E pdflatex ${used_tex_file} "${LYX_SOURCE}"
163           RESULT_VARIABLE _errx)
164       endif()
165     endif()
166     get_md5sum(result_file_name result_md5sum _err)
167     Summary(_err "Getting md5sum of \"${result_file_name}\"")
168     if(_err)
169       # Somehow the created file is not readable?
170       break()
171     endif()
172     # Check if result file identical to source file
173     if(result_md5sum STREQUAL ${source_md5sum})
174       if (format MATCHES "lyx(1[0-9]|2[01])x")
175         # Do not compile, missing \origin statement prevents inclusion of
176         # files with relative path
177         message(STATUS "Not exporting due to missing \\origin statement")
178         break()
179       elseif(format MATCHES "lyx22x" AND file MATCHES "Minted")
180         message(STATUS "Not exporting due to missing minted support")
181         break()
182       endif()
183       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are equal")
184       message(STATUS "Now try to export the lyx2lyx created file")
185       message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E default \"${result_file_name}.default\" \"${result_file_name}\"")
186       execute_process(
187         COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E default "${result_file_name}.default" "${result_file_name}"
188         RESULT_VARIABLE _err
189         ERROR_VARIABLE lyxerr)
190       Summary(_err "Test-compilation of \"${result_file_name}\" to format default")
191       break()
192     else()
193       list(APPEND _TestResultMessage "Warning: \"${LYX_SOURCE}\" and \"${result_file_name}\" differ")
194       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are still different")
195       if (_lv GREATER 10)
196         set(_err 1)
197         message(STATUS "Possible endless loop encountered")
198         Summary(_err "Test-Loop exceeded the count of 10, Possible endless loop")
199         break()
200       endif()
201     endif()
202     set(source_md5sum ${result_md5sum})
203     set(LYX_SOURCE ${result_file_name})
204   endforeach()
205 else()
206   if ($ENV{LYX_DEBUG_LATEX})
207     set(LyXExtraParams -dbg latex)
208   else()
209     set(LyXExtraParams -dbg info)
210   endif()
211   if(IgnoreErrorMessage)
212     foreach (_em ${IgnoreErrorMessage})
213       list(APPEND LyXExtraParams --ignore-error-message ${_em})
214     endforeach()
215   endif()
216   string(REGEX REPLACE ";" " " _LyXExtraParams "${LyXExtraParams}")
217   message(STATUS "Executing ${lyx} ${_LyXExtraParams} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
218   file(REMOVE ${result_file_name})
219   execute_process(
220     COMMAND ${lyx} ${LyXExtraParams} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
221     RESULT_VARIABLE _err)
222   Summary(_err "Exporting \"${LYX_SOURCE}\" to format ${format}")
223   if (NOT _err)
224     #check if result file created
225     if (NOT EXISTS "${result_file_name}")
226       message(STATUS "Expected result file \"${result_file_name}\" does not exist")
227       set(_err -1)
228       Summary(_err "Expected result file \"${result_file_name}\" does not exists")
229     else()
230       message(STATUS "Expected result file \"${result_file_name}\" exists")
231       if (extension MATCHES "^x(ht)?ml$")
232         if (format MATCHES "xhtml")
233           set(xmllint_params --sax --html --valid)
234           set(executable_ ${XMLLINT_EXECUTABLE})
235         else()
236           set(xmllint_params)
237           set(executable_ ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/filterXml4Sax.pl")
238           # Check with perl xml-parser
239           # needs XML::Parser module
240           message(STATUS "Calling ${PERL_EXECUTABLE} \"${TOP_SRC_DIR}/development/autotests/xmlParser.pl\" \"${result_file_name}\"")
241           execute_process(
242             COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/xmlParser.pl" "${result_file_name}"
243             OUTPUT_VARIABLE parserout
244             ERROR_VARIABLE parsererr
245             RESULT_VARIABLE _err
246           )
247           if (_err)
248             message(STATUS "${parsererr}")
249           endif()
250           Summary(_err "Checking \"${result_file_name}\" with xmlParser.pl")
251         endif()
252         if (XMLLINT_EXECUTABLE)
253           message(STATUS "Calling: " ${executable_} ${xmllint_params} " ${result_file_name}")
254           # check the created xhtml file
255           execute_process(
256             COMMAND ${executable_} ${xmllint_params}  "${result_file_name}"
257             OUTPUT_VARIABLE xmlout
258             ERROR_VARIABLE xmlerr
259             RESULT_VARIABLE _err)
260           file(WRITE "${result_file_name}.sax_out" ${xmlout})
261           Summary(_err "Checking \"${result_file_name}\" with ${XMLLINT_EXECUTABLE}")
262           if (NOT _err)
263             # check if sax-parser output contains error messages
264             message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
265             execute_process(
266               COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl" "${result_file_name}.sax_out"
267               OUTPUT_VARIABLE xmlout
268               RESULT_VARIABLE _err)
269             Summary(_err "Parse messages of ${XMLLINT_EXECUTABLE} for errors")
270           endif()
271           if (NOT _err)
272             if (NOT "${xmlout}" STREQUAL "")
273               message(STATUS "${xmlout}")
274               set(_err -1)
275               Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
276             endif()
277           endif()
278         endif()
279       endif()
280     endif()
281   endif()
282 endif()
283
284 if(inverted)
285   string(COMPARE EQUAL  ${_err} 0 _erg)
286 else()
287   string(COMPARE NOTEQUAL  ${_err} 0 _erg)
288 endif()
289 execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
290 if(_TestResultMessage)
291   message(STATUS "Msg Summary:")
292   foreach(_l ${_TestResultMessage})
293     message(STATUS "\t${_l}")
294   endforeach()
295 endif()
296 if(_erg)
297   message(STATUS "Exporting ${file}.lyx to ${format}")
298   message(FATAL_ERROR "Export failed")
299 endif()