]> git.lyx.org Git - lyx.git/blob - development/autotests/export.cmake
FindAdv: next 3 tests working
[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
11 # extension = 16.lyx|20.lyx|21.lyx|22.lyx|xhtml
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 if(format MATCHES "dvi|pdf")
52   message(STATUS "LYX_TESTS_USERDIR = ${LYX_TESTS_USERDIR}")
53   message(STATUS "Converting with perl ${Perl_Script}")
54   set(LYX_SOURCE "${TempDir}/${file}_${format}_${_ft}${_enc}.lyx")
55   message(STATUS "Using source \"${LYX_ROOT}/${file}.lyx\"")
56   message(STATUS "Using dest \"${LYX_SOURCE}\"")
57   if(NOT "${ENCODING}" STREQUAL "default")
58     # message(STATUS "ENCODING = ${ENCODING}")
59   endif()
60   message(STATUS "Executing ${PERL_EXECUTABLE} \"${Perl_Script}\" \"${LYX_ROOT}/${file}.lyx\" \"${LYX_SOURCE}\" ${format} ${_ft} ${ENCODING} ${LanguageFile}")
61   execute_process(COMMAND ${PERL_EXECUTABLE} "${Perl_Script}" "${LYX_ROOT}/${file}.lyx" "${LYX_SOURCE}" ${format} ${_ft} ${ENCODING} ${LanguageFile}
62     RESULT_VARIABLE _err)
63   string(COMPARE EQUAL  ${_err} 0 _erg)
64   if(NOT _erg)
65     message(FATAL_ERROR "Export failed while converting")
66   endif()
67   set(result_file_name ${file}_${_ft}.${extension})
68 else()
69   message(STATUS "Converting with perl ${Perl_Script}")
70   set(LYX_SOURCE "${TempDir}/${file}.lyx")
71   message(STATUS "Using source \"${LYX_ROOT}/${file}.lyx\"")
72   message(STATUS "Using dest \"${LYX_SOURCE}\"")
73   execute_process(COMMAND ${PERL_EXECUTABLE} "${Perl_Script}" "${LYX_ROOT}/${file}.lyx" "${LYX_SOURCE}" ${format} "dontChange" "default" ${LanguageFile}
74     RESULT_VARIABLE _err)
75   string(COMPARE EQUAL  ${_err} 0 _erg)
76   if(NOT _erg)
77     message(FATAL_ERROR "Export failed while converting")
78     endif()
79   if(extension MATCHES "\\.lyx$")
80     # Font-type not relevant for lyx16/lyx2[0123] exports
81     set(result_file_base "${TempDir}/${file}")
82   else()
83     set(result_file_name ${file}.${extension})
84   endif()
85 endif()
86
87 function(get_md5sum msource mresult mreserr)
88   execute_process(
89     COMMAND ${CMAKE_COMMAND} -E md5sum ${${msource}}
90     OUTPUT_VARIABLE msource_md5sum_x
91     RESULT_VARIABLE mres_err)
92   if (NOT mres_err)
93     string(REGEX REPLACE " .*" "" msource_md5sum ${msource_md5sum_x})
94     set(${mresult} ${msource_md5sum} PARENT_SCOPE)
95     message(STATUS "MD5SUM of \"${${msource}}\" is ${msource_md5sum}")
96   else()
97     set(${mresult} "xx" PARENT_SCOPE)
98     message(STATUS "Error getting MD5SUM of \"${${msource}}\"")
99   endif()
100   set(${mreserr} ${mres_err} PARENT_SCOPE)
101 endfunction()
102
103 macro(Summary _err _msg)
104   if (${_err})
105     list(APPEND _TestResultMessage "Error: ${_msg}")
106   else()
107     list(APPEND _TestResultMessage "OK: ${_msg}")
108   endif()
109 endmacro()
110
111 set(ENV{${LYX_USERDIR_VER}} "${LYX_TESTS_USERDIR}")
112 set(ENV{LANG} "en_US.UTF-8") # to get all error-messages in english
113 set(ENV{LANGUAGE} "US:en")
114 #set(ENV{LC_ALL} "C")
115 if (extension MATCHES "\\.lyx$")
116   include(${TOP_SRC_DIR}/development/autotests/CheckLoadErrors.cmake)
117   get_md5sum(LYX_SOURCE source_md5sum _err)
118   foreach(_lv RANGE 1 20)
119     set(used_tex_file "${result_file_base}.tex")
120     set(result_file_base "${result_file_base}.${LYX_FORMAT_NUM}")
121     set(result_file_name "${result_file_base}.lyx")
122     file(REMOVE "${result_file_name}" "${result_file_name}.emergency" )
123     message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
124     message(STATUS "This implicitly checks load of ${LYX_SOURCE}")
125     execute_process(
126       COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
127       RESULT_VARIABLE _err
128       ERROR_VARIABLE lyxerr)
129     Summary(_err "Converting \"${LYX_SOURCE}\" to format ${format}")
130     if(_err)
131       break()
132     else()
133       if(NOT EXISTS "${result_file_name}")
134         set(_err -1)
135         Summary(_err "Expected result file \"${result_file_name}\" does not exist")
136         break()
137       else()
138         message(STATUS "Expected result file \"${result_file_name}\" exists")
139         execute_process(
140           COMMAND ${PERL_EXECUTABLE} ${Structure_Script} "${result_file_name}"
141           RESULT_VARIABLE _err)
142         Summary(_err "Structure of the intermediate file \"${result_file_name}\"")
143         if(_err)
144           break()
145         endif()
146         checkLoadErrors(lyxerr "${TOP_SRC_DIR}/development/autotests" _err)
147         Summary(_err "Examination of error/warning messages of the conversion of \"${LYX_SOURCE}\" to format ${format}")
148         if(_err)
149           break()
150         endif()
151         message(STATUS "Create the corresponding .tex file \"${used_tex_file}\"")
152         execute_process(
153           COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E pdflatex ${used_tex_file} "${LYX_SOURCE}"
154           RESULT_VARIABLE _errx)
155       endif()
156     endif()
157     get_md5sum(result_file_name result_md5sum _err)
158     Summary(_err "Getting md5sum of \"${result_file_name}\"")
159     if(_err)
160       # Somehow the created file is not readable?
161       break()
162     endif()
163     # Check if result file identical to source file
164     if(result_md5sum STREQUAL ${source_md5sum})
165       if (format MATCHES "lyx(1[0-9]|2[01])x")
166         # Do not compile, missing \origin statement prevents inclusion of
167         # files with relative path
168         message(STATUS "Not exporting due to missing \\origin statement")
169         break()
170       elseif(format MATCHES "lyx22x" AND file MATCHES "Minted")
171         message(STATUS "Not exporting due to missing minted support")
172         break()
173       endif()
174       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are equal")
175       message(STATUS "Now try to export the lyx2lyx created file")
176       message(STATUS "Executing ${lyx} -userdir \"${LYX_TESTS_USERDIR}\" -E default \"${result_file_name}.default\" \"${result_file_name}\"")
177       execute_process(
178         COMMAND ${lyx} -userdir "${LYX_TESTS_USERDIR}" -E default "${result_file_name}.default" "${result_file_name}"
179         RESULT_VARIABLE _err
180         ERROR_VARIABLE lyxerr)
181       Summary(_err "Test-compilation of \"${result_file_name}\" to format default")
182       break()
183     else()
184       list(APPEND _TestResultMessage "Warning: \"${LYX_SOURCE}\" and \"${result_file_name}\" differ")
185       message(STATUS "Source(${LYX_SOURCE}) and dest(${result_file_name}) are still different")
186       if (_lv GREATER 10)
187         set(_err 1)
188         message(STATUS "Possible endless loop encountered")
189         Summary(_err "Test-Loop exceeded the count of 10, Possible endless loop")
190         break()
191       endif()
192     endif()
193     set(source_md5sum ${result_md5sum})
194     set(LYX_SOURCE ${result_file_name})
195   endforeach()
196 else()
197   if ($ENV{LYX_DEBUG_LATEX})
198     set(LyXExtraParams -dbg latex)
199   else()
200     set(LyXExtraParams)
201   endif()
202   if(IgnoreErrorMessage)
203     foreach (_em ${IgnoreErrorMessage})
204       list(APPEND LyXExtraParams --ignore-error-message ${_em})
205     endforeach()
206   endif()
207   string(REGEX REPLACE ";" " " _LyXExtraParams "${LyXExtraParams}")
208   message(STATUS "Executing ${lyx} ${_LyXExtraParams} -userdir \"${LYX_TESTS_USERDIR}\" -E ${format} ${result_file_name} \"${LYX_SOURCE}\"")
209   file(REMOVE ${result_file_name})
210   execute_process(
211     COMMAND ${lyx} ${LyXExtraParams} -userdir "${LYX_TESTS_USERDIR}" -E ${format} ${result_file_name} "${LYX_SOURCE}"
212     RESULT_VARIABLE _err)
213   Summary(_err "Exporting \"${LYX_SOURCE}\" to format ${format}")
214   if (NOT _err)
215     #check if result file created
216     if (NOT EXISTS "${result_file_name}")
217       message(STATUS "Expected result file \"${result_file_name}\" does not exist")
218       set(_err -1)
219       Summary(_err "Expected result file \"${result_file_name}\" does not exists")
220     else()
221       message(STATUS "Expected result file \"${result_file_name}\" exists")
222       if (format MATCHES "xhtml")
223         if (XMLLINT_EXECUTABLE)
224           message(STATUS "Calling: ${XMLLINT_EXECUTABLE} --sax --html --valid")
225           # check the created xhtml file
226           execute_process(
227             COMMAND ${XMLLINT_EXECUTABLE} --sax --html --valid  "${result_file_name}"
228             OUTPUT_VARIABLE xmlout
229             ERROR_VARIABLE xmlerr
230             RESULT_VARIABLE _err)
231           file(WRITE "${result_file_name}.sax_out" ${xmlout})
232           Summary(_err "Checking \"${result_file_name}\" with ${XMLLINT_EXECUTABLE}")
233           if (NOT _err)
234             # check if sax-parser output contains error messages
235             message(STATUS "Check the output: ${PERL_EXECUTABLE} ${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl")
236             execute_process(
237               COMMAND ${PERL_EXECUTABLE} "${TOP_SRC_DIR}/development/autotests/examineXmllintOutput.pl" "${result_file_name}.sax_out"
238               OUTPUT_VARIABLE xmlout
239               RESULT_VARIABLE _err)
240             Summary(_err "Parse messages of ${XMLLINT_EXECUTABLE} for errors")
241           endif()
242           if (NOT _err)
243             if (NOT "${xmlout}" STREQUAL "")
244               message(STATUS "${xmlout}")
245               set(_err -1)
246               Summary(_err "Non empty output of \"${XMLLINT_EXECUTABLE}\"")
247             endif()
248           endif()
249         endif()
250       endif()
251     endif()
252   endif()
253 endif()
254
255 if(inverted)
256   string(COMPARE EQUAL  ${_err} 0 _erg)
257 else()
258   string(COMPARE NOTEQUAL  ${_err} 0 _erg)
259 endif()
260 execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${TempDir}")
261 if(_TestResultMessage)
262   message(STATUS "Msg Summary:")
263   foreach(_l ${_TestResultMessage})
264     message(STATUS "\t${_l}")
265   endforeach()
266 endif()
267 if(_erg)
268   message(STATUS "Exporting ${file}.lyx to ${format}")
269   message(FATAL_ERROR "Export failed")
270 endif()