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