GCC Code Coverage Report


Directory: ./
File: src/wrapper_test.cpp
Date: 2025-04-25 19:10:50
Exec Total Coverage
Lines: 89 93 95.7%
Branches: 193 217 88.9%

Line Branch Exec Source
1 /***************************************
2 Auteur : Pierre Aubert
3 Mail : pierre.aubert@lapp.in2p3.fr
4 Licence : CeCILL-C
5 ****************************************/
6
7 #include "cmakelist_generator.h"
8 #include "type_utils.h"
9 #include "wrapper_test.h"
10
11 ///Get the default of a given type for a test
12 /** @param type : type of the attribute to be set
13 * @return corresponding Python
14 */
15 40 PString pythonGetDefaultTestValue(PString & type){
16
16/20
✓ Branch 1 taken 26 times.
✓ Branch 2 taken 14 times.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 24 times.
✓ Branch 11 taken 2 times.
✓ Branch 13 taken 22 times.
✓ Branch 14 taken 2 times.
✓ Branch 16 taken 20 times.
✓ Branch 17 taken 2 times.
✓ Branch 19 taken 20 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 18 times.
✓ Branch 27 taken 22 times.
✓ Branch 28 taken 18 times.
40 if(type == "int" || type == "long" || type == "long int" || type == "size_t" || type == "unsigned int" || type == "unsigned short" || type == "char" || type == "unsigned char" || type == "long unsigned int"){
17 22 return "42";
18
6/6
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 14 times.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 14 times.
18 }else if(type == "float" || type == "double"){
19 4 return "42.0";
20
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 10 times.
14 }else if(type == "std::string"){
21 4 return "\"Shadoko\"";
22
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 8 times.
10 }else if(type == "DataStreamMsg"){
23 2 return "bytearray(b\"Shadoko\")";
24
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
8 }else if(generator_typeIsList(type)){
25
1/1
✓ Branch 1 taken 4 times.
4 PString nestedType(generator_getListNestedType(type));
26
1/1
✓ Branch 1 taken 4 times.
4 PString nestedDefaultValue(pythonGetDefaultTestValue(nestedType));
27
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
4 if(nestedDefaultValue != ""){
28
3/3
✓ Branch 1 taken 2 times.
✓ Branch 4 taken 2 times.
✓ Branch 7 taken 2 times.
4 return "["+nestedDefaultValue+"]";
29 }else{
30
1/1
✓ Branch 1 taken 2 times.
2 return "[]";
31 }
32 4 }
33
34 4 return "";
35 }
36
37 ///Get the default set of given attribute for a test
38 /** @param varName : name of the variable of the class to be used
39 * @param attr : attribute to be set
40 * @param moduleName : name of the module to be used
41 * @param indentation : indentation of the set
42 * @param mapClass : map of all classes/types defined for this configuration
43 * @return corresponding Python
44 */
45 18 PString pythonDefaultTestValue(const PString & varName, const PClassAttribute & attr, const PString & moduleName, const PString & indentation,
46 const std::map<std::string, PClassConfig> & mapClass)
47 {
48
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 PString type(attr.getType());
49
1/1
✓ Branch 1 taken 18 times.
18 PString body(indentation);
50
51
1/1
✓ Branch 1 taken 18 times.
18 PString initValue(pythonGetDefaultTestValue(type));
52
2/2
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 1 times.
18 if(initValue != ""){
53
7/7
✓ Branch 1 taken 17 times.
✓ Branch 4 taken 17 times.
✓ Branch 7 taken 17 times.
✓ Branch 10 taken 17 times.
✓ Branch 13 taken 17 times.
✓ Branch 16 taken 17 times.
✓ Branch 19 taken 17 times.
17 body += varName + "." + attr.getName() + " = "+initValue+"\n";
54
2/3
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 }else if(attr.getIsEnum()){
55
1/1
✓ Branch 1 taken 1 times.
1 std::map<std::string, PClassConfig>::const_iterator it(mapClass.find(type));
56
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 if(it != mapClass.end()){
57 //Let's take the last value so we are sure this is not a 0 or a default value
58
13/13
✓ Branch 2 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 12 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 18 taken 1 times.
✓ Branch 21 taken 1 times.
✓ Branch 24 taken 1 times.
✓ Branch 27 taken 1 times.
✓ Branch 30 taken 1 times.
✓ Branch 33 taken 1 times.
✓ Branch 36 taken 1 times.
✓ Branch 39 taken 1 times.
1 body += varName + "." + attr.getName() + " = "+moduleName+"."+type+"."+it->second.getListAttribute().back().getName()+"\n";
59 }
60 }else{
61 return "";
62 }
63
1/1
✓ Branch 1 taken 18 times.
18 return body;
64 18 }
65
66 ///Get the default set of given attribute for a test
67 /** @param varName : name of the variable of the class to be used
68 * @param attr : attribute to be set
69 * @param moduleName : name of the module to be used
70 * @param indentation : indentation of the set
71 * @param mapClass : map of all classes/types defined for this configuration
72 * @return corresponding Python
73 */
74 18 PString pythonAssertTestValue(const PString & varName, const PClassAttribute & attr, const PString & moduleName, const PString & indentation,
75 const std::map<std::string, PClassConfig> & mapClass)
76 {
77
2/2
✓ Branch 1 taken 18 times.
✓ Branch 4 taken 18 times.
18 PString type(attr.getType());
78
1/1
✓ Branch 1 taken 18 times.
18 PString body(indentation);
79
80
1/1
✓ Branch 1 taken 18 times.
18 PString initValue(pythonGetDefaultTestValue(type));
81
2/2
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 1 times.
18 if(initValue != ""){
82
8/8
✓ Branch 1 taken 17 times.
✓ Branch 4 taken 17 times.
✓ Branch 7 taken 17 times.
✓ Branch 10 taken 17 times.
✓ Branch 13 taken 17 times.
✓ Branch 16 taken 17 times.
✓ Branch 19 taken 17 times.
✓ Branch 22 taken 17 times.
17 body += "assert " + varName + "." + attr.getName() + " == "+initValue+"\n";
83
2/3
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 }else if(attr.getIsEnum()){
84
1/1
✓ Branch 1 taken 1 times.
1 std::map<std::string, PClassConfig>::const_iterator it(mapClass.find(type));
85
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 if(it != mapClass.end()){
86
14/14
✓ Branch 2 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 12 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 18 taken 1 times.
✓ Branch 21 taken 1 times.
✓ Branch 24 taken 1 times.
✓ Branch 27 taken 1 times.
✓ Branch 30 taken 1 times.
✓ Branch 33 taken 1 times.
✓ Branch 36 taken 1 times.
✓ Branch 39 taken 1 times.
✓ Branch 42 taken 1 times.
1 body += "assert " + varName + "." + attr.getName() + ".value == "+moduleName+"."+type+"."+it->second.getListAttribute().back().getName()+".value\n";
87 }
88 }else{
89 return "";
90 }
91
1/1
✓ Branch 1 taken 18 times.
18 return body;
92 18 }
93
94 ///Generate the test for all class inside the module
95 /** @param testDirectory : directory whre to write tests
96 * @param moduleName : name of the python module
97 * @param classConfig : class confoguration
98 * @param mapClass : map of all classes/types defined for this configuration
99 * @return true on success, false otherwise
100 */
101 7 bool project_wrapper_classTest(const PPath & testDirectory, const PString & moduleName, const PClassConfig & classConfig,
102 const std::map<std::string, PClassConfig> & mapClass)
103 {
104
3/3
✓ Branch 1 taken 7 times.
✓ Branch 4 taken 7 times.
✓ Branch 7 taken 7 times.
7 PString body, className(classConfig.getName());
105
1/1
✓ Branch 1 taken 7 times.
7 body += "\n";
106
2/2
✓ Branch 1 taken 7 times.
✓ Branch 4 taken 7 times.
7 body += getCMakeListsHeader();
107
1/1
✓ Branch 1 taken 7 times.
7 body += "\n";
108
3/3
✓ Branch 1 taken 7 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 1 times.
7 if(!classConfig.getIsEnum()){
109
3/3
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
6 body += "import "+moduleName+"\n";
110 }
111
5/5
✓ Branch 1 taken 7 times.
✓ Branch 4 taken 7 times.
✓ Branch 7 taken 7 times.
✓ Branch 10 taken 7 times.
✓ Branch 13 taken 7 times.
7 body += "from "+moduleName+" import "+className+"\n";
112
1/1
✓ Branch 1 taken 7 times.
7 body += "\n";
113
3/3
✓ Branch 1 taken 7 times.
✓ Branch 4 taken 7 times.
✓ Branch 7 taken 7 times.
7 body += "#Unit Test of the " + className + "\n";
114
3/3
✓ Branch 1 taken 7 times.
✓ Branch 4 taken 7 times.
✓ Branch 7 taken 7 times.
7 body += "def test_"+className+"():\n";
115
5/5
✓ Branch 1 taken 7 times.
✓ Branch 4 taken 7 times.
✓ Branch 7 taken 7 times.
✓ Branch 10 taken 7 times.
✓ Branch 13 taken 7 times.
7 body += "\tassert "+className+".getTypeName() == \"" + className + "\"\n";
116
3/3
✓ Branch 1 taken 7 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 1 times.
7 if(!classConfig.getIsEnum()){
117
1/1
✓ Branch 1 taken 6 times.
6 body += "\t#Let's test the stream now\n";
118
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\tshadok = "+moduleName+"."+className+"()\n";
119
1/1
✓ Branch 1 taken 6 times.
6 const std::vector<PClassAttribute> & vecAttr = classConfig.getListAttribute();
120
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
121
4/4
✓ Branch 1 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 8 taken 18 times.
✓ Branch 11 taken 18 times.
18 body += pythonDefaultTestValue("shadok", *it, moduleName, "\t", mapClass);
122 }
123
1/1
✓ Branch 1 taken 6 times.
6 body += "\tstream = shadok.toBytes()\n";
124
1/1
✓ Branch 1 taken 6 times.
6 body += "\tassert len(stream) != 0\n";
125
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\n";
126
5/5
✓ Branch 1 taken 6 times.
✓ Branch 4 taken 6 times.
✓ Branch 7 taken 6 times.
✓ Branch 10 taken 6 times.
✓ Branch 13 taken 6 times.
6 body += "\tother = "+moduleName+"."+className+"()\n";
127
1/1
✓ Branch 1 taken 6 times.
6 body += "\tother.fromBytes(stream)\n";
128
2/2
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
24 for(std::vector<PClassAttribute>::const_iterator it(vecAttr.begin()); it != vecAttr.end(); ++it){
129
4/4
✓ Branch 1 taken 18 times.
✓ Branch 5 taken 18 times.
✓ Branch 8 taken 18 times.
✓ Branch 11 taken 18 times.
18 body += pythonAssertTestValue("other", *it, moduleName, "\t", mapClass);
130 }
131
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\n";
132
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\n";
133
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\n";
134
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\n";
135
1/1
✓ Branch 1 taken 6 times.
6 body += "\t\n";
136 }
137
138
5/5
✓ Branch 1 taken 7 times.
✓ Branch 4 taken 7 times.
✓ Branch 7 taken 7 times.
✓ Branch 10 taken 7 times.
✓ Branch 13 taken 7 times.
14 PPath fileName(testDirectory / PPath("test_" + className + ".py"));
139
1/1
✓ Branch 1 taken 7 times.
14 return fileName.saveFileContent(body);
140 7 }
141
142
143 ///Generate the test for all class inside the module
144 /** @param testDirectory : directory whre to write tests
145 * @param moduleName : name of the python module
146 * @param vecClassConfig : vector of class confoguration
147 * @return true on success, false otherwise
148 */
149 5 bool project_wrapper_allClassTest(const PPath & testDirectory, const PString & moduleName, const std::vector<PClassConfig> & vecClassConfig){
150 5 bool b(true);
151 5 std::map<std::string, PClassConfig> mapClass;
152
5/6
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 5 times.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 7 times.
✓ Branch 9 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end() && b; ++it){
153
3/3
✓ Branch 3 taken 7 times.
✓ Branch 6 taken 7 times.
✓ Branch 9 taken 7 times.
7 mapClass[it->getName()] = *it;
154 }
155
5/6
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
✓ Branch 8 taken 5 times.
12 for(std::vector<PClassConfig>::const_iterator it(vecClassConfig.begin()); it != vecClassConfig.end() && b; ++it){
156
1/1
✓ Branch 2 taken 7 times.
7 b &= project_wrapper_classTest(testDirectory, moduleName, *it, mapClass);
157 }
158 5 return b;
159 5 }
160
161 ///Generate the unit tests of the project
162 /** @param projectPath : path of the module
163 * @param projectConfig : config of the project
164 * @param moduleName : name of the module
165 * @param vecClassConfig : vector of class confoguration
166 * @param vecInclude : vector of includes
167 * @return true on success, false otherwise
168 */
169 5 bool project_wrapper_moduleGeneratorTest(const PPath & projectPath, const ProjectConfig & projectConfig, const PString & moduleName, const std::vector<PClassConfig> & vecClassConfig, const PVecPath & vecInclude){
170
3/3
✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 7 taken 5 times.
10 PPath testDirectory(projectPath / PPath("tests"));
171
2/3
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 if(!testDirectory.createDirectory()){
172 std::cerr << "project_wrapper_generator : cannot create unit tests directory of project '"<<testDirectory<<"'" << std::endl;
173 return false;
174 }
175
2/3
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 if(!project_wrapper_allClassTest(testDirectory, moduleName, vecClassConfig)){return false;}
176
177
178 5 return true;
179 5 }
180
181
182