bug fix 14901: WScilex.exe stops immediately when launched from Java
[scilab.git] / scilab / modules / xcos / tests / nonreg_tests / xcos_nonreg.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008 - INRIA - Laurent VAYLET
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function xcos_nonreg(varargin)
14
15     //  Description:
16     //
17     //    Launcher for Xcos non-regression tests
18     //
19     //  Input argument(s):
20     //
21     //    testNames - OPTIONAL - matrix of strings
22     //      Only tests in this list will be run
23     //        DEFAULT: '*' (all tests are run)
24     //
25     //  Output argument(s):
26     //
27     //    -
28     //
29     //  Usage:
30     //
31     //     cd SCI/modules/xcos/tests/nonreg_tests;
32     //     exec('xcos_nonreg.sci');
33     //     xcos_nonreg();
34     //     xcos_nonreg('disease');
35     //     xcos_nonreg(['disease','rossler']);
36     //
37     //  Algorithm: (grep "^\s*//--" xcos_nonreg.sci | awk -F "//-- " '{print "//  " $1 $2}')
38     //
39     //    Parse input arguments
40     //    Disable vertical paging
41     //    Keep track of number of successful and failed tests
42     //    Check if user explicitly supplied a list of tests to run
43     //      No: list and sort all available tests (*.zcos files)
44     //      Yes: check that given list is valid (test existence of diagrams)
45     //      For each available test
46     //        Print some info about current test
47     //        Launch test and display result
48     //        Update lists of successful and failed tests
49     //      Display overall report
50
51     //
52     //  Notes:
53     //
54     //    -
55     //
56     //  2008/04/22     Laurent VAYLET   Creation
57     //  2009/11/13     Yann COLLETTE    Xcos adaptation
58     //  <YYYY/MM/DD>   <AUTHOR>         Modification
59     //
60
61     //-- Parse input arguments
62     lhs = argn(1)
63     rhs = argn(2)
64
65     // Define default input arguments
66     defaultArgs = list("*")
67     inputArgs   = defaultArgs
68
69     // Define maximum number of input arguments
70     MAX_ARGS  = length(inputArgs)
71
72     // Check number of input arguments
73     if rhs > MAX_ARGS
74         error(msprintf("%s: Wrong number of input arguments: At most %d expected.\n", ..
75         "xcos_nonreg", MAX_ARGS))
76     elseif rhs > 0
77         // Replace any default value with user-provided one
78         for k = 1:rhs
79             inputArgs(k) = varargin(k)
80         end
81     end
82
83     //-- Disable vertical paging
84     lines(0)
85
86     //-- Keep track of number of successful and failed tests
87     listSuccessful  = list() // list of successful tests
88     listFailed      = list() // list of failed tests
89     listSkipped     = list() // list of skipped tests
90     failureDetails  = ""     // details about every failed test
91
92     // baseDir = fullfile(SCI,'modules','xcos','tests','nonreg_tests')
93     baseDir = pwd()
94
95     //-- Check if user explicitly supplied a list of tests to run
96     if inputArgs(1) == defaultArgs(1)
97         //-- No: list and sort all available tests (*.zcos files)
98         xcosFiles   = gsort(basename(listfiles("*.zcos")),"lr","i")
99     else
100         //-- Yes: check that given list is valid (test existence of diagrams)
101         xcosFiles = inputArgs(1)
102         idxFilesToDelete = []
103         for k = 1:size(xcosFiles,"*")
104             if isempty(fileinfo(fullfile(baseDir,cosFiles(k) + ".zcos")))
105                 // File does not exist: warn user and mark test for deletion
106                 printf(" WARNING: Test ''%s'' could not be found in ''%s''\n", xcosFiles(k), baseDir)
107                 idxFilesToDelete = [ idxFilesToDelete ; k ]
108             end
109         end
110
111         // Delete marked tests (invalid tests)
112         xcosFiles(idxFilesToDelete) = []
113     end
114
115     nbTests = size(xcosFiles,"*")
116
117     if nbTests ~= 0
118
119         printf("\n")
120
121         //-- For each available test
122         for k = 1:nbTests
123
124             //-- Print some info about current test
125             printf("   %03d/%03d - ", k, nbTests)
126             printf("[%s] %s","xcos",xcosFiles(k))
127             for j = length("xcos" + xcosFiles(k)):50
128                 printf(".")
129             end
130
131             //-- Launch test and display result
132             try
133                 status = launch_nonreg(baseDir,xcosFiles(k))
134             catch
135                 // Set status.ok to false in case of error in launch_nonreg
136                 status.ok = %f
137                 status.msg = ""
138                 status.details = ""
139             end
140             printf("%s \n", status.msg)
141
142             //-- Update lists of successful and failed tests
143             if status.ok
144                 listSuccessful($+1) = xcosFiles(k)
145             else
146                 listFailed($+1)     = xcosFiles(k)
147                 failureDetails = [ failureDetails ; sprintf("   TEST : [%s] %s","xcos",xcosFiles(k)) ]
148                 failureDetails = [ failureDetails ; sprintf("     %s", status.msg) ]
149                 failureDetails = [ failureDetails ; status.details ]
150                 failureDetails = [ failureDetails ; "" ]
151             end
152         end
153
154         //-- Display overall report
155         nbPassed  = length(listSuccessful)
156         nbFailed  = length(listFailed)
157         nbSkipped = length(listSkipped)
158
159         printf("\n")
160         printf("   --------------------------------------------------------------------------\n")
161         printf("   Summary\n\n")
162         printf("   tests                     %4d - 100.0 %% \n", nbTests)
163         printf("   passed                    %4d - %5.1f %% \n", nbPassed,  nbPassed/nbTests*100)
164         printf("   failed                    %4d - %5.1f %% \n", nbFailed,  nbFailed/nbTests*100)
165         printf("   skipped                   %4d - %5.1f %% \n", nbSkipped, nbSkipped/nbTests*100)
166         printf("   --------------------------------------------------------------------------\n")
167
168         if nbFailed > 0 then
169             printf("   Details\n\n")
170             printf("%s\n", failureDetails)
171             printf("\n")
172             printf("   --------------------------------------------------------------------------\n")
173         end
174
175     else
176         printf("\n ERROR: No valid test found in following directory: ''%s''\n", baseDir)
177     end
178
179 endfunction
180
181 // -----------------------------------------------------------------------------
182
183 function status = launch_nonreg(baseDir, testName)
184
185     //  Algorithm: (grep '^\s*//--' xcos_nonreg.sci | awk -F '//-- ' '{print '//  ' $1 $2}')
186     //
187     //    Initializations
188     //    Build a script whose purpose is to launch simulation and log console output
189     //    Launch script using a background Scilab
190     //    Which version of Scilab was used ?
191     //      Non-regression tests launched under Scilab 4.X ?
192     //        Rename file.out -> file.out.ref
193     //      Non-regression tests launched under Scilab 5.X ?
194     //        Compare output data with reference data:
195     //        Read output data
196     //        Read reference data
197     //        Compare (%F meaning identical) and update status
198
199
200     //-- Initializations
201
202     status.ok      = %f
203     status.msg     = []
204     status.details = []
205
206     // Define some aliases
207     currentScilabFamily = get_scilab_family()
208     testFilename   = fullfile(baseDir, testName + ".test")
209     modelFilename  = fullfile(baseDir, testName + ".zcos")
210     // Keep separate references and results for Windows and Linux, as results given
211     // by the two versions have always been different (though it's not logical)
212     if getos() == "Windows"
213         baseName = testName + ".win"
214     else
215         baseName = testName + ".unix"
216     end
217     outFilename    = fullfile(baseDir, baseName + ".out") // foo.win.out, foo.unix.out
218     logFilename    = fullfile(baseDir, baseName + ".log") // foo.win.log, foo.unix.log
219     errFilename    = fullfile(baseDir, baseName + ".err") // foo.win.err, foo.unix.err
220
221
222     select currentScilabFamily
223
224     case "4" then
225         // Add additional suffix to generate reference files
226         outFilename    = outFilename   + ".ref" // foo.win.out.ref, foo.unix.out.ref
227         logFilename    = logFilename   + ".ref" // foo.win.log.ref, foo.unix.log.ref
228         errFilename    = errFilename   + ".ref" // foo.win.err.ref, foo.unix.err.ref
229
230     case "5" then
231         // Do nothing, filenames are already OK
232
233     else
234         status.ok = %f
235         status.msg = "failed  : Unknown Scilab version"
236         status.details = sprintf("     Unknown Scilab version (%s)", getversion())
237         return
238
239     end
240
241     // Delete any existing files holding the same names as the ones that are going to be generated
242     // After the simulation, a test on the existence of these files can ensure that simulation went all right
243     mdelete(testFilename)
244     mdelete(outFilename)
245     mdelete(logFilename)
246     mdelete(errFilename)
247
248     // Define format used in 'Write to File' blocks to log output (Fortran syntax)
249     outputFormat = "(7(e22.15,1x))"
250
251     //-- Build a script whose purpose is to launch simulation and log console output
252     txt = [ "// Set display settings";
253     "mode(3)";
254     "clear";
255     "lines(28,72)";
256     "lines(0)";
257     "";
258     "// Go to folder containing the diagram to test";
259     "cd(''" + baseDir + "'')";
260     "";
261     "// Load some helper functions (findIOblocks, renameIO, setW2Fformat, ...)";
262     "getd(''./utils'')";
263     "";
264     "// Load and launch simulation, displaying some debug data in the mean time";
265     "importXcosDiagram(''" + modelFilename + "'')";
266     "";
267     "// Rename output file to match variant name";
268     "// Override any existing format with predefined one (''" + outputFormat + "'')";
269     "// This modification is not saved, it only exists during simulation";
270     "[idxWrite, idxRead] = findIOblocks(scs_m)";
271     "if ~isempty(idxWrite) & size(idxWrite,''*'') == 1";
272     "  scs_m = renameIO(scs_m, idxWrite, ''" + get_filename(outFilename) + "'')";
273     "  scs_m = setW2Fformat(scs_m, idxWrite, ''" + outputFormat + "'')";
274     "end";
275     "";
276     "// Rename input file (if present) to match variant name";
277     "// This modification is only valid during simulation, thus not saved";
278     "if ~isempty(idxRead) & size(idxRead,''*'') == 1";
279     "  scs_m = renameIO(scs_m, idxRead, ''" + testName + ".in'')";
280     "end";
281     "";
282     "disp(scs_m)";
283     "";
284     "// Force compilation";
285     "//          %tcur  %cpr    alreadyran  needstart  needcompile  %state0";
286     "Info = list(0,     list(), %f,         %t,        4,           list())";
287     "try";
288     "  Info = scicos_simulate(scs_m,Info,[],''nw'')";
289     "catch";
290     "  disp(sprintf(''%-25s: ERROR while simulating '',''" + testName + "''))";
291     "end";
292     "";
293     "disp(Info)";
294     "";
295     "// Quit background Scilab session";
296     "exit"];
297     mputl(txt, get_filename(testFilename));
298
299     //-- Launch script using a background Scilab
300     // Binary or source version ?
301     if (getos() <> "Windows") & isempty(fileinfo(SCI + "/bin/scilab")) then
302         SCI_BIN = strsubst(SCI, "/share/scilab", "")
303     else
304         SCI_BIN = SCI
305     end
306     // Launch previous script inside a NW Scilab and redirect both standard and error output to files
307     if getos() == "Windows" then
308         cmd = "(""" + SCI_BIN + "\bin\scilab"" -nw -nb -args -nouserstartup -f """ + testFilename + """ > """ + logFilename + """) 2> """ + errFilename + """"
309     else
310         cmd = "(''" + SCI_BIN + "/bin/scilab'' -nw -nb -args -nouserstartup -f ''" + testFilename + "'' > ''" + logFilename + "'') 2> ''" + errFilename + "''"
311     end
312     // mputl(cmd, fullfile(baseDir, testName + '.cmd')) // Log the command for debug purpose
313     host(cmd)
314
315     // Sleep for 100 ms to let files be created and saved
316     sleep(100)
317
318     //-- Which version of Scilab was used ?
319     select currentScilabFamily
320
321         //-- Non-regression tests launched under Scilab 4.X ?
322     case "4" then
323
324         //-- Check that reference file has been created and exists
325         status.ok = ~isempty(fileinfo(outFilename))
326
327         // Status determines if copy succeeded or failed
328         // A failure might indicate that simulation failed and did not produce any output
329         if status.ok
330             status.msg = "passed  : Reference file successfully generated"
331             status.details = ""
332             return
333         else
334             status.msg = "failed  : Reference file NOT generated"
335             status.details = sprintf("     It might indicate a failure during simulation")
336             status.details = [ status.details ; sprintf("     Try running the simulation manually by opening ''%s.zcos'' in Scicos", testName) ]
337             status.details = [ status.details ; sprintf("     Last know error:") ]
338             status.details = [ status.details ; lasterror() ]
339             return
340         end
341
342         //-- Non-regression tests launched under Scilab 5.X ?
343     case "5" then
344
345         //-- Compare output data with reference data:
346         outRefFilename = outFilename + ".ref"
347         //-- Read output data
348         try
349             fidOut = mopen(outFilename, "r")
350             out = mgetl(fidOut)
351             mclose(fidOut)
352         catch
353             status.ok = %f
354             status.msg = "failed  : Cannot read output data"
355             status.details = sprintf("     Cannot read output data from file ''%s''", outFilename)
356             status.details = [ status.details ; sprintf("     It might indicate a failure during simulation") ]
357             status.details = [ status.details ; sprintf("     Try running the simulation manually by opening ''%s.zcos'' in Scicos", testName) ]
358             status.details = [ status.details ; sprintf("     Last know error:") ]
359             status.details = [ status.details ; lasterror() ]
360             return // go on to next test
361         end
362
363         //-- Read reference data
364         try
365             fidRef = mopen(outRefFilename, "r")
366             ref = mgetl(fidRef)
367             mclose(fidRef)
368         catch
369             status.ok = %f
370             status.msg = "failed  : Cannot read reference data"
371             status.details = sprintf("     Cannot read reference data from file ''%s''", outRefFilename)
372             status.details = [ status.details ; sprintf("     Last know error:") ]
373             status.details = [ status.details ; lasterror() ]
374             return // go on to next test
375         end
376
377         //-- Compare (%F meaning identical) and update status
378         if or(out<>ref)
379             status.ok      = %f
380             status.msg     = "failed  : Output and reference are NOT equal"
381             status.details = sprintf("     Compare the following files for more details:")
382             status.details = [ status.details ; sprintf("     - %s", outFilename) ]
383             status.details = [ status.details ; sprintf("     - %s", outRefFilename) ]
384             return
385         else
386             status.ok      = %t
387             status.msg     = "passed  : Output and reference are equal"
388             status.details = ""
389             return
390         end
391     end
392 endfunction
393
394 // -----------------------------------------------------------------------------
395
396 function family = get_scilab_family()
397     // Get family (major version) of currently running Scilab
398     //
399     // Algorithm: (grep '^\s*//--' xcos_nonreg.sci | awk -F '//-- ' '{print '//  ' $1 $2}')
400     //
401     //    Initialize output to [] <=> unknown version of Scilab
402     //    Get complete version name
403     //    Extract family from a known pattern found in version name
404
405
406     //-- Initialize output to [] <=> unknown version of Scilab
407     family = []
408
409     //-- Get complete version name
410     version = getversion()
411
412     //-- Extract family from a known pattern found in version name
413     if ~isempty(grep(getversion(),"scilab-4")) ..
414         | ~isempty(grep(getversion(), "Scilab-4")) ..
415         | ~isempty(grep(getversion(), "scicos_work"))
416
417         // 4.X version
418         family = "4"
419
420     elseif ~isempty(grep(getversion(), "trunk")) ..
421         | ~isempty(grep(getversion(), "scilab-5"))
422
423         // 5.X version
424         family = "5"
425
426     end
427
428 endfunction
429
430 // -----------------------------------------------------------------------------
431
432 function filename = get_filename(fullPath)
433     // Extract filename from a full path
434     // Ex: --> get_filename('/home/vaylet/dev/scicos_work/modules/xcos/tests/nonreg_tests/constant.test')
435     //      ans =
436     //
437     //      contant.test
438
439     [path,base,extension] = fileparts(fullPath)
440     filename = base + extension
441
442 endfunction
443
444 // -----------------------------------------------------------------------------
445