2 # Copyright (c) 2014 Kornel Benko <kornel@lyx.org>
3 # Copyright (c) 2014 Scott Kostyshak <skotysh@lyx.org>
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
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.
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.
32 set(DVI_FORMATS "dvi" "dvi3")
33 set(PDF_FORMATS "pdf" "pdf2" "pdf3" "pdf4" "pdf5")
35 set(DVI_FORMATS "dvi")
36 set(PDF_FORMATS "pdf" "pdf2" "pdf3")
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")
41 macro(initLangVars varname)
42 foreach(_l ${potential_languages})
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})
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")
66 # Respect all other output formats
68 set(out_formats "xhtml" ${_format})
73 set(${varname} ${out_formats})
76 macro(findexpr found testname listname rsublabel)
79 foreach(_itrx ${${listname}})
80 if ("${_itrx}" MATCHES "^Sublabel:")
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")
88 list(APPEND tmpsublabel ${subl})
91 # remove doubles in sublabel
92 list(REMOVE_DUPLICATES tmpsublabel)
94 set(_itr "^${_itrx}$")
95 if (${testname} MATCHES "${_itr}")
102 if (NOT "${tmpsublabel}" STREQUAL "")
103 list(APPEND ${rsublabel} ${tmpsublabel})
106 set(${found} ${_found})
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)
116 macro(maketestname testname inverted listsuspicious listignored listunreliable listlabels)
117 string(REGEX MATCH "\\/[a-z][a-z](_[A-Z][A-Z])?\\/" _v ${${testname}})
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})
125 set(listsuspiciousx ${listsuspicious})
126 set(listignoredx ${listignored})
127 set(listunreliablex ${listunreliable})
128 set(listsuspendedx suspendedTests)
130 set(sublabel "${${listlabels}}")
131 findexpr(mfound ${testname} ${listignoredx} sublabel)
134 findexpr(foundunreliable ${testname} ${listunreliablex} sublabel2)
136 set(sublabel "unreliable" ${sublabel} ${sublabel2})
137 list(REMOVE_ITEM sublabel "export" "inverted" "templates" "mathmacros" "manuals" "autotests")
139 string(REGEX MATCH "_(systemF|texF|pdf3|pdf2|pdf|dvi|lyx16|xhtml)$" _v ${${testname}})
140 # check if test _may_ be in listsuspicious
143 findexpr(mfound ${testname} ${listsuspiciousx} sublabel2)
149 findexpr(foundsuspended ${testname} ${listsuspendedx} sublabel3)
152 set(sublabel "suspended" ${sublabel} ${sublabel2} ${sublabel3})
153 list(REMOVE_ITEM sublabel "export" "inverted" )
155 set(sublabel "inverted" ${sublabel} ${sublabel2} ${sublabel3})
161 list(REMOVE_DUPLICATES sublabel)
162 if (NOT sublabel STREQUAL "")
163 join(sublabel "." tmpprefixx)
165 string(TOUPPER "${tmpprefixx}_" tmpprefix)
169 set(${testname} "${tmpprefix}${${testname}}")
170 set(${listlabels} ${sublabel})
173 # No testname because ignored
178 macro(loadTestList filename resList depth)
179 # Create list of strings from a file without comments
180 # ENCODING parameter is a new feature in cmake 3.1
181 initLangVars(${resList})
182 initLangVars("sublabel")
183 if (CMAKE_VERSION VERSION_GREATER "3.1")
184 file(STRINGS ${filename} tempList ENCODING "UTF-8")
186 file(STRINGS ${filename} tempList)
192 message(STATUS "Reading list ${filename}")
193 foreach(_l ${tempList})
195 string(REGEX REPLACE "[ \t]+$" "" _newl "${_l}")
196 string(REGEX REPLACE "[ \t]*#.*$" "" _newl "${_l}")
198 list(APPEND ${resList} "${_newl}")
199 if (_newl MATCHES "^Sublabel:")
200 string(REGEX REPLACE "^Sublabel:[ \t]*" "" _newlabels ${_newl})
201 string(REGEX MATCHALL "([0-9]*[a-zA-Z]+)" _labels ${_newlabels})
202 foreach(labname ${_labels})
203 if (NOT labname STREQUAL "RESET")
204 list(APPEND mylabels ${labname})
207 list(REMOVE_DUPLICATES mylabels)
208 set(sublabel ${_newl})
210 string(REGEX REPLACE "(\\/|\\||\\(|\\))" " " _vxx ${_newl})
211 string(REGEX MATCHALL " ([a-z][a-z](_[A-Z][A-Z])?) " _vx ${_vxx})
214 string(REGEX REPLACE " " "" _v ${_v})
215 #message(STATUS " ==> ${resList}_${_v}")
216 #message(STATUS "sublabel = ${sublabel}, sublabel_${_v} = ${sublabel_${_v}}")
217 if (NOT sublabel STREQUAL "${sublabel_${_v}}")
218 list(APPEND ${resList}_${_v} "${sublabel}")
219 set(sublabel_${_v} "${sublabel}")
220 #message(STATUS "Setting variable sublabel_${_v} with \"${sublabel}\"")
222 list(APPEND ${resList}_${_v} "${_newl}")
223 list(APPEND languages ${_v})
225 list(REMOVE_DUPLICATES languages)
226 #message(STATUS "languages = ${languages}")
231 foreach(_l1 ${mylabels})
232 if (_l1 MATCHES "^([0-9]+)([a-zA-Z]+)$")
233 set(_l ${CMAKE_MATCH_2})
234 set(depth1 ${CMAKE_MATCH_1})
239 list(FIND known_labels ${_l} _ff)
241 message(STATUS "Label \"${_l}\" already in use. Reused in ${filename}")
243 assignLabelDepth(${depth}${depth1} ${_l})
246 foreach(_lg ${languages})
247 # reset label for each used language string at end of file
248 #message(STATUS "Resetting variable sublabel_${_lg}, previously set to ${sublabel_${_lg}}")
249 set(sublabel_${_lg} "")
253 # This labels should not be used in .*Tests files
255 # Create depth info to each label
256 macro(assignLabelDepth depth)
257 foreach(_lab ${ARGN})
258 list(APPEND known_labels ${_lab})
259 set(depth_${_lab} ${depth})
263 assignLabelDepth(0 "export" "key" "layout" "load" "lyx2lyx" "module" "roundtrip" "url")
264 assignLabelDepth(1 "unreliable" "inverted")
265 assignLabelDepth(2 "suspended")
266 assignLabelDepth(3 "examples" "manuals" "mathmacros" "templates" "autotests")
268 loadTestList(suspiciousTests suspiciousTests 7)
269 loadTestList(ignoredTests ignoredTests 0)
270 loadTestList(suspendedTests suspendedTests 6)
271 loadTestList(unreliableTests unreliableTests 5)
273 # preparing to add e.g. development/mathmacros to the foreach() loop
274 foreach(libsubfolderx autotests/export lib/doc lib/examples lib/templates development/mathmacros)
275 set(testlabel "export")
276 if (libsubfolderx MATCHES "lib/doc")
277 list(APPEND testlabel "manuals")
278 elseif (libsubfolderx MATCHES "lib/examples")
279 list(APPEND testlabel "examples")
280 elseif (libsubfolderx MATCHES "lib/templates")
281 list(APPEND testlabel "templates")
282 elseif (libsubfolderx MATCHES "development/mathmacros")
283 list(APPEND testlabel "mathmacros")
284 elseif (libsubfolderx MATCHES "autotests/.+")
285 list(APPEND testlabel "autotests")
287 set(LIBSUB_SRC_DIR "${TOP_SRC_DIR}/${libsubfolderx}")
288 string(REGEX REPLACE "^(lib|development|autotests)/" "" libsubfolder "${libsubfolderx}")
289 set(LIBSUB_SRC_DIR "${TOP_SRC_DIR}/${libsubfolderx}")
290 message(STATUS "Handling export dir ${LIBSUB_SRC_DIR}")
291 file(GLOB_RECURSE lyx_files RELATIVE "${LIBSUB_SRC_DIR}" "${LIBSUB_SRC_DIR}/*.lyx")
293 if (libsubfolderx MATCHES "development/mathmacros")
294 # This is a zipped file, removing from tests
295 list(REMOVE_ITEM lyx_files testcases_master_child.lyx)
297 # Now create 2 lists. One for files in a language dir, one without
299 set(nolang_lyx_files)
300 foreach(f ${lyx_files})
301 string(REGEX MATCHALL "^[a-z][a-z](_[A-Z][A-Z])?\\/" _v ${f})
303 list(APPEND lang_lyx_files ${f})
305 list(APPEND nolang_lyx_files ${f})
308 foreach(f ${nolang_lyx_files} ${lang_lyx_files})
310 string(REGEX REPLACE "\\.lyx$" "" f ${f})
311 set(TestName "export/${libsubfolder}/${f}_lyx16")
312 set(mytestlabel ${testlabel})
313 maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
315 add_test(NAME ${TestName}
316 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
317 COMMAND ${CMAKE_COMMAND} -DLYX_ROOT=${LIBSUB_SRC_DIR}
318 -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
319 -Dlyx=$<TARGET_FILE:${_lyx}>
320 -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
321 -DLYX_USERDIR_VER=${LYX_USERDIR_VER}
325 -Dinverted=${inverted}
326 -DTOP_SRC_DIR=${TOP_SRC_DIR}
327 -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
328 -P "${TOP_SRC_DIR}/development/autotests/export.cmake")
329 setmarkedtestlabel(${TestName} ${mytestlabel})
331 if(LYX_PYTHON_EXECUTABLE)
332 set(lyx2lyxtestlabel "lyx2lyx")
333 # For use of lyx2lyx we need the python executable
334 set(mytestlabel ${lyx2lyxtestlabel})
335 set(TestName "lyx2lyx/${libsubfolder}/${f}")
336 maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
338 add_test(NAME ${TestName}
339 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
340 COMMAND ${CMAKE_COMMAND}
341 "-DLYX_PYTHON_EXECUTABLE=${LYX_PYTHON_EXECUTABLE}"
342 "-DLYX2LYX=${TOP_SRC_DIR}/lib/lyx2lyx/lyx2lyx"
343 "-DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}"
344 "-DLYXFILE=${LIBSUB_SRC_DIR}/${f}.lyx"
345 -P "${TOP_SRC_DIR}/development/autotests/lyx2lyxtest.cmake")
346 setmarkedtestlabel(${TestName} ${mytestlabel})
349 set(loadtestlabel "load")
350 set(mytestlabel ${loadtestlabel})
351 set(TestName "check_load/${libsubfolder}/${f}")
352 maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
354 add_test(NAME ${TestName}
355 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
356 COMMAND ${CMAKE_COMMAND} -DLYXFILE=${LIBSUB_SRC_DIR}/${f}.lyx
357 -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
358 -Dlyx=$<TARGET_FILE:${_lyx}>
359 -DPARAMS_DIR=${TOP_SRC_DIR}/development/autotests
360 -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
361 -P "${TOP_SRC_DIR}/development/autotests/check_load.cmake")
362 setmarkedtestlabel(${TestName} ${mytestlabel})
363 set_tests_properties(${TestName} PROPERTIES RUN_SERIAL ON)
365 getoutputformats("${LIBSUB_SRC_DIR}/${f}.lyx" formatlist)
366 foreach(format ${formatlist})
367 if(format MATCHES "dvi3|pdf4|pdf5")
368 set(fonttypes "texF" "systemF")
370 set(fonttypes "defaultF")
372 foreach(fonttype ${fonttypes})
373 if(fonttype MATCHES "defaultF")
374 set(TestName "export/${libsubfolder}/${f}_${format}")
376 set(TestName "export/${libsubfolder}/${f}_${format}_${fonttype}")
378 set(mytestlabel ${testlabel})
379 maketestname(TestName inverted suspiciousTests ignoredTests unreliableTests mytestlabel)
381 add_test(NAME ${TestName}
382 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}"
383 COMMAND ${CMAKE_COMMAND} -DLYX_ROOT=${LIBSUB_SRC_DIR}
384 -DLYX_TESTS_USERDIR=${LYX_TESTS_USERDIR}
385 -Dlyx=$<TARGET_FILE:${_lyx}>
386 -DWORKDIR=${CMAKE_CURRENT_BINARY_DIR}/${LYX_HOME}
388 -Dfonttype=${fonttype}
389 -Dextension=${format}
391 -Dinverted=${inverted}
392 -DTOP_SRC_DIR=${TOP_SRC_DIR}
393 -DPERL_EXECUTABLE=${PERL_EXECUTABLE}
394 -P "${TOP_SRC_DIR}/development/autotests/export.cmake")
395 setmarkedtestlabel(${TestName} ${mytestlabel}) # check for suspended pdf/dvi exports