Xcos: fix some issues on Xcos->Scilab actions
[scilab.git] / scilab / modules / development_tools / macros / test_run.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2007-2008 - INRIA - Pierre MARECHAL <pierre.marechal@inria.fr>
3 // Copyright (C) 2009-2010 - DIGITEO - Michael Baudin
4 //
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10
11 // test_run  --
12 //   Launch unit tests.
13 //   Search for .tst files in the unit test and non-regression test library
14 //   execute them, and display a report about success of failures.
15 //   The .tst files are searched in directories SCI+"/modules/*/tests/unit_tests"
16 //   and SCI+"/modules/*/tests/nonreg_tests".
17 //   Whenever a test is executed, a .dia file is generated which contains
18 //   the full list of commands executed along with message which appears in the
19 //   console. When the script is done, the .dia file is compared with
20 //   the .dia.ref file which is expected to be in the same directory
21 //   as the .tst file. If the two file are different, the test fails.
22 //   Special tags may be inserted in the .tst file, which help to
23 //   control the processing of the corresponding test. These tags
24 //   are expected to be found in Scilab comments.
25 //   These are the available tags :
26 //     <-- INTERACTIVE TEST -->
27 //       This test will be skipped because it is interactive.
28 //     <-- LONG TIME EXECUTION -->
29 //       This test will be skipped because it needs long-time duration. It will
30 //       launched if the optional argument "enable_lt" is called
31 //     <-- NOT FIXED -->
32 //       This test will be skipped because it is a known, but unfixed bug.
33 //     <-- TEST WITH GRAPHIC -->
34 //       This test will not be executed if the option "mode_nwni" is used.
35 //     <-- NO TRY CATCH -->
36 //     <-- NO CHECK ERROR OUTPUT -->
37 //       The error output file is not checked
38 //     <-- NO CHECK REF -->
39 //       The .dia and the .dia.ref files are not compared.
40 //     <-- ENGLISH IMPOSED -->
41 //       This test will be executed with the -l en_US option.
42 //     <-- FRENCH IMPOSED -->
43 //       This test will be executed with the -l fr_FR option.
44 //     <-- JVM NOT MANDATORY -->
45 //       This test will be executed with the nwni mode by default.
46 //     <-- WINDOWS ONLY -->
47 //       If the operating system isn't Windows, the test is skipped.
48 //     <-- UNIX ONLY -->
49 //       If the operating system isn't an unix OS, the test is skipped.
50 //     <-- LINUX ONLY -->
51 //       If the operating system isn't Linux, the test is skipped.
52 //     <-- MACOSX ONLY -->
53 //       If the operating system isn't MacOSX, the test is skipped.
54 //     <-- XCOS TEST -->
55 //       This test will launch all the necessary Xcos libs. This test
56 //       will be launched in nw mode.
57 //
58 //   Each test is executed in a separated process, created with the "host" command.
59 //   That enables the current command to continue, even if the test as
60 //   created an unstable environment. It also enables the tests to be
61 //   independent from one another.
62 //
63 // Arguments:
64 //   modulename, optional : a string or a vector of strings, where
65 //     each string is a the name of a module to test
66 //   testname, optional : a string, a vector or a matrix of strings, where
67 //     each string is a the name of a test. For example, if testname is "foo",
68 //     the associated test file is "foo.tst".
69 //   options, optional : a string or a vector of strings, where options can
70 //     have the following values :
71 //       'no_check_ref' : does not check if the .dia and .dia.ref are equal
72 //       'no_check_error_output'
73 //       'create_ref' : create the .dia.ref file and does not check if the .dia and .dia.ref are equal
74 //       'list' : does not process the tests but displays a list of available tests
75 //       'mode_nw' : add the "-nw" option to the launch
76 //       'mode_nwni' : add the "-nwni" option to the launch
77 //       'help' : display some examples about how to use this command
78 //       "nonreg_tests" : runs only the non-regression tests, skipping unit tests
79 //       "unit_tests" : runs only the unit tests, skipping non-regression tests
80 //
81 // =============================================================================
82 // Launch tests
83 // =============================================================================
84 // Examples :
85 //
86 // Launch all tests
87 // test_run();
88 // test_run([]);
89 // test_run([],[]);
90 //
91 // Test one or several module
92 // test_run('core');
93 // test_run('core',[]);
94 // test_run(['core','string']);
95 //
96 // Launch one or several test in a specified module
97 // test_run('core',['trycatch','opcode']);
98 //
99 // With options
100 // test_run([],[],'no_check_ref');
101 // test_run([],[],'no_check_error_output');
102 // test_run([],[],'create_ref');
103 // test_run([],[],'list');
104 // test_run([],[],'mode_nw');
105 // test_run([],[],'mode_nwni');
106 // test_run([],[],'help');
107 // test_run([],[],['no_check_error_output','create_ref']);
108
109
110 function test_run(varargin)
111
112     lhs = argn(1);
113     rhs = argn(2);
114
115     // test type
116     type_filter  = "all_tests"; // By default, lauch nonreg tests AND unitary tests
117     skip_mat     = [];          // The list of test to skip
118
119     // =========================================================================
120     // Print test_run help
121     // =========================================================================
122
123     if (rhs >= 3) & (~ isempty(grep(varargin(3),"help"))) then
124         example = test_examples();
125         printf("%s\n",example);
126         return;
127     end
128
129     // =======================================================
130     // Gestion des types de tests à lancer
131     // =======================================================
132
133     global MACOSX;
134     global LINUX;
135
136     if getos() <> 'Windows' then
137         OSNAME = unix_g('uname');
138         MACOSX = (strcmpi(OSNAME,"darwin") == 0);
139         LINUX  = (strcmpi(OSNAME,"linux") == 0);
140     else
141         MACOSX = %F;
142         LINUX  = %F;
143     end
144
145     global testsuite;
146     testsuite = testsuite_new();
147
148     if rhs >= 3 then
149
150         option_mat = varargin(3);
151
152         if (or(option_mat == "unit_tests") & or(option_mat == "nonreg_tests")) | (or(option_mat == "all_tests") ) then
153             type_filter = "all_tests";
154
155         elseif or(option_mat == "unit_tests") then
156             type_filter = "unit_tests";
157
158         elseif or(option_mat == "nonreg_tests") then
159             type_filter = "nonreg_tests";
160         end
161
162         if or(option_mat == "skip_tests") then
163             skip_mat = varargin(2);
164         end
165
166     end
167
168     // =======================================================
169     // Stacksize management
170     // =======================================================
171
172     gstacksize(10000000);
173     stacksize(10000000);
174
175     // =======================================================
176     // Gestion des tests à lancer
177     // =======================================================
178
179     if (rhs == 0) ..
180                 | ((rhs == 1) & (varargin(1)==[])) ..
181                 | (((rhs == 2)|(rhs == 3)) & (varargin(1)==[]) & (varargin(2)==[])) then
182
183         // No input argument
184         // test_run()
185         // test_run([])
186         // => Launch each test of each module
187
188         module_list = getmodules();
189         module_list = gsort(module_list,"lr","i");
190
191         for i=1:size(module_list,"*")
192             module    = module_new();
193             module    = module_set_name(module,module_list(i))
194             module    = module_set_path(module,pathconvert(SCI+"/modules/"+module.name,%F));
195             tests     = get_tests_from_module(module,type_filter,skip_mat);
196             testsuite = testsuite_add_tests( testsuite, tests );
197         end
198
199     elseif (rhs == 1) ..
200                 | ((rhs == 2) & (varargin(2)==[])) ..
201                 | ((rhs == 3) & (varargin(2)==[])) ..
202                 | ( ~ isempty(skip_mat)) then
203
204         // One input argument
205         // test_run(<module_name>)
206         // test_run([<module_name_1>,<module_name_2>])
207
208         // varargin(1) = [<module_name_1>,<module_name_2>]
209
210         module_mat = varargin(1);
211
212         // test_run([<module_name_1>,<module_name_2>])
213
214         for i=1:size(module_mat,"*")
215
216             module = module_new();
217             module = module_set_name(module,module_mat(i))
218
219              // It's a scilab internal module
220             if with_module(module.items(i)) then
221                 module = module_set_path(module,pathconvert(SCI+"/modules/"+module.items(i),%F));
222
223             // It's an ATOMS module
224             elseif or(librarieslist() == "atomslib") ..
225                     & atomsIsLoaded(module.items(i)) then
226                 module = module_set_path(module,pathconvert(atomsGetLoadedPath(module.items(i)),%F,%T));
227
228             // It's an external module
229             elseif isdir(module.items(i)) then
230                 module = module_set_path(module,pathconvert(module.items(i),%F));
231
232             // It's an error
233             else
234                 error(sprintf(gettext("%s is not an installed module or toolbox"),module_mat(i)));
235             end
236
237             tests = get_tests_from_module(module,type_filter,skip_mat);
238
239             testsuite = testsuite_add_tests( testsuite , tests);
240
241         end
242
243     elseif or(rhs==[2 3]) then
244
245         // Two input arguments
246         // test_run(<module_name>,<test_name>)
247         // test_run(<module_name>,[<test_name_1>,<test_name_2>] )
248
249         // varargin(1) = <module_name> ==> string 1x1
250         // varargin(2) = <test_name_1> ==> mat nl x nc
251
252         module_in  = varargin(1);
253         test_mat   = varargin(2);
254
255         if ((or(size(module_in) <> [1,1])) & (test_mat <> [])) then
256
257             example = test_examples();
258             err     = ["" ; msprintf(gettext("%s: Wrong size for input argument."),"test_run") ; "" ; example ];
259             printf("%s\n",err);
260             return;
261         end
262
263         module = module_new();
264         module = module_set_name(module,module_in);
265
266         // It's a scilab internal module
267         if with_module(module.items(1)) then
268             module = module_set_path(module,pathconvert(SCI+"/modules/"+module.items(1),%F));
269
270         // It's an ATOMS module
271         elseif or(librarieslist() == "atomslib") ..
272                 & atomsIsLoaded(module.items(1)) then
273             module = module_set_path(module,pathconvert(atomsGetLoadedPath(module.items(1)),%F,%T));
274
275         // It's an external module
276         elseif isdir(module.items(1)) then
277             module = module_set_path(module,pathconvert(module.items(1),%F));
278
279         // It's an error
280         else
281             error(sprintf(gettext("%s is not an installed module or toolbox"),module.items(1)));
282         end
283
284         for i=1:size(test_mat,"*")
285
286             types    = ["unit_tests";"nonreg_tests"]
287             my_tests = list();
288
289             for j=1:size(types,"*")
290
291                 if (type_filter<>"all_tests") & (type_filter<>types(j)) then
292                     continue;
293                 end
294
295                 // Get the list of directories where search
296
297                 test_directory_path = module.path + "/tests/" + types(j);
298                 for k=2:size(module.items,"*")
299                     test_directory_path = test_directory_path + "/" + module.items(k);
300                 end
301
302                 // The main directory doesn't exist, continue the loop
303
304                 if ~ isdir(test_directory_path) then
305                     continue;
306                 end
307
308                 test_main_directory = directory_new();
309                 test_main_directory = directory_set_type(test_main_directory,types(j));
310                 test_main_directory = directory_set_module(test_main_directory,module);
311                 test_main_directory = directory_set_path(test_main_directory,test_directory_path);
312
313                 test_directories = get_directories(test_main_directory);
314
315                 for k=1:size(test_directories)
316
317                     this_directory = test_directories(k);
318
319                     test = st_new();
320                     test = st_set_name(   test , test_mat(i) );
321                     test = st_set_module( test , this_directory.module );
322                     test = st_set_type(   test , types(j) );
323                     test = st_set_path(   test , pathconvert( this_directory.path + "/" + test.name + ".tst" , %F ) );
324
325                     if ~ isempty( fileinfo(test.path) ) then
326                         test = st_analyse(test);
327                         my_tests($+1) = test;
328                     end
329
330                 end
331
332             end
333
334             if size(my_tests) == 0 then
335                 error(sprintf(gettext("The test ""%s"" is not available from the ""%s"" module"),test_mat(i),module.name));
336             end
337
338             testsuite = testsuite_add_tests(testsuite,my_tests);
339
340         end
341
342     else
343         error(msprintf(gettext('%s: Wrong number of input arguments.'),"test_run"));
344     end
345
346     // =========================================================================
347     // Gestion des options
348     // =========================================================================
349
350     if rhs >= 3 then
351
352         // Mode
353
354         if grep(option_mat,"mode_nw") <> [] then
355             testsuite = testsuite_set_WM(testsuite,"NW");
356         end
357
358         if grep(option_mat,"mode_nwni") <> [] then
359             testsuite = testsuite_set_WM(testsuite,"NWNI");
360         end
361
362         // Reference
363
364         if grep(option_mat,"no_check_ref") <> [] then
365             testsuite = testsuite_set_reference(testsuite,"skip")
366         end
367
368         if grep(option_mat,"create_ref") <> [] then
369             testsuite = testsuite_set_reference(testsuite,"create")
370         end
371
372         // Error Output
373
374         if grep(option_mat,"no_check_error_output") <> [] then
375             testsuite = testsuite_set_EO(testsuite,"skip")
376         end
377
378         // Enable long-time tests
379
380         if grep(option_mat,"disable_lt") <> [] then
381             testsuite = testsuite_set_LT(testsuite,"skip")
382         end
383
384         if grep(option_mat,"enable_lt") <> [] then
385             testsuite = testsuite_set_LT(testsuite,"enable")
386         end
387
388     end
389
390     // =========================================================================
391     // List test
392     // =========================================================================
393
394     if (rhs >= 3) & (~ isempty(grep(option_mat,"list"))) then
395         testsuite_list(testsuite);
396         clearglobal testsuite;
397         return;
398
399     // =========================================================================
400     // Test launch
401     // =========================================================================
402
403     else
404         testsuite_run(testsuite);
405         clearglobal testsuite;
406         return;
407     end
408
409 endfunction
410
411 //-----------------------------------------------------------------------------
412 // Pierre MARECHAL
413 // Scilab team
414 // Date : 28 oct. 2007
415 //
416 // => List all test files in the module <module_mat>
417 // => Add them to the test_mat matrix
418 //-----------------------------------------------------------------------------
419
420 function my_tests = get_tests_from_module(module,type_filter,skip_mat)
421
422     my_types = ["unit_tests","nonreg_tests"];
423
424     // 1st action : build the list of directories to explore
425     // test_type : {"all_tests"|"unit_tests"|"nonreg_tests"}
426
427     // Example of a directory :
428     //   path: "/home/robert/scilab/modules/time/tests/unit_tests/date"
429     //   type: "unit_tests"
430     //   module: "time|date"
431
432     my_directories = list();
433
434     for i=1:size(my_types,"*")
435
436         if (type_filter == "all_tests") | (type_filter == my_types(i)) then
437
438             directory = directory_new();
439             directory = directory_set_type(directory,my_types(i));
440             directory = directory_set_module(directory,module);
441
442             directory_path = module.path+"/tests/"+my_types(i);
443             module_items   = module.items;
444
445             for j=2:size(module_items,"*")
446                 directory_path = directory_path + "/" + module_items(j);
447             end
448
449             directory = directory_set_path(directory,directory_path);
450
451             if isdir(directory.path) then
452                 my_directories = lstcat( my_directories , get_directories(directory) );
453             end
454         end
455     end
456
457     // 2nd action : Build the list of tests
458     // Example of a test :
459     //   name: "bug_793"
460     //   path: "/home/robert/scilab/modules/time/tests/nonreg_tests/bug_793.tst"
461     //   type: "nonreg_tests"
462     //   module: "time"
463
464     my_tests = list();
465
466     for i=1:length(my_directories)
467
468         directory = my_directories(i);
469         tests_in  = get_tests_from_directory(directory.path);
470         tests_out = list();
471
472         for j=1:length(tests_in)
473             test = tests_in(j);
474             if or(test.name==skip_mat) then
475                 continue;
476             end
477             test = st_set_type(test,directory.type);
478             test = st_set_module(test,directory.module);
479             test = st_analyse(test);
480             tests_out($+1) = test;
481         end
482
483         my_tests = lstcat( my_tests , tests_out );
484
485     end
486
487 endfunction
488
489
490
491 //-----------------------------------------------------------------------------
492 // Pierre MARECHAL
493 // Scilab team
494 // Date : 28 août 2009
495 //
496 // List all test file in the directory
497 //-----------------------------------------------------------------------------
498
499 function tests = get_tests_from_directory(directory)
500
501     tests = list();
502
503     if isdir(directory) then
504         test_mat = gsort(basename(listfiles(directory+"/*.tst")),"lr","i");
505         for i=1:size(test_mat,"*")
506             this_test  = st_new();
507             this_test  = st_set_name(this_test,test_mat(i));
508             this_test  = st_set_path(this_test,pathconvert(directory)+test_mat(i)+".tst");
509             tests($+1) = this_test;
510         end
511     end
512
513 endfunction
514
515 //-----------------------------------------------------------------------------
516 // Pierre MARECHAL
517 // Scilab team
518 // Date : 28 août 2009
519 //
520 // => Get subdirectories of a directory
521 //
522 // directories is a list of "directory" object (See directory interface)
523 //-----------------------------------------------------------------------------
524
525 function directories = get_directories(directory)
526
527     this_directory_type   = directory.type;
528
529     directories           = list();
530     directories($+1)      = directory;
531
532     items = gsort(listfiles(directory.path),"lr","i");
533
534     for i=1:size(items,"*")
535         if isdir(pathconvert(directory.path) + items(i)) then
536
537             new_module = module_new();
538             new_module = module_set_name( new_module , directory.module.name +  "|" + items(i) );
539             new_module = module_set_path( new_module , pathconvert(directory.path) + items(i) );
540
541             new_dir = directory_new();
542             new_dir = directory_set_path(new_dir,pathconvert(directory.path) + items(i));
543             new_dir = directory_set_module(new_dir,new_module);
544             new_dir = directory_set_type(new_dir,directory.type)
545
546             directories = lstcat( directories , get_directories(new_dir) );
547         end
548     end
549
550 endfunction
551
552
553 //-----------------------------------------------------------------------------
554 // Pierre MARECHAL
555 // Scilab team
556 // Date : 8 novembre 2007
557 //
558 // => remove header from the diary txt
559 //
560 //-----------------------------------------------------------------------------
561
562 function dia_out = remove_headers(dia_in)
563
564     dia_out = dia_in;
565
566     body_start = grep(dia_out,"// <-- HEADER END -->");
567
568     if body_start<>[] then
569         dia_out(1:body_start(1)) = [];
570     end
571
572     body_end   = grep(dia_out,"// <-- FOOTER START -->");
573
574     if body_end<>[] then
575         [dia_nl,dia_nc] = size(dia);
576         dia_out(body_end(1):dia_nl) = [];
577     end
578
579     return;
580
581 endfunction
582
583 //-----------------------------------------------------------------------------
584 // Pierre MARECHAL
585 // Scilab team
586 // Date : 28 oct. 2007
587 //
588 // => Check ref or generate ref
589 //-----------------------------------------------------------------------------
590
591 function example = test_examples()
592
593     example = [ sprintf("Examples :\n\n") ];
594
595
596     example = [ example ; sprintf("// Launch all tests\n") ];
597     example = [ example ; sprintf("test_run();\n") ];
598     example = [ example ; sprintf("test_run([]);\n") ];
599     example = [ example ; sprintf("test_run([],[]);\n") ];
600     example = [ example ; "" ];
601     example = [ example ; sprintf("// Test one or several module\n") ];
602     example = [ example ; sprintf("test_run(''core'');\n") ];
603     example = [ example ; sprintf("test_run(''core'',[]);\n") ];
604     example = [ example ; sprintf("test_run([''core'',''string'']);\n") ];
605     example = [ example ; "" ];
606     example = [ example ; sprintf("// Launch one or several test in a specified module\n") ];
607     example = [ example ; sprintf("test_run(''core'',[''trycatch'',''opcode'']);\n") ];
608     example = [ example ; "" ];
609     example = [ example ; sprintf("// With options\n") ];
610     example = [ example ; sprintf("test_run([],[],''no_check_ref'');\n") ];
611     example = [ example ; sprintf("test_run([],[],''no_check_error_output'');\n") ];
612     example = [ example ; sprintf("test_run([],[],''create_ref'');\n") ];
613     example = [ example ; sprintf("test_run([],[],''list'');\n") ];
614     example = [ example ; sprintf("test_run([],[],''help'');\n") ];
615     example = [ example ; sprintf("test_run([],[],[''no_check_ref'',''mode_nw'']);\n") ];
616     example = [ example ; "" ];
617
618 endfunction
619
620 // =============================================================================
621 // Pierre MARECHAL
622 // Scilab team
623 // Date : 31 août 2009
624 //
625 // singletest interface
626 // =============================================================================
627
628 // constructor
629 // -----------------------------------------------------------------------------
630
631 function st = st_new()
632
633     st = tlist([ "T_SINGLETEST"   ..
634                  "name"           ..
635                  "type"           ..
636                  "path"           ..
637                  "module"         ..
638                  "skip"           ..
639                  "content"        ..
640                  "interactive"    ..
641                  "notyetfixed"    ..
642                  "longtime"       ..    // needs long-time duration
643                  "reopened"       ..
644                  "platform"       ..
645                  "language"       ..
646                  "jvm_mandatory"  ..
647                  "graphic"        ..
648                  "mode"           ..    // NW, NWNI, GUI
649                  "reference"      ..    // check, create, skip
650                  "error_output"   ..    // check, skip
651                  "try_catch"      ..
652                  "path_dia"       ..    // diary file
653                  "path_dia_ref"   ..    // reference file
654                  "tmp_tst"        ..    // diary file
655                  "tmp_dia"        ..    // reference file
656                  "tmp_res"        ..    // diary file
657                  "tmp_err"        ..    // reference file
658                  "status"         ..    // status
659                  "xcos"           ..    // xcos test ?
660                  "cmd"            ..    // command to launch
661                  ] );
662
663     // Default values
664     st.skip          = %F;
665     st.interactive   = %F;
666     st.notyetfixed   = %F;
667     st.longtime      = %F;
668     st.reopened      = %F;
669     st.jvm_mandatory = %T;
670     st.graphic       = %F;
671     st.mode          = "";
672     st.platform      = "all";
673     st.language      = "any";
674     st.try_catch     = %T;
675     st.error_output  = "check";
676     st.reference     = "check";
677
678     st.path_dia      = "";
679     st.path_dia_ref  = "";
680
681     st.tmp_tst       = "";
682     st.tmp_dia       = "";
683     st.tmp_res       = "";
684     st.tmp_err       = "";
685
686     st.cmd           = "";
687
688     st.content       = "";
689
690     st.status        = status_new();
691
692     st.xcos          = %F;
693
694 endfunction
695
696 // setters
697 // -----------------------------------------------------------------------------
698
699 function st = st_set_name(st,name)
700
701     st.name = name;
702
703     st.tmp_tst       = pathconvert( TMPDIR + "/" + name + ".tst"     , %F);
704     st.tmp_dia       = pathconvert( TMPDIR + "/" + name + ".dia.tmp" , %F);
705     st.tmp_res       = pathconvert( TMPDIR + "/" + name + ".res"     , %F);
706     st.tmp_err       = pathconvert( TMPDIR + "/" + name + ".err"     , %F);
707     st.path_dia      = pathconvert( TMPDIR + "/" + name + ".dia"     , %F);
708 endfunction
709
710 function st = st_set_type(st,sttype)
711     st.type = sttype;
712 endfunction
713
714 function st = st_set_path(st,path)
715
716     st.path         = path;
717     basepath        = strsubst(path,"/\.tst$/","","r");
718     st.path_dia_ref = basepath + ".dia.ref";
719
720     // Reference file management OS by OS
721     if getos() == 'Windows' then
722         altreffile = [ basepath+".win.dia.ref" ];
723     elseif MACOSX then
724         altreffile = [ basepath+".unix.dia.ref" ; basepath+".macosx.dia.ref" ];
725     elseif LINUX then
726         altreffile = [ basepath+".unix.dia.ref" ; basepath+".linux.dia.ref" ];
727     else
728         altreffile = [ basepath+".unix.dia.ref" ];
729     end
730
731     for i=1:size(altreffile,"*")
732         if ~ isempty(fileinfo(altreffile(i))) then
733             st.path_dia_ref = altreffile(i);
734         end
735     end
736
737 endfunction
738
739 function st = st_set_module(st,module)
740     st.module = module;
741 endfunction
742
743 function st = st_set_skip(st,skip)
744     st.skip = skip;
745 endfunction
746
747 function st = st_set_content(st,content)
748     st.content = content;
749 endfunction
750
751 function st = st_set_interactive(st,interactive)
752     st.interactive = interactive;
753 endfunction
754
755 function st = st_set_notyetfixed(st,notyetfixed)
756     st.notyetfixed = notyetfixed;
757 endfunction
758
759 function st = st_set_longtime(st,longtime)
760     st.longtime = longtime;
761 endfunction
762
763 function st = st_set_reopened(st,reopened)
764     st.reopened = reopened;
765 endfunction
766
767 function st = st_set_platform(st,platform)
768     st.platform = platform;
769 endfunction
770
771 function st = st_set_jvm_mandatory(st,jvm_mandatory)
772     st.jvm_mandatory = jvm_mandatory;
773 endfunction
774
775 function st = st_set_graphic(st,graphic)
776     st.graphic = graphic;
777 endfunction
778
779 function st = st_set_language(st,language)
780     st.language = language;
781 endfunction
782
783 function st = st_set_try_catch(st,try_catch)
784     st.try_catch = try_catch;
785 endfunction
786
787 function st = st_set_error_output(st,error_output)
788     st.error_output = error_output;
789 endfunction
790
791 function st = st_set_reference(st,reference)
792     st.reference = reference;
793 endfunction
794
795 function st = st_set_status(st,status)
796     st.status = status;
797 endfunction
798
799 function st = st_set_cmd(st,cmd)
800     st.cmd = cmd;
801 endfunction
802
803 function st = st_set_mode(st,smode)
804     st.mode = smode;
805 endfunction
806
807 function st = st_set_xcos(st,xmode)
808     st.xcos = xmode;
809 endfunction
810
811 // show
812 // -----------------------------------------------------------------------------
813
814 function st_show(st)
815
816     if st.skip           then st_skip           = "Yes"; else st_skip           = "No"; end
817     if st.interactive    then st_interactive    = "Yes"; else st_interactive    = "No"; end
818     if st.notyetfixed    then st_notyetfixed    = "Yes"; else st_notyetfixed    = "No"; end
819     if st.longtime       then st_longtime       = "Yes"; else st_longtime       = "No"; end
820     if st.reopened       then st_reopened       = "Yes"; else st_reopened       = "No"; end
821     if st.jvm_mandatory  then st_jvm_mandatory  = "Yes"; else st_jvm_mandatory  = "No"; end
822     if st.graphic        then st_graphic        = "Yes"; else st_graphic        = "No"; end
823     if st.try_catch      then st_try_catch      = "Yes"; else st_try_catch      = "No"; end
824     if st.xcos           then st_xcos           = "Yes"; else st_xcos           = "No"; end
825
826     mprintf("Test :\n");
827     mprintf("  name           = %s\n"   ,st.name);
828     mprintf("  type           = %s\n"   ,st.type);
829     mprintf("  module         = %s\n"   ,st.module.name);
830     mprintf("\n");
831
832     mprintf("Test paths :\n");
833     mprintf("  path           = %s\n"   ,st.path);
834     mprintf("  path_dia       = %s\n"   ,st.path_dia);
835     mprintf("  path_dia_ref   = %s\n"   ,st.path_dia_ref);
836     mprintf("  tmp_tst        = %s\n"   ,st.tmp_tst);
837     mprintf("  tmp_dia        = %s\n"   ,st.tmp_dia);
838     mprintf("  tmp_res        = %s\n"   ,st.tmp_res);
839     mprintf("  tmp_err        = %s\n"   ,st.tmp_err);
840     mprintf("\n");
841
842     mprintf("Test features :\n");
843     mprintf("  skip           = %s\n"   ,st_skip);
844     mprintf("  interactive    = %s\n"   ,st_interactive);
845     mprintf("  notyetfixed    = %s\n"   ,st_notyetfixed);
846     mprintf("  longtime       = %s\n"   ,st_longtime);
847     mprintf("  reopened       = %s\n"   ,st_reopened);
848     mprintf("  platform       = %s\n"   ,st.platform);
849     mprintf("  jvm_mandatory  = %s\n"   ,st_interactive);
850     mprintf("  graphic        = %s\n"   ,st_graphic);
851     mprintf("  mode           = %s\n"   ,st.mode);
852     mprintf("  reference      = %s\n"   ,st.reference);
853     mprintf("  error_output   = %s\n"   ,st.error_output);
854     mprintf("  try_catch      = %s\n"   ,st_try_catch);
855     mprintf("  xcos           = %s\n"   ,st_xcos);
856     mprintf("\n");
857
858     mprintf("Test scilab cmd :\n");
859     mprintf("  cmd            = %s\n"   ,st.cmd);
860     mprintf("\n");
861
862     module_show(test.module);
863     status_show(test.status);
864
865 endfunction
866
867 // Analyse
868 // -----------------------------------------------------------------------------
869
870 function st = st_analyse(st)
871
872     if typeof(st) <> "T_SINGLETEST" then
873         error(msprintf(gettext("%s: Wrong type for input argument #%d: %s expected.\n"),"st_analyse","T_SINGLETEST",1));
874     end
875
876     if isempty( fileinfo(st.path) ) then
877         error(msprintf(gettext("%s: The test ''%s'' doesn''t exist or is not read available.\n"),"st_analyse",st.path));
878     end
879
880     // Get the test content
881     st = st_set_content(st,mgetl(st.path));
882
883     // Test status
884     // =========================================================================
885
886     if ~ isempty( grep(st.content,"<-- NOT FIXED -->") ) then
887         st = st_set_notyetfixed(st,%T);
888     end
889
890     if ~ isempty( grep(st.content,"<-- REOPENED -->") ) then
891         st = st_set_reopened(st,%T);
892     end
893
894     // platform
895     // =========================================================================
896
897     if ~ isempty( grep(st.content,"<-- WINDOWS ONLY -->") ) then
898         st = st_set_platform(st,"windows");
899     end
900
901     if ~ isempty( grep(st.content,"<-- LINUX ONLY -->") ) then
902         st = st_set_platform(st,"linux");
903     end
904
905     if ~ isempty( grep(st.content,"<-- MACOSX ONLY -->") ) then
906         st = st_set_platform(st,"macosx");
907     end
908
909     if ~ isempty( grep(st.content,"<-- MACOSX ONLY -->") ) then
910         st = st_set_platform(st,"macosx");
911     end
912
913     // Test execution
914     // =========================================================================
915
916     if ~ isempty( grep(st.content,"<-- INTERACTIVE TEST -->") ) then
917         st = st_set_interactive(st,%T);
918     end
919
920     if ~ isempty( grep(st.content,"<-- LONG TIME EXECUTION -->") ) then
921         st = st_set_longtime(st,%T);
922     end
923
924     if ~ isempty( grep(st.content,"<-- TEST WITH GRAPHIC -->") ) then
925         st = st_set_graphic(st,%T);
926         st = st_set_jvm_mandatory(st,%T);
927         st = st_set_mode(st,"NW");
928     end
929
930     if ~ isempty( grep(st.content,"<-- JVM NOT MANDATORY -->") ) then
931         st = st_set_jvm_mandatory(st,%F);
932         st = st_set_mode(st,"NWNI");
933     end
934
935     if ~ isempty( grep(st.content,"<-- XCOS TEST -->") ) then
936         st = st_set_xcos(st,%T);
937         st = st_set_jvm_mandatory(st,%T);
938     end
939     // Language
940     // =========================================================================
941
942     if ~ isempty( grep(st.content,"<-- FRENCH IMPOSED -->") ) then
943         st = st_set_language(st,"fr_FR");
944     end
945
946     if ~ isempty( grep(st.content,"<-- ENGLISH IMPOSED -->") ) then
947         st = st_set_language(st,"en_US");
948     end
949
950     // Test building
951     // =========================================================================
952
953     if ~ isempty( grep(st.content,"<-- NO TRY CATCH -->") ) then
954         st = st_set_try_catch(st,%F);
955     end
956
957     // Test result
958     // =========================================================================
959
960     if ~ isempty( grep(st.content,"<-- NO CHECK ERROR OUTPUT -->") ) then
961         st = st_set_error_output(st,"skip");
962     end
963
964     if ~ isempty( grep(st.content,"<-- NO CHECK REF -->") ) then
965         st = st_set_reference(st,"skip");
966     end
967
968 endfunction
969
970
971 //-----------------------------------------------------------------------------
972 // Pierre MARECHAL
973 // Scilab team
974 // Date : 28 oct. 2007
975 //
976 // => Run one test
977 //
978 // Example of test variable :
979 //    name: "bug_793"
980 //    path: "/home/robert/scilab/modules/time/tests/nonreg_tests/bug_793.tst"
981 //    type: "nonreg_tests"
982 //    module: "time"
983 //
984 //-----------------------------------------------------------------------------
985
986 function st = st_run(st)
987
988     //Reset standard globals
989     rand("seed",0);
990     rand("uniform");
991
992     st.status = status_new();
993
994     // Case where the test is skipped
995     // =========================================================================
996
997     // The test is interactive
998
999     if st.interactive then
1000         st.status = status_set_id(st.status,10);
1001         st.status = status_set_message(st.status,"skipped : interactive test");
1002         return;
1003     end
1004
1005     // The test needs long-time duration
1006
1007     if st.longtime & (testsuite.longtime == "skip") then
1008         st.status = status_set_id(st.status,10);
1009         st.status = status_set_message(st.status,"skipped : Long time duration");
1010         return;
1011     end
1012
1013     // The bug is not yet fixed
1014
1015     if st.notyetfixed then
1016         st.status = status_set_id(st.status,10);
1017         st.status = status_set_message(st.status,"skipped : not yet fixed");
1018         return;
1019     end
1020
1021     // The bug is reopenned
1022
1023     if st.reopened then
1024         st.status = status_set_id(st.status,10);
1025         st.status = status_set_message(st.status,"skipped : Bug reopened");
1026         return;
1027     end
1028
1029     // The test cannot be launched on this platform
1030
1031     if (st.platform=="windows") & (getos() <> 'Windows') then
1032         st.status = status_set_id(st.status,10);
1033         st.status = status_set_message(st.status,"skipped : Windows only");
1034         return;
1035     end
1036
1037     if (st.platform=="unix") & getos() == 'Windows' then
1038         st.status = status_set_id(st.status,10);
1039         st.status = status_set_message(st.status,"skipped : Unix only");
1040         return;
1041     end
1042
1043     if (st.platform=="linux") & (~LINUX) then
1044         st.status = status_set_id(status,10);
1045         st.status = status_set_message(status,"skipped : Linux only");
1046         return;
1047     end
1048
1049     if (st.platform=="macosx") & (~MACOSX) then
1050         st.status = status_set_id(st.status,10);
1051         st.status = status_set_message(st.status,"skipped : MacOSX only");
1052         return;
1053     end
1054
1055     // The test launches some graphic windows
1056
1057     if st.graphic & (testsuite.wanted_mode == "NWNI") then
1058         st.status = status_set_id(st.status,10);
1059         st.status = status_set_message(st.status,"skipped : Test with graphic");
1060         return;
1061     end
1062
1063     // Build the test
1064     // =========================================================================
1065
1066     txt = st.content;
1067
1068     // Do some modification in tst file
1069     txt = strsubst(txt,"pause,end" ,"bugmes();quit;end");
1070     txt = strsubst(txt,"pause, end","bugmes();quit;end");
1071     txt = strsubst(txt,"pause;end" ,"bugmes();quit;end");
1072     txt = strsubst(txt,"pause; end","bugmes();quit;end");
1073     txt = strsubst(txt,"-->","@#>"); //to avoid suppression of input --> with prompts
1074     txt = strsubst(txt,"halt();","");
1075
1076     // Test header
1077
1078     head = [                                                                    ...
1079         "// <-- HEADER START -->";                                              ...
1080         "mode(3);" ;                                                            ...
1081         "lines(28,72);";                                                        ...
1082         "lines(0);" ;                                                           ...
1083         "function %onprompt" ;                                                           ...
1084         "quit;" ;                                                           ...
1085         "endfunction" ;                                                           ...
1086         "deff(''[]=bugmes()'',''write(%io(2),''''error on test'''')'');" ;      ...
1087         "predef(''all'');" ;                                                    ...
1088         "tmpdirToPrint = msprintf(''TMPDIR1=''''%s''''\n'',TMPDIR);"            ...
1089     ]
1090
1091     if st.xcos then
1092         head = [ head ; "loadXcosLibs();"];
1093     end
1094
1095     if st.try_catch then
1096         head = [ head ; "try" ];
1097     end
1098
1099     head = [                                                                    ...
1100         head ;                                                                  ...
1101         "diary(''"+st.tmp_dia+"'');";                                          ...
1102         "write(%io(2),tmpdirToPrint);";                                         ...
1103         "// <-- HEADER END -->"                                                 ...
1104     ];
1105
1106     // Test footer
1107
1108     tail = [ "// <-- FOOTER START -->" ];
1109
1110     if st.try_catch then
1111         tail = [ tail;                                                          ...
1112             "catch";                                                            ...
1113             "   errmsg = ""<--""+""Error on the test script file""+""-->"";";   ...
1114             "   printf(""%s\n"",errmsg);";                                      ...
1115             "   lasterror()";                                                   ...
1116             "end";                                                              ...
1117             ];
1118     end
1119
1120     tail = [ tail; "diary(0);" ];
1121
1122     if st.graphic then
1123         tail = [ tail; "xdel(winsid());sleep(1000);" ];
1124     end
1125
1126     tail = [ tail; "exit;" ; "// <-- FOOTER END -->" ];
1127
1128     // Assembly
1129
1130     txt = [head;
1131         txt;
1132         tail];
1133
1134     // Build the command
1135     // =========================================================================
1136
1137     // Gestion de l'emplacement de bin/scilab
1138     // -------------------------------------------------------------------------
1139
1140     if (getos() <> 'Windows') & (fileinfo(SCI+"/bin/scilab")==[]) then
1141         SCI_BIN = strsubst(SCI,'share/scilab','');
1142     else
1143         SCI_BIN = SCI;
1144     end
1145
1146     // Mode Argument (NW, NWNI, GUI)
1147     // -------------------------------------------------------------------------
1148
1149     if testsuite.wanted_mode == "NW" then
1150         mode_arg = "-nw";
1151
1152     elseif testsuite.wanted_mode == "NWNI" then
1153         mode_arg = "-nwni";
1154
1155     else
1156         if st.mode == "NWNI" then
1157             mode_arg = "-nwni";
1158         elseif st.mode == "NW" then
1159             mode_arg = "-nw";
1160         else
1161             mode_arg = "-nw";
1162         end
1163     end
1164
1165     // Language Argument (en_US, fr_FR, ... )
1166     // -------------------------------------------------------------------------
1167
1168     if st.language == "any" then
1169         language_arg = "";
1170     elseif getos() == 'Windows' then
1171         language_arg = "-l "+ st.language;
1172     else
1173         language_arg = "LANG=" + st.language + " ; ";
1174     end
1175
1176     // Assembly
1177     // -------------------------------------------------------------------------
1178
1179     if getos() == 'Windows' then
1180         test_cmd = "( """+SCI_BIN+"\bin\scilex.exe"+""""+" "+mode_arg+" "+language_arg+" -nb -f """+st.tmp_tst+""" > """+st.tmp_res+""" ) 2> """+st.tmp_err+"""";
1181     else
1182         test_cmd = "( "+language_arg+" "+SCI_BIN+"/bin/scilab "+mode_arg+" -nb -f "+st.tmp_tst+" > "+st.tmp_res+" ) 2> "+st.tmp_err;
1183     end
1184
1185     st= st_set_cmd(st,test_cmd);
1186
1187     // Remove the previous tmp files
1188     // =========================================================================
1189
1190     if ~ isempty(fileinfo(st.tmp_tst)) then
1191         deletefile(st.tmp_tst);
1192     end
1193
1194     if ~ isempty(fileinfo(st.tmp_dia)) then
1195         deletefile(st.tmp_dia);
1196     end
1197
1198     if ~ isempty(fileinfo(st.tmp_res)) then
1199         deletefile(st.tmp_res);
1200     end
1201
1202     if ~ isempty(fileinfo(st.tmp_err)) then
1203         deletefile(st.tmp_err);
1204     end
1205
1206
1207     // Write the tmp test file
1208     // =========================================================================
1209     mputl(txt,st.tmp_tst);
1210
1211
1212     // Launch the test exec
1213     // =========================================================================
1214     host(st.cmd);
1215
1216
1217
1218     // First Check : error output
1219     // =========================================================================
1220
1221     if (st.error_output == "check") & (testsuite.error_output == "check") then
1222
1223         if getos() == "Darwin" then
1224             tmp_errfile_info = fileinfo(st.tmp_err);
1225             msg = "JavaVM: requested Java version (1.5) not available. Using Java at ""/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"" instead."
1226
1227             if ~isempty(tmp_errfile_info) then
1228                 txt = mgetl(st.tmp_err);
1229                 txt(txt==msg) = [];
1230                 if isempty(txt) then
1231                     deletefile(st.tmp_err);
1232                 end
1233             end
1234         end
1235
1236         tmp_errfile_info = fileinfo(st.tmp_err);
1237
1238         if ( (tmp_errfile_info <> []) & (tmp_errfile_info(1)<>0) ) then
1239             st.status = status_set_id(st.status,5);
1240             st.status = status_set_message(st.status,"failed  : error_output not empty\n     Use ''no_check_error_output'' option to disable this check.");
1241             st.status = status_set_details(st.status,st_checkthefile(st.tmp_err));
1242             return;
1243         end
1244     end
1245
1246     //  Get the dia file
1247     dia = mgetl(st.tmp_dia);
1248
1249     // To get TMPDIR value
1250     tmpdir1_line = grep(dia,"TMPDIR1");
1251     execstr(dia(tmpdir1_line));
1252
1253     //Check for execution errors
1254     if st.try_catch & grep(dia,"<--Error on the test script file-->")<>[] then
1255         details = [ st_checkthefile(st.tmp_dia); ..
1256                     st_launchthecommand(st.path) ];
1257         st.status = status_set_id(st.status,3);
1258         st.status = status_set_message(st.status,"failed  : premature end of the test script");
1259         st.status = status_set_details(st.status,details);
1260         return;
1261     end
1262
1263     // Remove Header and Footer
1264     dia = remove_headers(dia);
1265
1266     //Check for execution errors
1267     dia_tmp                     = dia;
1268     dia_tmp(grep(dia_tmp,"//")) = [];  // remove commented lines
1269
1270     if st.try_catch & grep(dia_tmp,"!--error")<>[] then
1271         details = [ st_checkthefile(st.tmp_dia); ..
1272                     st_launchthecommand(st.path) ];
1273         st.status = status_set_id(st.status,1);
1274         st.status = status_set_message(st.status,"failed  : the string (!--error) has been detected");
1275         st.status = status_set_details(st.status,details);
1276         return;
1277     end
1278
1279
1280     if grep(dia_tmp,"error on test")<>[] then
1281         details = [ st_checkthefile(st.tmp_dia); ..
1282                     st_launchthecommand(st.path) ];
1283         st.status = status_set_id(st.status,2);
1284         st.status = status_set_message(st.status, "failed  : one or several tests failed");
1285         st.status = status_set_details(st.status,details);
1286         return;
1287     end
1288
1289
1290     if tmpdir1_line == [] then
1291         st.status = status_set_id(st.status,6);
1292         st.status = status_set_message(st.status, "failed  : the dia file is not correct");
1293         st.status = status_set_details(st.status,st_checkthefile(st.tmp_dia));
1294         return;
1295     end
1296
1297
1298
1299     // Check the reference file only if check_ref (i.e. for the whole
1300     // test sequence) is true and this_check_ref (i.e. for the specific current .tst)
1301     // is true.
1302
1303     if (st.reference=="check") & (testsuite.reference=="check")  then
1304         if isempty(fileinfo(st.path_dia_ref)) then
1305             st.status = status_set_id(st.status,5);
1306             st.status = status_set_message(st.status,"failed  : the ref file doesn''t exist\n     Use ''no_check_ref'' option to disable this check.");
1307             st.status = status_set_details(st.status,st_createthefile(st.path_dia_ref));
1308             return;
1309         end
1310     end
1311
1312     // Comparaison ref <--> dia
1313
1314     if ( (st.reference=="check") & (testsuite.reference=="check") ) | (testsuite.reference=="create") then
1315
1316         //  Do some modification in  dia file
1317         dia(grep(dia,"write(%io(2),tmpdirToPrint"))= [];
1318         dia(grep(dia,"TMPDIR1"))                   = [];
1319         dia(grep(dia,"diary(0)"))                  = [];
1320
1321         dia = strsubst(dia,TMPDIR ,"TMPDIR");
1322         dia = strsubst(dia,TMPDIR1,"TMPDIR");
1323
1324         if getos() == 'Windows' then
1325             dia = strsubst(dia,strsubst(TMPDIR ,"\","/"),"TMPDIR");
1326             dia = strsubst(dia,strsubst(TMPDIR1,"\","/"),"TMPDIR");
1327             dia = strsubst(dia,strsubst(TMPDIR ,"/","\"),"TMPDIR");
1328             dia = strsubst(dia,strsubst(TMPDIR1,"/","\"),"TMPDIR");
1329             dia = strsubst(dia,strsubst(getshortpathname(TMPDIR) ,"\","/"),"TMPDIR");
1330             dia = strsubst(dia,strsubst(getshortpathname(TMPDIR1),"\","/"),"TMPDIR");
1331             dia = strsubst(dia,getshortpathname(TMPDIR) ,"TMPDIR");
1332             dia = strsubst(dia,getshortpathname(TMPDIR1),"TMPDIR");
1333         end
1334
1335         dia = strsubst(dia,SCI,"SCI");
1336
1337         if getos() == 'Windows' then
1338             dia = strsubst(dia,strsubst(SCI ,"\","/"),"SCI");
1339             dia = strsubst(dia,strsubst(SCI ,"/","\"),"SCI");
1340             dia = strsubst(dia,strsubst(getshortpathname(SCI) ,"\","/"),"SCI");
1341             dia = strsubst(dia,getshortpathname(SCI) ,"SCI");
1342         end
1343
1344         //suppress the prompts
1345         dia = strsubst(dia,"-->" ,"");
1346         dia = strsubst(dia,"@#>" ,"-->");
1347         dia = strsubst(dia,"-1->","");
1348
1349         //standardise  number display
1350
1351         // strsubst(dia," .","0.");
1352         // strsubst(dia,"-.","-0.")
1353         // strsubst(dia,"E+","D+");
1354         // strsubst(dia,"E-","D-");
1355
1356         //not to change the ref files
1357         dia = strsubst(dia,"bugmes();return","bugmes();quit");
1358
1359         if testsuite.reference=="create" then
1360
1361             // Delete previous .dia.ref file
1362             if fileinfo(st.path_dia_ref) <> [] then
1363                 deletefile(st.path_dia_ref)
1364             end
1365
1366             mputl(dia,st.path_dia_ref);
1367
1368             st.status = status_set_id(st.status,20);
1369             st.status = status_set_message(st.status,"passed : ref created");
1370             return;
1371
1372         else
1373
1374             // write down the resulting dia file
1375             mputl(dia,st.path_dia);
1376
1377             //Check for diff with the .ref file
1378
1379             [u,ierr] = mopen(st.path_dia_ref,"r");
1380             if ierr== 0 then //ref file exists
1381
1382                 ref=mgetl(u);
1383                 mclose(u)
1384
1385                 // suppress blank (diff -nw)
1386
1387                 dia = strsubst(dia,' ','')
1388                 ref = strsubst(ref,' ','')
1389
1390                 dia(find(dia=='')) = [];
1391                 ref(find(ref=='')) = [];
1392
1393                 dia(find(dia=='')) = [];
1394                 ref(find(ref=='')) = [];
1395
1396                 dia( find(part(dia,(1:2))=="//") ) = [];
1397                 ref( find(part(ref,(1:2))=="//") ) = [];
1398
1399                 if or(ref<>dia) then
1400                     st.status = status_set_id(st.status,4);
1401                     st.status = status_set_message(st.status,"failed  : dia and ref are not equal");
1402                     st.status = status_set_details(st.status,st_comparethefiles(st.path_dia,st.path_dia_ref));
1403                     return;
1404                 end
1405
1406             else
1407                 error(sprintf(gettext("The ref file (%s) doesn''t exist"),st.path_dia_ref));
1408             end
1409         end
1410
1411     end
1412
1413     st.status = status_set_id(st.status,0);
1414     st.status = status_set_message(st.status,"passed");
1415
1416     return;
1417
1418 endfunction
1419
1420
1421 // st_checkthefile
1422 // -----------------------------------------------------------------------------
1423
1424 function msg = st_checkthefile ( filename )
1425   // Returns a 2-by-1 matrix of strings, containing a message such as:
1426   //     Check the following file :
1427   //     - C:\path\scilab\modules\optimization\tests\unit_testseldermeadeldermead_configure.tst
1428   // Workaround for bug #4827
1429   msg(1) = "     Check the following file :"
1430   msg(2) = "     - "+filename
1431 endfunction
1432
1433
1434
1435 // st_launchthecommand
1436 // -----------------------------------------------------------------------------
1437
1438 function msg = st_launchthecommand ( filename )
1439   // Returns a 2-by-1 matrix of strings, containing a message such as:
1440   //     Or launch the following command :
1441   //     - exec("C:\path\scilab\modules\optimization\tests\unit_testseldermeadeldermead_configure.tst")
1442   // Workaround for bug #4827
1443   msg(1) = "     Or launch the following command :"
1444   msg(2) = "     - exec(""" + filename + """);"
1445 endfunction
1446
1447 // st_comparethefiles
1448 // -----------------------------------------------------------------------------
1449
1450 function msg = st_comparethefiles ( filename1 , filename2 )
1451   // Returns a 3-by-1 matrix of strings, containing a message such as:
1452   //     Compare the following files :
1453   //     - C:\path\scilab\modules\optimization\tests\unit_testseldermeadeldermead_configure.dia
1454   //     - C:\path\scilab\modules\optimization\tests\unit_testseldermeadeldermead_configure.dia.ref
1455   // Workaround for bug #4827
1456   msg(1) = "     Compare the following files :"
1457   msg(2) = "     - "+filename1
1458   msg(3) = "     - "+filename2
1459 endfunction
1460
1461 // st_createthefile
1462 // -----------------------------------------------------------------------------
1463
1464 function msg = st_createthefile ( filename )
1465   // Returns a 2-by-1 matrix of strings, containing a message such as:
1466   //     Add or create the following file :
1467   //     - C:\path\scilab\modules\optimization\tests\unit_testseldermeadeldermead_configure.dia.ref
1468   // Workaround for bug #4827
1469   msg(1) = "     Add or create the following file : "
1470   msg(2) = "     - "+filename
1471 endfunction
1472
1473
1474
1475
1476
1477
1478 // =============================================================================
1479 // Pierre MARECHAL
1480 // Scilab team
1481 // Date : 31 août 2009
1482 //
1483 // module interface
1484 // =============================================================================
1485
1486 // constructor
1487 // -----------------------------------------------------------------------------
1488
1489 function md = module_new()
1490
1491     md = tlist([  "T_MODULE" ..
1492                   "name" ..
1493                   "path" ..
1494                   "items" ] );
1495
1496 endfunction
1497
1498 // setters
1499 // -----------------------------------------------------------------------------
1500
1501 function md = module_set_name(md,name)
1502     md.name  = name;
1503     if isempty( regexp(stripblanks(name),"/\|/") ) then
1504         md.items = [ name ];
1505     else
1506         md.items = stripblanks( strsubst( strsplit(name,regexp(stripblanks(name),"/\|/")) , "/\|$/","","r" ) );
1507     end
1508 endfunction
1509
1510 function md = module_set_path(md,path)
1511     md.path = path;
1512 endfunction
1513
1514 // show
1515 // -----------------------------------------------------------------------------
1516
1517 function module_show(module)
1518         mprintf("Module :\n");
1519         mprintf("  name           = %s\n"   ,module.name);
1520         mprintf("  path           = %s\n"   ,module.path);
1521         mprintf("  items          = %s\n"   ,module.items);
1522         mprintf("\n");
1523 endfunction
1524
1525
1526
1527 // =============================================================================
1528 // Pierre MARECHAL
1529 // Scilab team
1530 // Date : 31 août 2009
1531 //
1532 // directory interface
1533 // =============================================================================
1534
1535 // constructor
1536 // -----------------------------------------------------------------------------
1537
1538 function directory = directory_new()
1539
1540     directory = tlist([  "T_DIRECTORY" ..
1541                   "path"         ..
1542                   "module"       ..
1543                   "type"         ..
1544                   ]);
1545
1546 endfunction
1547
1548 // setters
1549 // -----------------------------------------------------------------------------
1550
1551 function directory = directory_set_path(directory,path)
1552     directory.path = path;
1553 endfunction
1554
1555 function directory = directory_set_module(directory,module)
1556     directory.module = module;
1557 endfunction
1558
1559 function directory = directory_set_type(directory,dtype)
1560     directory.type = dtype;
1561 endfunction
1562
1563
1564 // show
1565 // -----------------------------------------------------------------------------
1566
1567 function directory_show(directory)
1568     mprintf("Directory :\n");
1569     mprintf("  path           = %s\n"   ,directory.path);
1570     mprintf("  module         = %s\n"   ,directory.module.name);
1571     mprintf("  type           = %s\n"   ,directory.type);
1572     mprintf("\n");
1573 endfunction
1574
1575
1576
1577
1578 // =============================================================================
1579 // Pierre MARECHAL
1580 // Scilab team
1581 // Date : 31 août 2009
1582 //
1583 // testsuite interface
1584 // =============================================================================
1585
1586 // constructor
1587 // -----------------------------------------------------------------------------
1588
1589 function testsuite = testsuite_new()
1590
1591     testsuite = tlist([  "T_TESTSUITE" ..
1592                  "items"           ..
1593                  "current_mode"    ..    // NW, NWNI, GUI
1594                  "wanted_mode"     ..    // NW, NWNI, GUI
1595                  "reference"       ..    // check, create, skip
1596                  "error_output"    ..    // check, skip
1597                  "longtime"        ..    // enable, skip
1598                  ]);
1599
1600     testsuite.items = list();
1601
1602     // Default values
1603
1604     if and(getscilabmode() <> ["NW";"STD"]) then
1605         testsuite.current_mode = "NWNI";
1606     else
1607         testsuite.current_mode = "NW";
1608     end
1609
1610     testsuite.wanted_mode  = "";
1611     testsuite.reference    = "check";
1612     testsuite.error_output = "check";
1613     testsuite.longtime     = "skip";
1614
1615 endfunction
1616
1617 // Add tests
1618 // -----------------------------------------------------------------------------
1619
1620 function testsuite = testsuite_add_tests(testsuite,tests)
1621     testsuite.items = lstcat(testsuite.items,tests);
1622 endfunction
1623
1624 function testsuite = testsuite_add_one_test(testsuite,test)
1625     testsuite.items($+1) = test;
1626 endfunction
1627
1628 // Number of tests
1629 // -----------------------------------------------------------------------------
1630
1631 function l = testsuite_length(testsuite)
1632     l = size(testsuite.items);
1633 endfunction
1634
1635 // Setters
1636 // -----------------------------------------------------------------------------
1637
1638 function testsuite = testsuite_set_WM(testsuite,wanted_mode)
1639     testsuite.wanted_mode = wanted_mode;
1640 endfunction
1641
1642 function testsuite = testsuite_set_reference(testsuite,reference)
1643     testsuite.reference = reference;
1644 endfunction
1645
1646 function testsuite = testsuite_set_EO(testsuite,error_output)
1647     testsuite.error_output = error_output;
1648 endfunction
1649
1650 // Enable/Disable Long Time Execution tests
1651 function testsuite = testsuite_set_LT(testsuite,lt)
1652     testsuite.longtime = lt;
1653 endfunction
1654
1655 // List tests
1656 // -----------------------------------------------------------------------------
1657
1658 function testsuite_list(testsuite)
1659
1660     for i=1:size(testsuite.items)
1661         test = testsuite.items(i);
1662         printf("   %03d - ",i);
1663         printf("[%s] %s\n",test.module.name,test.name);
1664     end
1665
1666 endfunction
1667
1668 // Launch tests
1669 // -----------------------------------------------------------------------------
1670
1671 function testsuite_run(testsuite)
1672
1673     details_failed     = "";
1674     test_count         = 0;
1675     test_passed_count  = 0;
1676     test_failed_count  = 0;
1677     test_skipped_count = 0;
1678
1679     printf("   TMPDIR = %s\n",TMPDIR);
1680     printf("\n");
1681
1682     start_date = getdate();
1683     test_count = length(testsuite.items);
1684
1685     for i=1:test_count
1686
1687         test        = testsuite.items(i);
1688         test_module = test.module.name;
1689         test_name   = test.name;
1690
1691         // Improve the display of the module
1692         if isdir(test_module) then
1693             if part(test.module.name,1:length(SCI)) == SCI then
1694                 test_module = "SCI" + part(test_module,length(SCI)+1:length(test_module));
1695             elseif part(test.module.name,1:length(SCIHOME)) == SCIHOME then
1696                 test_module = "SCIHOME" + part(test_module,length(SCIHOME)+1:length(test_module));
1697             end
1698         end
1699
1700         printf("   %03d/%03d - ",i,test_count);
1701         printf("[%s] %s",test_module,test_name);
1702         for j = length(test_name+test_module):50
1703             printf(".");
1704         end
1705
1706         test = st_run(test);
1707
1708         msg = sprintf(test.status.message);
1709         printf("%s \n", msg(1));
1710         for kline = 2:size(msg, "*")
1711           printf(part(" ", 1:62) + "%s \n", msg(2));
1712         end
1713
1714         // Recencement des tests
1715
1716         if test.status.id == 0 then
1717             // passed
1718             test_passed_count = test_passed_count + 1;
1719
1720         elseif (test.status.id > 0) & (test.status.id < 10) then
1721             // failed
1722             test_failed_count = test_failed_count + 1;
1723             details_failed = [ details_failed ; sprintf("   TEST : [%s] %s",test.module.name,test.name)];
1724             details_failed = [ details_failed ; sprintf("     %s",test.status.message) ];
1725             details_failed = [ details_failed ; test.status.details ];
1726             details_failed = [ details_failed ; "" ];
1727
1728         elseif (test.status.id >= 10) & (test.status.id < 20) then
1729             // skipped
1730             test_skipped_count = test_skipped_count + 1;
1731         end
1732     end
1733
1734     end_date = getdate();
1735
1736     // Summary
1737
1738     if test_count<>0 then
1739         test_passed_percent  = test_passed_count  / test_count * 100;
1740         test_skipped_percent = test_skipped_count / test_count * 100;
1741         test_failed_percent  = test_failed_count  / test_count * 100;
1742     else
1743         test_passed_percent  = 0;
1744         test_skipped_percent = 0;
1745         test_failed_percent  = 0;
1746     end
1747
1748     printf("\n");
1749     printf("   --------------------------------------------------------------------------\n");
1750     printf("   Summary\n\n");
1751     printf("   tests                     %4d - 100 %% \n",test_count);
1752     printf("   passed                    %4d - %3d %% \n",test_passed_count ,test_passed_percent);
1753     printf("   failed                    %4d - %3d %% \n",test_failed_count ,test_failed_percent);
1754     printf("   skipped                   %4d - %3d %% \n",test_skipped_count,test_skipped_percent);
1755     printf("   length                          %4.2f sec \n" ,etime(end_date,start_date));
1756     printf("   --------------------------------------------------------------------------\n");
1757
1758     if test_failed_count > 0 then
1759         printf("   Details\n\n");
1760         printf("%s\n",details_failed);
1761         printf("\n");
1762         printf("   --------------------------------------------------------------------------\n");
1763     end
1764
1765 endfunction
1766
1767
1768 // =============================================================================
1769 // Pierre MARECHAL
1770 // Scilab team
1771 // Date : 1 septembre 2009
1772 //
1773 // status
1774 // =============================================================================
1775
1776 // constructor
1777 // -----------------------------------------------------------------------------
1778
1779 function status = status_new()
1780     status = tlist([  "T_STATUS" ..
1781                 "id"             ..
1782                 "message"        ..
1783                 "details"        ..
1784                 ]);
1785
1786     status.id      = 0;
1787     status.message = "";
1788     status.details = "";
1789
1790 endfunction
1791
1792 // setters
1793 // -----------------------------------------------------------------------------
1794
1795 function status = status_set_id(status,id)
1796     status.id = id;
1797 endfunction
1798
1799 function status = status_set_message(status,smessage)
1800     status.message = smessage;
1801 endfunction
1802
1803 function status = status_set_details(status,details)
1804     status.details = details;
1805 endfunction
1806
1807 // show
1808 // -----------------------------------------------------------------------------
1809
1810 function status_show(status)
1811     mprintf("Status :\n");
1812     mprintf("  id             = %d\n"   ,status.id);
1813     mprintf("  message        = %s\n"   ,status.message);
1814     mprintf("  details        = %s\n"   ,status.details);
1815     mprintf("\n");
1816 endfunction
1817
1818