82ac35dfa57911b9c49409f0193c29ac7d59cd64
[scilab.git] / scilab / modules / development_tools / macros / example_run.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2012 - Scilab Enterprises - Vincent COUVERT
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 function boolStatus = example_run(modulesName, functionsName, helpLanguage, varargin)
11
12     rhs = argn(2);
13
14     if rhs < 1 then
15         modulesName = getmodules();
16     end
17     if rhs < 2 then
18         functionsName = [];
19     end
20     if rhs < 3 then
21         helpLanguage = "en_US";
22     end
23
24     if typeof(modulesName)<>"string" then
25         error(msprintf(gettext("%s: Wrong type for input argument #%d: A row array of strings expected.\n"), "example_run", 1));
26     end
27     if size(modulesName, 2)<>1 then
28         error(msprintf(gettext("%s: Wrong size for input argument #%d: A row array of strings expected.\n"), "example_run", 1));
29     end
30
31     if (typeof(functionsName)=="constant" & ~isempty(functionsName)) & typeof(functionsName)<>"string" then
32         error(msprintf(gettext("%s: Wrong type for input argument #%d: A row array of strings or empty matrix expected.\n"), "example_run", 2));
33     end
34     if ~isempty(functionsName) & size(functionsName, 2)<>1 then
35         error(msprintf(gettext("%s: Wrong size for input argument #%d: A row array of strings or empty matrix expected.\n"), "example_run", 2));
36     end
37
38     if typeof(helpLanguage)<>"string" then
39         error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"), "example_run", 3));
40     end
41     if size(helpLanguage, "*")<>1 then
42         error(msprintf(gettext("%s: Wrong size for input argument #%d: A string expected.\n"), "example_run", 3));
43     end
44
45     for kMod = 1:size(modulesName, "*")
46
47         moduleName = modulesName(kMod);
48
49         moduleDir = SCI + filesep() + "modules" + filesep() + moduleName + filesep() + "help" + filesep();
50         if ~isdir(moduleDir) then
51             error(msprintf(gettext("%s: Wrong value for input argument #%d: A Scilab module name expected.\n"), "example_run", 1));
52             return
53         end
54
55         moduleDir = moduleDir + helpLanguage + filesep();
56         if ~isdir(moduleDir) then
57             error(msprintf(gettext("%s: Wrong value for input argument #%d: A valid language expected.\n"), "example_run", 3));
58             return
59         end
60
61         tempModuleName = moduleName + "_help";
62
63         workDir = TMPDIR + filesep() + tempModuleName + filesep() + "tests" + filesep() + "unit_tests" + filesep();
64         if isdir(workDir) then
65             rmdir(workDir, "s");
66         end
67
68         if isempty(functionsName) then
69             xmlFiles = findHelpFiles(moduleDir, []);
70
71             for kFile = 1:size(xmlFiles, "*")
72                 xmlFile = xmlFiles(kFile);
73                 createTestsFromHelp(moduleDir, workDir, xmlFile)
74             end
75         else
76             for kFunction = 1:size(functionsName, "*")
77                 xmlFiles = findHelpFiles(moduleDir, functionsName(kFunction));
78                 if isempty(xmlFiles) then // The user wants to test a specific file
79                     error(msprintf(gettext("%s: Wrong value for input argument #%d: A ''%s'' module function name expected.\n"), "example_run", 2, moduleName));
80                     return
81                 end
82
83                 for kFile = 1:size(xmlFiles, "*")
84                     xmlFile = xmlFiles(kFile);
85                     createTestsFromHelp(moduleDir, workDir, xmlFile)
86                 end
87             end
88         end
89
90         if rhs > 3 then
91             boolStatus = test_run(TMPDIR +  filesep() + tempModuleName, [], varargin(:))
92         else
93             boolStatus = test_run(TMPDIR +  filesep() + tempModuleName, [])
94         end
95     end
96
97 endfunction
98
99 function createTestsFromHelp(baseDirectory, outputDirectory, helpFile)
100
101     mkdir(outputDirectory);
102
103     helpFileDoc = xmlRead(helpFile);
104
105     // Find all programlisting tag in the file
106     exampleTags = xmlXPath(helpFileDoc, "//scilabhelpfile:programlisting", ["scilabhelpfile" "http://docbook.org/ns/docbook"]);
107
108     for kExample = 1:size(exampleTags, "*")
109
110         programListing = [];
111
112         if exampleTags(kExample).attributes.role == "interactive-example" then
113             programListing = ["// <-- INTERACTIVE TEST -->" ; programListing];
114         end
115
116         ignoredRoles = ["no-scilab-exec"];
117         ignoreExample = or(exampleTags(kExample).attributes.role==ignoredRoles) | isempty(exampleTags(kExample).attributes.role);
118
119         programListing = ["// <-- NO CHECK REF -->" ; programListing; exampleTags(kExample).content];
120
121         if ~ignoreExample then
122             functionName = fileparts(helpFile, "fname");
123             relPath = dirname(getrelativefilename(baseDirectory, helpFile));
124
125             mkdir(outputDirectory + relPath + filesep())
126
127             if size(exampleTags, "*")>1 then
128                 mputl(programListing, outputDirectory + relPath + filesep() + functionName + "_" + string(kExample) + ".tst");
129             else
130                 mputl(programListing, outputDirectory + relPath + filesep() + functionName + ".tst");
131             end
132         end
133     end
134
135 endfunction
136
137 function xmlFilenames = findHelpFiles(directory, functionName)
138
139     xmlFilenames = [];
140
141     allFiles = ls(directory);
142
143     for kFile = 1:size(allFiles, "*")
144         if isfile(allFiles(kFile)) then
145             if fileparts(allFiles(kFile), "extension")==".xml" then
146                 if isempty(functionName) then
147                     xmlFilenames($+1) = allFiles(kFile);
148                 elseif fileparts(allFiles(kFile), "fname")==functionName then
149                     xmlFilenames($+1) = allFiles(kFile);
150                 end
151             end
152         else // Directory
153             xmlFilenames = [xmlFilenames;findHelpFiles(directory + allFiles(kFile) + filesep(), functionName)]
154         end
155     end
156
157 endfunction