]> git.lyx.org Git - lyx.git/blob - development/autotests/ExportTests.cmake
Cmake export tests: Some tests previously inverted pass now.
[lyx.git] / development / autotests / ExportTests.cmake
1 #
2 #  Copyright (c) 2014 Kornel Benko <kornel@lyx.org>
3 #  Copyright (c) 2014 Scott Kostyshak <skotysh@lyx.org>
4 #
5 #  Redistribution and use in source and binary forms, with or without
6 #  modification, are permitted provided that the following conditions
7 #  are met:
8 #
9 #  1. Redistributions of source code must retain the copyright
10 #         notice, this list of conditions and the following disclaimer.
11 #  2. Redistributions in binary form must reproduce the copyright
12 #         notice, this list of conditions and the following disclaimer in the
13 #         documentation and/or other materials provided with the distribution.
14 #  3. The name of the author may not be used to endorse or promote products
15 #         derived from this software without specific prior written permission.
16 #
17 #  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 #  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 #  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 #  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 #  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 #  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 #  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 #  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 #  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 #  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #
28
29 find_package(Perl)
30
31 if(PERL_FOUND)
32   set(DVI_FORMATS "dvi" "dvi3")
33   set(PDF_FORMATS "pdf" "pdf2" "pdf3" "pdf4" "pdf5")
34 else()
35   set(DVI_FORMATS "dvi")
36   set(PDF_FORMATS "pdf" "pdf2" "pdf3")
37 endif()
38
39 macro(getoutputformats filepath varname)
40   file(STRINGS "${filepath}" lines)
41   # What should we test, if default_output_format is not defined?
42   # For now we test everything ...
43   set(out_formats "xhtml" ${DVI_FORMATS} ${PDF_FORMATS})
44   foreach(_l ${lines})
45     if(_l MATCHES "^\\\\default_output_format +\([^ ]+\)")
46       set(_format ${CMAKE_MATCH_1})
47       if(_format STREQUAL "default")
48         set(out_formats "xhtml" ${DVI_FORMATS} ${PDF_FORMATS})
49       elseif(_format MATCHES "pdf$")
50         set(out_formats "xhtml" ${PDF_FORMATS})
51       elseif(_format MATCHES "dvi$")
52         set(out_formats "xhtml" ${DVI_FORMATS})
53       elseif(_format MATCHES "xhtml")
54         set(out_formats "xhtml")
55       else()
56         # Respect all other output formats
57         # like "eps3"
58         set(out_formats "xhtml" ${_format})
59       endif()
60       break()
61     endif()
62   endforeach()
63   set(${varname} ${out_formats})
64 endmacro()
65
66 macro(findexpr found testname listname rsublabel)
67   set(_found 0)
68   set(tmpsublabel "")
69   foreach(_itrx ${${listname}})
70     if ("${_itrx}" MATCHES "^Sublabel:")
71       set(tmpsublabel "")
72       string(REGEX REPLACE "^Sublabel:[ \t]*" "" _itrlabels ${_itrx})
73       string(REGEX MATCHALL "([a-zA-Z]+)" _labels ${_itrlabels})
74       foreach(subl ${_labels})
75         if (subl STREQUAL "RESET")
76           set(tmpsublabel "")
77         else()
78           list(APPEND tmpsublabel ${subl})
79         endif()
80       endforeach()
81       # remove doubles in sublabel
82       list(REMOVE_DUPLICATES tmpsublabel)
83     else()
84       set(_itr "^${_itrx}$")
85       if (${testname} MATCHES "${_itr}")
86         set(_found 1)
87         break()
88       endif()
89     endif()
90   endforeach()
91   if (${_found})
92     if (NOT "${tmpsublabel}" STREQUAL "")
93       list(APPEND ${rsublabel} ${tmpsublabel})
94     endif()
95   endif()
96   set(${found} ${_found})
97 endmacro()
98
99 function(join rvalues glue routput)
100   set(locallist ${${rvalues}})
101   list(REMOVE_ITEM locallist "export" "lyx2lyx" "load")
102   string(REGEX REPLACE "([^\\]|^);" "\\1${glue}" out "${locallist}")
103   set(${routput} ${out} PARENT_SCOPE)
104 endfunction()
105
106 macro(maketestname testname inverted listsuspicious listignored listunreliable listlabels)
107   string(REGEX MATCH "\\/[a-z][a-z](_[A-Z][A-Z])?\\/" _v ${${testname}})
108   if(_v)
109     string(REGEX REPLACE "\\/" "" _v ${_v})
110     set(listsuspiciousx ${listsuspicious}_${_v})
111     set(listignoredx ${listignored}_${_v})
112     set(listunreliablex ${listunreliable}_${_v})
113     set(listsuspendedx suspendedTests_${v})
114   else()
115     set(listsuspiciousx ${listsuspicious})
116     set(listignoredx ${listignored})
117     set(listunreliablex ${listunreliable})
118     set(listsuspendedx suspendedTests)
119   endif()
120   set(sublabel "${${listlabels}}")
121   findexpr(mfound ${testname} ${listignoredx} sublabel)
122   if (NOT mfound)
123     set(sublabel2 "")
124     findexpr(foundunreliable ${testname} ${listunreliablex} sublabel2)
125     if (foundunreliable)
126       set(sublabel "unreliable" ${sublabel} ${sublabel2})
127       list(REMOVE_ITEM sublabel "export" "inverted" "templates" "mathmacros" "manuals" "autotests")
128     else()
129       string(REGEX MATCH "_(systemF|texF|pdf3|pdf2|pdf|dvi|lyx16|xhtml)$" _v ${${testname}})
130       # check if test _may_ be in listsuspicious
131       set(sublabel2 "")
132       if (_v)
133         findexpr(mfound ${testname} ${listsuspiciousx} sublabel2)
134       else()
135         set(mfound OFF)
136       endif()
137       if (mfound)
138         set(sublabel3 "")
139         findexpr(foundsuspended ${testname} ${listsuspendedx} sublabel3)
140         set(${inverted} 1)
141         if (foundsuspended)
142           set(sublabel "suspended" ${sublabel} ${sublabel2} ${sublabel3})
143           list(REMOVE_ITEM sublabel "export" "inverted" )
144         else()
145           set(sublabel "inverted" ${sublabel} ${sublabel2} ${sublabel3})
146         endif()
147       else()
148         set(${inverted} 0)
149       endif()
150     endif()
151     list(REMOVE_DUPLICATES sublabel)
152     if (NOT sublabel STREQUAL "")
153       join(sublabel "." tmpprefixx)
154       string(TOUPPER "${tmpprefixx}_" tmpprefix)
155       set(${testname} "${tmpprefix}${${testname}}")
156       set(${listlabels} ${sublabel})
157     endif()
158   else()
159     # No testname because ignored
160     set(${testname} "")
161   endif()
162 endmacro()
163
164 macro(loadTestList filename resList depth)
165   # Create list of strings from a file without comments
166   # ENCODING parameter is a new feature in cmake 3.1
167   if (CMAKE_VERSION VERSION_GREATER "3.1")
168     file(STRINGS ${filename} tempList ENCODING "UTF-8")
169   else()
170     file(STRINGS ${filename} tempList)
171   endif()
172   set(${resList})
173   set(sublabel)
174   set(mylabels "")
175   set(languages "")
176   message(STATUS "Reading list ${filename}")
177   foreach(_l ${tempList})
178     set(_newl "${_l}")
179     string(REGEX REPLACE "[ \t]+$" "" _newl "${_l}")
180     string(REGEX REPLACE "[ \t]*#.*$" "" _newl "${_l}")
181     if(_newl)
182       list(APPEND ${resList} "${_newl}")
183       if (_newl MATCHES "^Sublabel:")
184         string(REGEX REPLACE "^Sublabel:[ \t]*" "" _newlabels ${_newl})
185         string(REGEX MATCHALL "([a-zA-Z]+)" _labels ${_newlabels})
186         foreach(labname ${_labels})
187           if (NOT labname STREQUAL "RESET")
188             list(APPEND mylabels ${labname})
189           endif()
190         endforeach()
191         list(REMOVE_DUPLICATES mylabels)
192         set(sublabel ${_newl})
193       else()
194         string(REGEX REPLACE "(\\/|\\||\\(|\\))" "  " _vxx ${_newl})
195         string(REGEX MATCHALL " ([a-z][a-z](_[A-Z][A-Z])?) " _vx ${_vxx})
196         if(_vx)
197           foreach(_v ${_vx})
198             string(REGEX REPLACE " " "" _v ${_v})
199             #message(STATUS " ==> ${resList}_${_v}")
200             #message(STATUS "sublabel = ${sublabel}, sublabel_${_v} = ${sublabel_${_v}}")
201             if (NOT sublabel STREQUAL "${sublabel_${_v}}")
202               list(APPEND ${resList}_${_v} "${sublabel}")
203               set(sublabel_${_v} "${sublabel}")
204               #message(STATUS "Setting variable sublabel_${_v} with \"${sublabel}\"")
205             endif()
206             list(APPEND ${resList}_${_v} "${_newl}")
207             list(APPEND languages ${_v})
208           endforeach()
209           list(REMOVE_DUPLICATES languages)
210           #message(STATUS "languages = ${languages}")
211         endif()
212       endif()
213     endif()
214   endforeach()
215   foreach(_l ${mylabels})
216     list(FIND known_labels ${_l} _ff)
217     if (_ff GREATER -1)
218       message(STATUS "Label \"${_l}\" already in use. Reused in ${filename}")
219     else()
220       assignLabelDepth(${depth} ${_l})
221     endif()
222   endforeach()
223   foreach(_lg ${languages})
224     # reset label for each used language string at end of file
225     #message(STATUS "Resetting variable sublabel_${_lg}, previously set to ${sublabel_${_lg}}")
226     set(sublabel_${_lg} "")
227   endforeach()
228 endmacro()
229
230 # This labels should not be used in .*Tests files
231 set(known_labels "")
232 # Create depth info to each label
233 macro(assignLabelDepth depth)
234   foreach(_lab ${ARGN})
235     list(APPEND known_labels ${_lab})
236     set(depth_${_lab} ${depth})
237   endforeach()
238 endmacro()
239
240 assignLabelDepth(0 "export" "key" "layout" "load" "lyx2lyx" "module" "roundtrip" "url")
241 assignLabelDepth(1 "unreliable" "inverted")
242 assignLabelDepth(2 "suspended")
243 assignLabelDepth(3 "examples" "manuals" "mathmacros" "templates" "autotests")
244
245 loadTestList(suspiciousTests suspiciousTests 7)
246 loadTestList(ignoredTests ignoredTests 0)
247 loadTestList(suspendedTests suspendedTests 6)
248 loadTestList(unreliableTests unreliableTests 5)
249
250 # preparing to add e.g. development/mathmacros to the foreach() loop
251 foreach(libsubfolderx autotests/export lib/doc lib/examples lib/templates development/mathmacros)
252   set(testlabel "export")
253   if (libsubfolderx MATCHES "lib/doc")
254     list(APPEND testlabel "manuals")
255   elseif (libsubfolderx MATCHES "lib/examples")
256     list(APPEND testlabel "examples")
257   elseif (libsubfolderx MATCHES "lib/templates")
258     list(APPEND testlabel "templates")
259   elseif (libsubfolderx MATCHES "development/mathmacros")
260     list(APPEND testlabel "mathmacros")
261   elseif (libsubfolderx MATCHES "autotests/.+")
262     list(APPEND testlabel "autotests")
263   endif()
264   set(LIBSUB_SRC_DIR "${TOP_SRC_DIR}/${libsubfolderx}")
265   string(REGEX REPLACE "^(lib|development|autotests)/" "" libsubfolder "${libsubfolderx}")
266   set(LIBSUB_SRC_DIR "${TOP_SRC_DIR}/${libsubfolderx}")
267   message(STATUS "Handling export dir ${LIBSUB_SRC_DIR}")
268   file(GLOB_RECURSE lyx_files RELATIVE "${LIBSUB_SRC_DIR}" "${LIBSUB_SRC_DIR}/*.lyx")
269   list(SORT lyx_files)
270   # Now create 2 lists. One for files in a language dir, one without
271   set(lang_lyx_files)
272   set(nolang_lyx_files)
273   foreach(f ${lyx_files})
274     string(REGEX MATCHALL "^[a-z][a-z](_[A-Z][A-Z])?\\/" _v ${f})
275     if(_v)
276       list(APPEND lang_lyx_files ${f})
277     else()
278       list(APPEND nolang_lyx_files ${f})
279     endif()
280   endforeach()
281   foreach(f ${nolang_lyx_files} ${lang_lyx_files})
282     # Strip extension
283     string(REGEX REPLACE "\\.lyx$" "" f ${f})
284     set(TestName "export/${libsubfolder}/${f}_lyx16")
285     set(mytestlabel ${testlabel})
286     maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
287     if(TestName)
288       add_test(NAME ${TestName}
289         WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
290         COMMAND ${CMAKE_COMMAND} -DLYX_ROOT=${LIBSUB_SRC_DIR}
291         -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
292         -Dlyx=$<TARGET_FILE:${_lyx}>
293         -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
294         -DLYX_USERDIR_VER=${LYX_USERDIR_VER}
295         -Dformat=lyx16x
296         -Dextension=16.lyx
297         -Dfile=${f}
298         -Dinverted=${inverted}
299         -DTOP_SRC_DIR=${TOP_SRC_DIR}
300         -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
301         -P "${TOP_SRC_DIR}/development/autotests/export.cmake")
302       setmarkedtestlabel(${TestName} ${mytestlabel})
303     endif()
304     if(LYX_PYTHON_EXECUTABLE)
305       set(lyx2lyxtestlabel "lyx2lyx")
306       # For use of lyx2lyx we need the python executable
307       set(mytestlabel ${lyx2lyxtestlabel})
308       set(TestName "lyx2lyx/${libsubfolder}/${f}")
309       maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
310       if(TestName)
311         add_test(NAME ${TestName}
312           WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
313           COMMAND ${CMAKE_COMMAND}
314           "-DLYX_PYTHON_EXECUTABLE=${LYX_PYTHON_EXECUTABLE}"
315           "-DLYX2LYX=${TOP_SRC_DIR}/lib/lyx2lyx/lyx2lyx"
316           "-DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}"
317           "-DLYXFILE=${LIBSUB_SRC_DIR}/${f}.lyx"
318           -P "${TOP_SRC_DIR}/development/autotests/lyx2lyxtest.cmake")
319         setmarkedtestlabel(${TestName} ${mytestlabel})
320       endif()
321     endif()
322     set(loadtestlabel "load")
323     set(mytestlabel ${loadtestlabel})
324     set(TestName "check_load/${libsubfolder}/${f}")
325     maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
326     if(TestName)
327       add_test(NAME ${TestName}
328         WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
329         COMMAND ${CMAKE_COMMAND} -DLYXFILE=${LIBSUB_SRC_DIR}/${f}.lyx
330         -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
331         -Dlyx=$<TARGET_FILE:${_lyx}>
332         -DPARAMS_DIR=${TOP_SRC_DIR}/development/autotests
333         -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
334         -P "${TOP_SRC_DIR}/development/autotests/check_load.cmake")
335       setmarkedtestlabel(${TestName} ${mytestlabel})
336       set_tests_properties(${TestName} PROPERTIES RUN_SERIAL ON)
337     endif()
338     getoutputformats("${LIBSUB_SRC_DIR}/${f}.lyx" formatlist)
339     foreach(format ${formatlist})
340       if(format MATCHES "dvi3|pdf4|pdf5")
341         set(fonttypes "texF" "systemF")
342       else()
343         set(fonttypes "defaultF")
344       endif()
345       foreach(fonttype ${fonttypes})
346         if(fonttype MATCHES "defaultF")
347           set(TestName "export/${libsubfolder}/${f}_${format}")
348         else()
349           set(TestName "export/${libsubfolder}/${f}_${format}_${fonttype}")
350         endif()
351         set(mytestlabel ${testlabel})
352         maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
353         if(TestName)
354           add_test(NAME ${TestName}
355             WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
356             COMMAND ${CMAKE_COMMAND} -DLYX_ROOT=${LIBSUB_SRC_DIR}
357             -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
358             -Dlyx=$<TARGET_FILE:${_lyx}>
359             -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
360             -Dformat=${format}
361             -Dfonttype=${fonttype}
362             -Dextension=${format}
363             -Dfile=${f}
364             -Dinverted=${inverted}
365             -DTOP_SRC_DIR=${TOP_SRC_DIR}
366             -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
367             -P "${TOP_SRC_DIR}/development/autotests/export.cmake")
368           setmarkedtestlabel(${TestName} ${mytestlabel}) # check for suspended pdf/dvi exports
369         endif()
370       endforeach()
371     endforeach()
372   endforeach()
373 endforeach()