GCC Code Coverage Report


Directory: src/
File: main.cpp
Date: 2025-12-11 13:08:41
Exec Total Coverage
Lines: 130 134 97.0%
Functions: 5 5 100.0%
Branches: 241 253 95.3%

Line Branch Exec Source
1
2 /***************************************
3 Auteur : Pierre Aubert
4 Mail : pierre.aubert@lapp.in2p3.fr
5 Licence : CeCILL-C
6 ****************************************/
7
8 #include <iostream>
9
10 #include "OptionParser.h"
11 #include "header_generator.h"
12 #include "parserClassConfig.h"
13 #include "generator_class_cpp.h"
14 #include "simple_project_generator.h"
15
16 //C++ Trait Backend
17 #include "CppTraitFromString.h"
18 #include "CppTraitSetter.h"
19 #include "CppTraitGetter.h"
20 #include "CppTraitCopy.h"
21 #include "CppTraitTypeStream.h"
22 #include "CppTraitDataStream.h"
23 #include "CppTraitConfigStream.h"
24 #include "CppTraitCheckStream.h"
25
26 ///Create the OptionParser of this program
27 /** @return OptionParser of this program
28 */
29 13 OptionParser createOptionParser(){
30
2/2
✓ Branch 0 (2→3) taken 13 times.
✓ Branch 2 (3→4) taken 13 times.
13 OptionParser parser(true, __PROGRAM_VERSION__);
31
2/2
✓ Branch 0 (5→6) taken 13 times.
✓ Branch 2 (6→7) taken 13 times.
13 parser.setExampleLongOption("phoenix_filegenerator class --name=some_source");
32
2/2
✓ Branch 0 (8→9) taken 13 times.
✓ Branch 2 (9→10) taken 13 times.
13 parser.setExampleShortOption("phoenix_filegenerator class -n some_source");
33
34 //Class mode
35
2/2
✓ Branch 0 (11→12) taken 13 times.
✓ Branch 2 (12→13) taken 13 times.
13 parser.addMode("class");
36
1/1
✓ Branch 0 (14→15) taken 13 times.
13 PString defaultClassName("");
37
5/5
✓ Branch 0 (15→16) taken 13 times.
✓ Branch 2 (16→17) taken 13 times.
✓ Branch 4 (17→18) taken 13 times.
✓ Branch 6 (18→19) taken 13 times.
✓ Branch 8 (19→20) taken 13 times.
13 parser.addOption("name", "n", defaultClassName, "base name of the file to be created");
38 13 PVecString templateDef;
39
5/5
✓ Branch 0 (25→26) taken 13 times.
✓ Branch 2 (26→27) taken 13 times.
✓ Branch 4 (27→28) taken 13 times.
✓ Branch 6 (28→29) taken 13 times.
✓ Branch 8 (29→30) taken 13 times.
13 parser.addOption("template", "t", templateDef, "template definition of the class (ex: 'typename T' or 'typename T' 'typename U', etc)");
40
4/4
✓ Branch 0 (34→35) taken 13 times.
✓ Branch 2 (35→36) taken 13 times.
✓ Branch 4 (36→37) taken 13 times.
✓ Branch 6 (37→38) taken 13 times.
13 parser.addOption("config", "c", OptionType::FILENAME, false, "Configuration file to create a class (*.pdata)");
41
4/4
✓ Branch 0 (41→42) taken 13 times.
✓ Branch 2 (42→43) taken 13 times.
✓ Branch 4 (43→44) taken 13 times.
✓ Branch 6 (44→45) taken 13 times.
13 parser.addOption("datastream", "s", OptionType::NONE, false, "Enable PhoenixDataStream use to save/load generated class automatically");
42
4/4
✓ Branch 0 (48→49) taken 13 times.
✓ Branch 2 (49→50) taken 13 times.
✓ Branch 4 (50→51) taken 13 times.
✓ Branch 6 (51→52) taken 13 times.
13 parser.addOption("typestream", "y", OptionType::NONE, false, "Enable PhoenixTypeStream use to get the class name automatically");
43
4/4
✓ Branch 0 (55→56) taken 13 times.
✓ Branch 2 (56→57) taken 13 times.
✓ Branch 4 (57→58) taken 13 times.
✓ Branch 6 (58→59) taken 13 times.
13 parser.addOption("configstream", "f", OptionType::NONE, false, "Enable PhoenixConfigStream use to get the class name automatically");
44
4/4
✓ Branch 0 (62→63) taken 13 times.
✓ Branch 2 (63→64) taken 13 times.
✓ Branch 4 (64→65) taken 13 times.
✓ Branch 6 (65→66) taken 13 times.
13 parser.addOption("checkstream", "e", OptionType::NONE, false, "Enable PhoenixCheckStream use to get the class name automatically");
45
4/4
✓ Branch 0 (69→70) taken 13 times.
✓ Branch 2 (70→71) taken 13 times.
✓ Branch 4 (71→72) taken 13 times.
✓ Branch 6 (72→73) taken 13 times.
13 parser.addOption("tests", "u", OptionType::NONE, false, "Enable unit tests generation");
46
1/1
✓ Branch 0 (76→77) taken 13 times.
13 PString templateDir(".");
47
5/5
✓ Branch 0 (77→78) taken 13 times.
✓ Branch 2 (78→79) taken 13 times.
✓ Branch 4 (79→80) taken 13 times.
✓ Branch 6 (80→81) taken 13 times.
✓ Branch 8 (81→82) taken 13 times.
13 parser.addOption("testdir", "d", templateDir, "Directory for the unit tests");
48
5/5
✓ Branch 0 (86→87) taken 13 times.
✓ Branch 2 (87→88) taken 13 times.
✓ Branch 4 (88→89) taken 13 times.
✓ Branch 6 (89→90) taken 13 times.
✓ Branch 8 (90→91) taken 13 times.
13 parser.addOption("outputpath", "o", templateDir, "Path where the generated source files will be saved");
49
1/1
✓ Branch 0 (95→96) taken 13 times.
13 PString projectName("project_name");
50
5/5
✓ Branch 0 (96→97) taken 13 times.
✓ Branch 2 (97→98) taken 13 times.
✓ Branch 4 (98→99) taken 13 times.
✓ Branch 6 (99→100) taken 13 times.
✓ Branch 8 (100→101) taken 13 times.
13 parser.addOption("projectname", "r", projectName, "Name of the project to generate class in with unit test (will be used for unit test linking)");
51
1/1
✓ Branch 0 (105→106) taken 13 times.
13 parser.closeMode();
52
53 //Source mode
54
2/2
✓ Branch 0 (106→107) taken 13 times.
✓ Branch 2 (107→108) taken 13 times.
13 parser.addMode("source");
55
4/4
✓ Branch 0 (109→110) taken 13 times.
✓ Branch 2 (110→111) taken 13 times.
✓ Branch 4 (111→112) taken 13 times.
✓ Branch 6 (112→113) taken 13 times.
13 parser.addOption("name", "n", OptionType::STRING, true, "base name of the file to be created");
56
1/1
✓ Branch 0 (116→117) taken 13 times.
13 parser.closeMode();
57
58 //Project mode
59
2/2
✓ Branch 0 (117→118) taken 13 times.
✓ Branch 2 (118→119) taken 13 times.
13 parser.addMode("project");
60
4/4
✓ Branch 0 (120→121) taken 13 times.
✓ Branch 2 (121→122) taken 13 times.
✓ Branch 4 (122→123) taken 13 times.
✓ Branch 6 (123→124) taken 13 times.
13 parser.addOption("description", "d", OptionType::FILENAME, false, "description of the full project (*.toml)");
61
4/4
✓ Branch 0 (127→128) taken 13 times.
✓ Branch 2 (128→129) taken 13 times.
✓ Branch 4 (129→130) taken 13 times.
✓ Branch 6 (130→131) taken 13 times.
13 parser.addOption("config", "c", OptionType::FILENAME, false, "Configuration file to create a class (*.pdata)");
62
1/1
✓ Branch 0 (134→135) taken 13 times.
13 PString baseProjectType("SimpleCpp");
63
5/5
✓ Branch 0 (135→136) taken 13 times.
✓ Branch 2 (136→137) taken 13 times.
✓ Branch 4 (137→138) taken 13 times.
✓ Branch 6 (138→139) taken 13 times.
✓ Branch 8 (139→140) taken 13 times.
13 parser.addOption("type", "t", baseProjectType, "Type of the project to generate");
64
4/4
✓ Branch 0 (144→145) taken 13 times.
✓ Branch 2 (145→146) taken 13 times.
✓ Branch 4 (146→147) taken 13 times.
✓ Branch 6 (147→148) taken 13 times.
13 parser.addOption("pythonwrapper", "w", OptionType::NONE, false, "Enable python wrapper generation");
65
4/4
✓ Branch 0 (151→152) taken 13 times.
✓ Branch 2 (152→153) taken 13 times.
✓ Branch 4 (153→154) taken 13 times.
✓ Branch 6 (154→155) taken 13 times.
13 parser.addOption("datastream", "s", OptionType::NONE, false, "Enable PhoenixDataStream use to save/load generated class automatically");
66
4/4
✓ Branch 0 (158→159) taken 13 times.
✓ Branch 2 (159→160) taken 13 times.
✓ Branch 4 (160→161) taken 13 times.
✓ Branch 6 (161→162) taken 13 times.
13 parser.addOption("typestream", "y", OptionType::NONE, false, "Enable PhoenixTypeStream use to get the class name automatically");
67
4/4
✓ Branch 0 (165→166) taken 13 times.
✓ Branch 2 (166→167) taken 13 times.
✓ Branch 4 (167→168) taken 13 times.
✓ Branch 6 (168→169) taken 13 times.
13 parser.addOption("configstream", "f", OptionType::NONE, false, "Enable PhoenixConfigStream use to get the class name automatically");
68
4/4
✓ Branch 0 (172→173) taken 13 times.
✓ Branch 2 (173→174) taken 13 times.
✓ Branch 4 (174→175) taken 13 times.
✓ Branch 6 (175→176) taken 13 times.
13 parser.addOption("checkstream", "e", OptionType::NONE, false, "Enable PhoenixCheckStream use to get the class name automatically");
69
4/4
✓ Branch 0 (179→180) taken 13 times.
✓ Branch 2 (180→181) taken 13 times.
✓ Branch 4 (181→182) taken 13 times.
✓ Branch 6 (182→183) taken 13 times.
13 parser.addOption("tests", "u", OptionType::NONE, false, "Enable unit tests generation");
70
1/1
✓ Branch 0 (186→187) taken 13 times.
13 parser.closeMode();
71 13 return parser;
72 13 }
73
74 ///Class creator
75 /** @param classMode : set of argument passe in the class mode
76 * @return true on success, false otherwise
77 */
78 9 bool createClass(const OptionMode & classMode){
79
1/1
✓ Branch 0 (2→3) taken 9 times.
9 PString className;
80 9 PVecString templatedef;
81
82
1/1
✓ Branch 0 (4→5) taken 9 times.
9 ProjectParam projectParam;
83
3/3
✓ Branch 0 (5→6) taken 9 times.
✓ Branch 2 (6→7) taken 9 times.
✓ Branch 4 (7→8) taken 9 times.
9 projectParam.configFile = PPath("");
84
3/3
✓ Branch 0 (10→11) taken 9 times.
✓ Branch 2 (11→12) taken 9 times.
✓ Branch 4 (12→13) taken 9 times.
9 projectParam.outputTestDir = PPath("./");
85
3/3
✓ Branch 0 (15→16) taken 9 times.
✓ Branch 2 (16→17) taken 9 times.
✓ Branch 4 (17→18) taken 9 times.
9 projectParam.outputSourceDir = PPath("./");
86
2/2
✓ Branch 0 (20→21) taken 9 times.
✓ Branch 2 (21→22) taken 9 times.
9 classMode.getValue(className, "name");
87
2/2
✓ Branch 0 (23→24) taken 9 times.
✓ Branch 2 (24→25) taken 9 times.
9 classMode.getValue(projectParam.configFile, "config");
88
2/2
✓ Branch 0 (26→27) taken 9 times.
✓ Branch 2 (27→28) taken 9 times.
9 classMode.getValue(templatedef, "template");
89
2/2
✓ Branch 0 (29→30) taken 9 times.
✓ Branch 2 (30→31) taken 9 times.
9 classMode.getValue(projectParam.outputTestDir, "testdir");
90
2/2
✓ Branch 0 (32→33) taken 9 times.
✓ Branch 2 (33→34) taken 9 times.
9 classMode.getValue(projectParam.outputSourceDir, "outputpath");
91
92 9 GeneratorMode & mode = projectParam.mode;
93 9 mode.enableSetter = true;
94 9 mode.enableGetter = true;
95 9 mode.enableCopy = true;
96 9 mode.enableFromString = true;
97
2/2
✓ Branch 0 (35→36) taken 9 times.
✓ Branch 2 (36→37) taken 9 times.
9 mode.enableDataStream = classMode.isOptionExist("datastream");
98
2/2
✓ Branch 0 (38→39) taken 9 times.
✓ Branch 2 (39→40) taken 9 times.
9 mode.enableTypeStream = classMode.isOptionExist("typestream");
99
2/2
✓ Branch 0 (41→42) taken 9 times.
✓ Branch 2 (42→43) taken 9 times.
9 mode.enableConfigStream = classMode.isOptionExist("configstream");
100
2/2
✓ Branch 0 (44→45) taken 9 times.
✓ Branch 2 (45→46) taken 9 times.
9 mode.enableCheckStream = classMode.isOptionExist("checkstream");
101
2/2
✓ Branch 0 (47→48) taken 9 times.
✓ Branch 2 (48→49) taken 9 times.
9 mode.enableUnitTest = classMode.isOptionExist("tests");
102
103
1/1
✓ Branch 0 (50→51) taken 9 times.
9 PTraitBackendManager manager;
104
1/1
✓ Branch 0 (51→52) taken 9 times.
9 manager.addTraitBackend<CppTraitFromString>();
105
1/1
✓ Branch 0 (52→53) taken 9 times.
9 manager.addTraitBackend<CppTraitCopy>();
106
1/1
✓ Branch 0 (53→54) taken 9 times.
9 manager.addTraitBackend<CppTraitSetter>();
107
1/1
✓ Branch 0 (54→55) taken 9 times.
9 manager.addTraitBackend<CppTraitGetter>();
108
1/1
✓ Branch 0 (55→56) taken 9 times.
9 manager.addTraitBackend<CppTraitTypeStream>();
109
1/1
✓ Branch 0 (56→57) taken 9 times.
9 manager.addTraitBackend<CppTraitDataStream>();
110
1/1
✓ Branch 0 (57→58) taken 9 times.
9 manager.addTraitBackend<CppTraitConfigStream>();
111
1/1
✓ Branch 0 (58→59) taken 9 times.
9 manager.addTraitBackend<CppTraitCheckStream>();
112
3/3
✓ Branch 0 (59→60) taken 9 times.
✓ Branch 2 (60→61) taken 5 times.
✓ Branch 3 (60→98) taken 4 times.
9 if(projectParam.configFile != ""){
113
3/3
✓ Branch 0 (61→62) taken 5 times.
✓ Branch 2 (62→63) taken 3 times.
✓ Branch 3 (62→68) taken 2 times.
5 if(className == ""){
114
3/3
✓ Branch 0 (63→64) taken 3 times.
✓ Branch 2 (64→65) taken 3 times.
✓ Branch 4 (65→66) taken 3 times.
3 className = projectParam.configFile.getFileName().eraseExtension();
115 }
116
2/2
✓ Branch 0 (68→69) taken 5 times.
✓ Branch 2 (69→70) taken 5 times.
5 classMode.getValue(projectParam.name, "projectname");
117
118
1/1
✓ Branch 0 (71→72) taken 5 times.
5 PDataConfig dataConfig;
119
1/1
✓ Branch 0 (72→73) taken 5 times.
5 dataConfig.setFileName(projectParam.configFile);
120
5/5
✓ Branch 0 (73→74) taken 5 times.
✓ Branch 2 (74→75) taken 5 times.
✓ Branch 4 (75→76) taken 5 times.
✓ Branch 6 (76→77) taken 1 times.
✓ Branch 7 (76→82) taken 4 times.
5 if(!parserClassConfig(dataConfig.getVecClassConfig(), dataConfig.getVecInclude(), projectParam.configFile)){
121
4/4
✓ Branch 0 (77→78) taken 1 times.
✓ Branch 2 (78→79) taken 1 times.
✓ Branch 4 (79→80) taken 1 times.
✓ Branch 6 (80→81) taken 1 times.
1 std::cerr << "createClass : unexisting configuration file '"<<projectParam.configFile<<"'" << std::endl;
122 1 return false;
123 }
124
1/1
✓ Branch 0 (82→83) taken 4 times.
4 projectParam.vecDataConfig.push_back(dataConfig);
125
2/3
✓ Branch 0 (83→84) taken 4 times.
✗ Branch 2 (84→85) not taken.
✓ Branch 3 (84→92) taken 4 times.
4 if(!generator_class_full(manager, projectParam)){
126 std::cerr << "createClass : can't save file '"<<className<<"'[.h or .cpp] with configuration file '"<<projectParam.configFile<<"'" << std::endl;
127 return false;
128 }
129
2/2
✓ Branch 0 (94→95) taken 4 times.
✓ Branch 1 (94→97) taken 1 times.
5 }else{
130
3/3
✓ Branch 0 (98→99) taken 4 times.
✓ Branch 2 (99→100) taken 1 times.
✓ Branch 3 (99→103) taken 3 times.
4 if(className == ""){
131
2/2
✓ Branch 0 (100→101) taken 1 times.
✓ Branch 2 (101→102) taken 1 times.
1 std::cerr << "createClass : cannot create class with empty name" << std::endl;
132 1 return false;
133 }
134 3 PVecClassConfig vecClassConfig;
135
1/1
✓ Branch 0 (104→105) taken 3 times.
3 PClassConfig classConfig;
136
1/1
✓ Branch 0 (105→106) taken 3 times.
3 classConfig.setName(className);
137
138
1/1
✓ Branch 0 (106→107) taken 3 times.
3 classConfig.setListTemplate(templatedef);
139
140
1/1
✓ Branch 0 (107→108) taken 3 times.
3 vecClassConfig.push_back(classConfig);
141
3/4
✓ Branch 0 (109→110) taken 3 times.
✓ Branch 2 (110→111) taken 3 times.
✗ Branch 4 (113→114) not taken.
✓ Branch 5 (113→119) taken 3 times.
3 if(!generator_class_cpp(manager, vecClassConfig, projectParam.outputSourceDir, className, projectParam.mode, PVecPath())){
142 std::cerr << "createClass : can't save file '"<<className<<"'[.h or .cpp]" << std::endl;
143 return false;
144 }
145 3 }
146 7 return true;
147 9 }
148
149 ///Create header and source file name
150 /** @param sourceMode : arguments passed in the source mode
151 * @return true on success, false otherwise
152 */
153 2 bool createHeaderSource(const OptionMode & sourceMode){
154
2/2
✓ Branch 0 (2→3) taken 2 times.
✓ Branch 2 (3→4) taken 2 times.
2 PPath headerName("header");
155
2/2
✓ Branch 0 (5→6) taken 2 times.
✓ Branch 2 (6→7) taken 2 times.
2 sourceMode.getValue(headerName, "name");
156
2/2
✓ Branch 0 (8→9) taken 2 times.
✓ Branch 2 (9→10) taken 2 times.
2 PPath baseHeaderName(headerName.eraseExtension());
157
7/7
✓ Branch 0 (10→11) taken 2 times.
✓ Branch 2 (11→12) taken 2 times.
✓ Branch 4 (12→13) taken 2 times.
✓ Branch 6 (13→14) taken 2 times.
✓ Branch 8 (14→15) taken 2 times.
✓ Branch 10 (15→16) taken 2 times.
✓ Branch 12 (16→17) taken 2 times.
2 saveHeaderSourceFile(PPath(baseHeaderName + ".h"), PPath(baseHeaderName + ".cpp"));
158 2 return true;
159 2 }
160
161 ///Create project
162 /** @param projectMode : arguments passed in the project mode
163 * @return true on success, false otherwise
164 */
165 2 bool createProjectSource(const OptionMode & projectMode){
166
1/1
✓ Branch 0 (2→3) taken 2 times.
2 PPath descriptionFile;
167 2 PVecPath vecConfigFile;
168
1/1
✓ Branch 0 (4→5) taken 2 times.
2 PString projectType;
169
2/2
✓ Branch 0 (5→6) taken 2 times.
✓ Branch 2 (6→7) taken 2 times.
2 projectMode.getValue(vecConfigFile, "config");
170
2/2
✓ Branch 0 (8→9) taken 2 times.
✓ Branch 2 (9→10) taken 2 times.
2 projectMode.getValue(descriptionFile, "description");
171
2/2
✓ Branch 0 (11→12) taken 2 times.
✓ Branch 2 (12→13) taken 2 times.
2 projectMode.getValue(projectType, "type");
172
173
1/1
✓ Branch 0 (14→15) taken 2 times.
2 GeneratorMode mode;
174
2/2
✓ Branch 0 (15→16) taken 2 times.
✓ Branch 2 (16→17) taken 2 times.
2 mode.enableDataStream = projectMode.isOptionExist("datastream");
175
2/2
✓ Branch 0 (18→19) taken 2 times.
✓ Branch 2 (19→20) taken 2 times.
2 mode.enableTypeStream = projectMode.isOptionExist("typestream");
176
2/2
✓ Branch 0 (21→22) taken 2 times.
✓ Branch 2 (22→23) taken 2 times.
2 mode.enableConfigStream = projectMode.isOptionExist("configstream");
177
2/2
✓ Branch 0 (24→25) taken 2 times.
✓ Branch 2 (25→26) taken 2 times.
2 mode.enableCheckStream = projectMode.isOptionExist("checkstream");
178
2/2
✓ Branch 0 (27→28) taken 2 times.
✓ Branch 2 (28→29) taken 2 times.
2 mode.enableUnitTest = projectMode.isOptionExist("tests");
179
180
1/1
✓ Branch 0 (30→31) taken 2 times.
4 return simple_project_generator(descriptionFile, vecConfigFile, projectType, mode);
181 2 }
182
183 13 int main(int argc, char** argv){
184
1/1
✓ Branch 0 (2→3) taken 13 times.
13 OptionParser parser = createOptionParser();
185
1/1
✓ Branch 0 (3→4) taken 13 times.
13 parser.parseArgument(argc, argv);
186
187
2/2
✓ Branch 0 (4→5) taken 13 times.
✓ Branch 2 (5→6) taken 13 times.
13 const OptionMode & classMode = parser.getMode("class");
188
2/2
✓ Branch 0 (7→8) taken 13 times.
✓ Branch 2 (8→9) taken 13 times.
13 const OptionMode & sourceMode = parser.getMode("source");
189
2/2
✓ Branch 0 (10→11) taken 13 times.
✓ Branch 2 (11→12) taken 13 times.
13 const OptionMode & projectMode = parser.getMode("project");
190 13 bool b(true);
191
3/3
✓ Branch 0 (13→14) taken 13 times.
✓ Branch 2 (14→15) taken 9 times.
✓ Branch 3 (14→17) taken 4 times.
13 if(classMode.isParsed()){ //We are using the class mode
192
1/1
✓ Branch 0 (15→16) taken 9 times.
9 b &= createClass(classMode);
193 }
194
3/3
✓ Branch 0 (17→18) taken 13 times.
✓ Branch 2 (18→19) taken 2 times.
✓ Branch 3 (18→21) taken 11 times.
13 if(sourceMode.isParsed()){ //We are using the source mode
195
1/1
✓ Branch 0 (19→20) taken 2 times.
2 b &= createHeaderSource(sourceMode);
196 }
197
3/3
✓ Branch 0 (21→22) taken 13 times.
✓ Branch 2 (22→23) taken 2 times.
✓ Branch 3 (22→25) taken 11 times.
13 if(projectMode.isParsed()){ //We are using the project mode
198
1/1
✓ Branch 0 (23→24) taken 2 times.
2 b &= createProjectSource(projectMode);
199 }
200 13 return b - 1;
201 13 }
202
203
204
205