]> git.lyx.org Git - features.git/blob - development/autotests/ExportTests.cmake
Cmake export tests: Handle default output format 'pdf2' in manuals like 'default'
[features.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 set(potential_languages "ca" "cs" "da" "de" "el" "es" "eu" "fa" "fr" "gl" "he" "hu" "id" "it" "ja" "ko" "nb" "nl" "pl" "pt" "ro" "ru" "sk" "sl" "sr" "sv" "uk" "zh_CN")
40
41 macro(initLangVars varname)
42   foreach(_l ${potential_languages})
43     set(${varname}_${_l})
44   endforeach()
45 endmacro()
46
47 macro(getoutputformats filepath varname)
48   file(STRINGS "${filepath}" lines)
49   # What should we test, if default_output_format is not defined?
50   # For now we test everything ...
51   set(out_formats "xhtml" ${DVI_FORMATS} ${PDF_FORMATS})
52   foreach(_l ${lines})
53     if(_l MATCHES "^\\\\default_output_format +\([^ ]+\)")
54       set(_format ${CMAKE_MATCH_1})
55       if(_format STREQUAL "default")
56         set(out_formats "xhtml" ${DVI_FORMATS} ${PDF_FORMATS})
57       elseif(_format STREQUAL "pdf2" AND "${filepath}" MATCHES "/doc/")
58         set(out_formats "xhtml" ${DVI_FORMATS} ${PDF_FORMATS})
59       elseif(_format MATCHES "pdf$")
60         set(out_formats "xhtml" ${PDF_FORMATS})
61       elseif(_format MATCHES "dvi$")
62         set(out_formats "xhtml" ${DVI_FORMATS})
63       elseif(_format MATCHES "xhtml")
64         set(out_formats "xhtml")
65       else()
66         # Respect all other output formats
67         # like "eps3"
68         set(out_formats "xhtml" ${_format})
69       endif()
70       break()
71     endif()
72   endforeach()
73   set(${varname} ${out_formats})
74 endmacro()
75
76 macro(findexpr found testname listname rsublabel)
77   set(_found 0)
78   set(tmpsublabel "")
79   foreach(_itrx ${${listname}})
80     if ("${_itrx}" MATCHES "^Sublabel:")
81       set(tmpsublabel "")
82       string(REGEX REPLACE "^Sublabel:[ \t]*" "" _itrlabels ${_itrx})
83       string(REGEX MATCHALL "[a-zA-Z]+" _labels ${_itrlabels})
84       foreach(subl ${_labels})
85         if (subl STREQUAL "RESET")
86           set(tmpsublabel "")
87         else()
88           list(APPEND tmpsublabel ${subl})
89         endif()
90       endforeach()
91       # remove doubles in sublabel
92       list(REMOVE_DUPLICATES tmpsublabel)
93     else()
94       set(_itr "^${_itrx}$")
95       if (${testname} MATCHES "${_itr}")
96         set(_found 1)
97         break()
98       endif()
99     endif()
100   endforeach()
101   if (${_found})
102     if (NOT "${tmpsublabel}" STREQUAL "")
103       list(APPEND ${rsublabel} ${tmpsublabel})
104     endif()
105   endif()
106   set(${found} ${_found})
107 endmacro()
108
109 function(join rvalues glue routput)
110   set(locallist ${${rvalues}})
111   list(REMOVE_ITEM locallist "export" "lyx2lyx" "load")
112   string(REGEX REPLACE "([^\\]|^);" "\\1${glue}" out "${locallist}")
113   set(${routput} ${out} PARENT_SCOPE)
114 endfunction()
115
116 macro(maketestname testname inverted listsuspicious listignored listunreliable listlabels)
117   string(REGEX MATCH "\\/[a-z][a-z](_[A-Z][A-Z])?\\/" _v ${${testname}})
118   if(_v)
119     string(REGEX REPLACE "\\/" "" _v ${_v})
120     set(listsuspiciousx ${listsuspicious}_${_v})
121     set(listignoredx ${listignored}_${_v})
122     set(listunreliablex ${listunreliable}_${_v})
123     set(listsuspendedx suspendedTests_${_v})
124   else()
125     set(listsuspiciousx ${listsuspicious})
126     set(listignoredx ${listignored})
127     set(listunreliablex ${listunreliable})
128     set(listsuspendedx suspendedTests)
129   endif()
130   set(sublabel "${${listlabels}}")
131   findexpr(mfound ${testname} ${listignoredx} sublabel)
132   if (NOT mfound)
133     set(sublabel2 "")
134     findexpr(foundunreliable ${testname} ${listunreliablex} sublabel2)
135     if (foundunreliable)
136       set(sublabel "unreliable" ${sublabel} ${sublabel2})
137       list(REMOVE_ITEM sublabel "export" "inverted" "templates" "mathmacros" "manuals" "autotests")
138     else()
139       string(REGEX MATCH "_(systemF|texF|pdf3|pdf2|pdf|dvi|lyx16|xhtml)$" _v ${${testname}})
140       # check if test _may_ be in listsuspicious
141       set(sublabel2 "")
142       if (_v)
143         findexpr(mfound ${testname} ${listsuspiciousx} sublabel2)
144       else()
145         set(mfound OFF)
146       endif()
147       if (mfound)
148         set(sublabel3 "")
149         findexpr(foundsuspended ${testname} ${listsuspendedx} sublabel3)
150         set(${inverted} 1)
151         if (foundsuspended)
152           set(sublabel "suspended" ${sublabel} ${sublabel2} ${sublabel3})
153           list(REMOVE_ITEM sublabel "export" "inverted" )
154         else()
155           set(sublabel "inverted" ${sublabel} ${sublabel2} ${sublabel3})
156         endif()
157       else()
158         set(${inverted} 0)
159       endif()
160     endif()
161     list(REMOVE_DUPLICATES sublabel)
162     if (NOT sublabel STREQUAL "")
163       join(sublabel "." tmpprefixx)
164       string(TOUPPER "${tmpprefixx}_" tmpprefix)
165       set(${testname} "${tmpprefix}${${testname}}")
166       set(${listlabels} ${sublabel})
167     endif()
168   else()
169     # No testname because ignored
170     set(${testname} "")
171   endif()
172 endmacro()
173
174 macro(loadTestList filename resList depth)
175   # Create list of strings from a file without comments
176   # ENCODING parameter is a new feature in cmake 3.1
177   initLangVars(${resList})
178   initLangVars("sublabel")
179   if (CMAKE_VERSION VERSION_GREATER "3.1")
180     file(STRINGS ${filename} tempList ENCODING "UTF-8")
181   else()
182     file(STRINGS ${filename} tempList)
183   endif()
184   set(${resList})
185   set(sublabel)
186   set(mylabels "")
187   set(languages "")
188   message(STATUS "Reading list ${filename}")
189   foreach(_l ${tempList})
190     set(_newl "${_l}")
191     string(REGEX REPLACE "[ \t]+$" "" _newl "${_l}")
192     string(REGEX REPLACE "[ \t]*#.*$" "" _newl "${_l}")
193     if(_newl)
194       list(APPEND ${resList} "${_newl}")
195       if (_newl MATCHES "^Sublabel:")
196         string(REGEX REPLACE "^Sublabel:[ \t]*" "" _newlabels ${_newl})
197         string(REGEX MATCHALL "([0-9]*[a-zA-Z]+)" _labels ${_newlabels})
198         foreach(labname ${_labels})
199           if (NOT labname STREQUAL "RESET")
200             list(APPEND mylabels ${labname})
201           endif()
202         endforeach()
203         list(REMOVE_DUPLICATES mylabels)
204         set(sublabel ${_newl})
205       else()
206         string(REGEX REPLACE "(\\/|\\||\\(|\\))" "  " _vxx ${_newl})
207         string(REGEX MATCHALL " ([a-z][a-z](_[A-Z][A-Z])?) " _vx ${_vxx})
208         if(_vx)
209           foreach(_v ${_vx})
210             string(REGEX REPLACE " " "" _v ${_v})
211             #message(STATUS " ==> ${resList}_${_v}")
212             #message(STATUS "sublabel = ${sublabel}, sublabel_${_v} = ${sublabel_${_v}}")
213             if (NOT sublabel STREQUAL "${sublabel_${_v}}")
214               list(APPEND ${resList}_${_v} "${sublabel}")
215               set(sublabel_${_v} "${sublabel}")
216               #message(STATUS "Setting variable sublabel_${_v} with \"${sublabel}\"")
217             endif()
218             list(APPEND ${resList}_${_v} "${_newl}")
219             list(APPEND languages ${_v})
220           endforeach()
221           list(REMOVE_DUPLICATES languages)
222           #message(STATUS "languages = ${languages}")
223         endif()
224       endif()
225     endif()
226   endforeach()
227   foreach(_l1 ${mylabels})
228     if (_l1 MATCHES "^([0-9]+)([a-zA-Z]+)$")
229       set(_l ${CMAKE_MATCH_2})
230       set(depth1 ${CMAKE_MATCH_1})
231     else()
232       set(_l ${_l1})
233       set(depth1 "0")
234     endif()
235     list(FIND known_labels ${_l} _ff)
236     if (_ff GREATER -1)
237       message(STATUS "Label \"${_l}\" already in use. Reused in ${filename}")
238     else()
239       assignLabelDepth(${depth}${depth1} ${_l})
240     endif()
241   endforeach()
242   foreach(_lg ${languages})
243     # reset label for each used language string at end of file
244     #message(STATUS "Resetting variable sublabel_${_lg}, previously set to ${sublabel_${_lg}}")
245     set(sublabel_${_lg} "")
246   endforeach()
247 endmacro()
248
249 # This labels should not be used in .*Tests files
250 set(known_labels "")
251 # Create depth info to each label
252 macro(assignLabelDepth depth)
253   foreach(_lab ${ARGN})
254     list(APPEND known_labels ${_lab})
255     set(depth_${_lab} ${depth})
256   endforeach()
257 endmacro()
258
259 assignLabelDepth(0 "export" "key" "layout" "load" "lyx2lyx" "module" "roundtrip" "url")
260 assignLabelDepth(1 "unreliable" "inverted")
261 assignLabelDepth(2 "suspended")
262 assignLabelDepth(3 "examples" "manuals" "mathmacros" "templates" "autotests")
263
264 loadTestList(suspiciousTests suspiciousTests 7)
265 loadTestList(ignoredTests ignoredTests 0)
266 loadTestList(suspendedTests suspendedTests 6)
267 loadTestList(unreliableTests unreliableTests 5)
268
269 # preparing to add e.g. development/mathmacros to the foreach() loop
270 foreach(libsubfolderx autotests/export lib/doc lib/examples lib/templates development/mathmacros)
271   set(testlabel "export")
272   if (libsubfolderx MATCHES "lib/doc")
273     list(APPEND testlabel "manuals")
274   elseif (libsubfolderx MATCHES "lib/examples")
275     list(APPEND testlabel "examples")
276   elseif (libsubfolderx MATCHES "lib/templates")
277     list(APPEND testlabel "templates")
278   elseif (libsubfolderx MATCHES "development/mathmacros")
279     list(APPEND testlabel "mathmacros")
280   elseif (libsubfolderx MATCHES "autotests/.+")
281     list(APPEND testlabel "autotests")
282   endif()
283   set(LIBSUB_SRC_DIR "${TOP_SRC_DIR}/${libsubfolderx}")
284   string(REGEX REPLACE "^(lib|development|autotests)/" "" libsubfolder "${libsubfolderx}")
285   set(LIBSUB_SRC_DIR "${TOP_SRC_DIR}/${libsubfolderx}")
286   message(STATUS "Handling export dir ${LIBSUB_SRC_DIR}")
287   file(GLOB_RECURSE lyx_files RELATIVE "${LIBSUB_SRC_DIR}" "${LIBSUB_SRC_DIR}/*.lyx")
288   list(SORT lyx_files)
289   # Now create 2 lists. One for files in a language dir, one without
290   set(lang_lyx_files)
291   set(nolang_lyx_files)
292   foreach(f ${lyx_files})
293     string(REGEX MATCHALL "^[a-z][a-z](_[A-Z][A-Z])?\\/" _v ${f})
294     if(_v)
295       list(APPEND lang_lyx_files ${f})
296     else()
297       list(APPEND nolang_lyx_files ${f})
298     endif()
299   endforeach()
300   foreach(f ${nolang_lyx_files} ${lang_lyx_files})
301     # Strip extension
302     string(REGEX REPLACE "\\.lyx$" "" f ${f})
303     set(TestName "export/${libsubfolder}/${f}_lyx16")
304     set(mytestlabel ${testlabel})
305     maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
306     if(TestName)
307       add_test(NAME ${TestName}
308         WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
309         COMMAND ${CMAKE_COMMAND} -DLYX_ROOT=${LIBSUB_SRC_DIR}
310         -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
311         -Dlyx=$<TARGET_FILE:${_lyx}>
312         -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
313         -DLYX_USERDIR_VER=${LYX_USERDIR_VER}
314         -Dformat=lyx16x
315         -Dextension=16.lyx
316         -Dfile=${f}
317         -Dinverted=${inverted}
318         -DTOP_SRC_DIR=${TOP_SRC_DIR}
319         -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
320         -P "${TOP_SRC_DIR}/development/autotests/export.cmake")
321       setmarkedtestlabel(${TestName} ${mytestlabel})
322     endif()
323     if(LYX_PYTHON_EXECUTABLE)
324       set(lyx2lyxtestlabel "lyx2lyx")
325       # For use of lyx2lyx we need the python executable
326       set(mytestlabel ${lyx2lyxtestlabel})
327       set(TestName "lyx2lyx/${libsubfolder}/${f}")
328       maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
329       if(TestName)
330         add_test(NAME ${TestName}
331           WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
332           COMMAND ${CMAKE_COMMAND}
333           "-DLYX_PYTHON_EXECUTABLE=${LYX_PYTHON_EXECUTABLE}"
334           "-DLYX2LYX=${TOP_SRC_DIR}/lib/lyx2lyx/lyx2lyx"
335           "-DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}"
336           "-DLYXFILE=${LIBSUB_SRC_DIR}/${f}.lyx"
337           -P "${TOP_SRC_DIR}/development/autotests/lyx2lyxtest.cmake")
338         setmarkedtestlabel(${TestName} ${mytestlabel})
339       endif()
340     endif()
341     set(loadtestlabel "load")
342     set(mytestlabel ${loadtestlabel})
343     set(TestName "check_load/${libsubfolder}/${f}")
344     maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
345     if(TestName)
346       add_test(NAME ${TestName}
347         WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
348         COMMAND ${CMAKE_COMMAND} -DLYXFILE=${LIBSUB_SRC_DIR}/${f}.lyx
349         -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
350         -Dlyx=$<TARGET_FILE:${_lyx}>
351         -DPARAMS_DIR=${TOP_SRC_DIR}/development/autotests
352         -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
353         -P "${TOP_SRC_DIR}/development/autotests/check_load.cmake")
354       setmarkedtestlabel(${TestName} ${mytestlabel})
355       set_tests_properties(${TestName} PROPERTIES RUN_SERIAL ON)
356     endif()
357     getoutputformats("${LIBSUB_SRC_DIR}/${f}.lyx" formatlist)
358     foreach(format ${formatlist})
359       if(format MATCHES "dvi3|pdf4|pdf5")
360         set(fonttypes "texF" "systemF")
361       else()
362         set(fonttypes "defaultF")
363       endif()
364       foreach(fonttype ${fonttypes})
365         if(fonttype MATCHES "defaultF")
366           set(TestName "export/${libsubfolder}/${f}_${format}")
367         else()
368           set(TestName "export/${libsubfolder}/${f}_${format}_${fonttype}")
369         endif()
370         set(mytestlabel ${testlabel})
371         maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
372         if(TestName)
373           add_test(NAME ${TestName}
374             WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
375             COMMAND ${CMAKE_COMMAND} -DLYX_ROOT=${LIBSUB_SRC_DIR}
376             -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
377             -Dlyx=$<TARGET_FILE:${_lyx}>
378             -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
379             -Dformat=${format}
380             -Dfonttype=${fonttype}
381             -Dextension=${format}
382             -Dfile=${f}
383             -Dinverted=${inverted}
384             -DTOP_SRC_DIR=${TOP_SRC_DIR}
385             -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
386             -P "${TOP_SRC_DIR}/development/autotests/export.cmake")
387           setmarkedtestlabel(${TestName} ${mytestlabel}) # check for suspended pdf/dvi exports
388         endif()
389       endforeach()
390     endforeach()
391   endforeach()
392 endforeach()