1010
1111from cppcheck_junit import (
1212 CppcheckError ,
13+ CppcheckLocation ,
1314 generate_single_success_test_suite ,
1415 generate_test_suite ,
1516 parse_arguments ,
@@ -27,13 +28,13 @@ def test_bad(self) -> None:
2728 errors = parse_cppcheck ("tests/cppcheck-out-bad.xml" )
2829
2930 self .assertEqual (errors [file1 ][0 ].file , file1 )
30- self .assertEqual (errors [file1 ][0 ].line , 4 )
31+ self .assertEqual (errors [file1 ][0 ].locations [ 0 ]. line , 4 )
3132 self .assertEqual (
3233 errors [file1 ][0 ].message , "Variable 'a' is assigned a value that is never used."
3334 )
3435
3536 self .assertEqual (errors [file1 ][1 ].file , file1 )
36- self .assertEqual (errors [file1 ][1 ].line , 4 )
37+ self .assertEqual (errors [file1 ][1 ].locations [ 0 ]. line , 4 )
3738 self .assertEqual (
3839 errors [file1 ][1 ].message , "Array 'a[10]' accessed at index 10, which is out of bounds."
3940 )
@@ -45,7 +46,7 @@ def test_no_location_element(self) -> None:
4546 self .assertEqual (len (errors ), 1 )
4647 error = errors [file ][0 ]
4748 self .assertEqual (error .file , file )
48- self .assertEqual (error .line , 0 )
49+ self .assertEqual (error .locations , [] )
4950 self .assertEqual (
5051 error .message ,
5152 "Too many #ifdef configurations - cppcheck only checks 12 configurations. "
@@ -61,7 +62,7 @@ def test_missing_include_no_location_element(self) -> None:
6162 self .assertEqual (len (errors ), 1 )
6263 error = errors [file ][0 ]
6364 self .assertEqual (error .file , file )
64- self .assertEqual (error .line , 0 )
65+ self .assertEqual (error .locations , [] )
6566 self .assertEqual (
6667 error .message ,
6768 "Cppcheck cannot find all the include files (use --check-config for details)" ,
@@ -78,25 +79,25 @@ def test_all(self) -> None:
7879 errors = parse_cppcheck ("tests/cppcheck-out-all.xml" )
7980
8081 self .assertEqual (errors [file1 ][0 ].file , file1 )
81- self .assertEqual (errors [file1 ][0 ].line , 4 )
82+ self .assertEqual (errors [file1 ][0 ].locations [ 0 ]. line , 4 )
8283 self .assertEqual (
8384 errors [file1 ][0 ].message , "Variable 'a' is assigned a value that is never used."
8485 )
8586
8687 self .assertEqual (errors [file1 ][1 ].file , file1 )
87- self .assertEqual (errors [file1 ][1 ].line , 4 )
88+ self .assertEqual (errors [file1 ][1 ].locations [ 0 ]. line , 4 )
8889 self .assertEqual (
8990 errors [file1 ][1 ].message , "Array 'a[10]' accessed at index 10, which is out of bounds."
9091 )
9192
9293 self .assertEqual (errors [file2 ][0 ].file , file2 )
93- self .assertEqual (errors [file2 ][0 ].line , 4 )
94+ self .assertEqual (errors [file2 ][0 ].locations [ 0 ]. line , 4 )
9495 self .assertEqual (
9596 errors [file2 ][0 ].message , "Variable 'a' is assigned a value that is never used."
9697 )
9798
9899 self .assertEqual (errors [file2 ][1 ].file , file2 )
99- self .assertEqual (errors [file2 ][1 ].line , 4 )
100+ self .assertEqual (errors [file2 ][1 ].locations [ 0 ]. line , 4 )
100101 self .assertEqual (
101102 errors [file2 ][1 ].message , "Array 'a[10]' accessed at index 10, which is out of bounds."
102103 )
@@ -136,7 +137,7 @@ def test_single(self) -> None:
136137 "file_name" : [
137138 CppcheckError (
138139 "file_name" ,
139- 4 ,
140+ [ CppcheckLocation ( "file_name" , 4 , 0 , "" )] ,
140141 "error message" ,
141142 "severity" ,
142143 "error_id" ,
@@ -161,8 +162,9 @@ def test_single(self) -> None:
161162
162163 error_element = testcase_element .find ("error" )
163164 self .assertEqual (error_element .get ("file" ), "file_name" )
164- self .assertEqual (error_element .get ("line" ), str (4 ))
165- self .assertEqual (error_element .get ("message" ), "4: (severity) error message" )
165+ self .assertEqual (error_element .get ("type" ), "severity" )
166+ self .assertEqual (error_element .get ("message" ), "error message" )
167+ self .assertEqual (error_element .text , "file_name:4:0: verbose error message" )
166168 # Check that error element is compliant with the spec
167169 for required_attribute in self .junit_error_attributes :
168170 self .assertTrue (required_attribute in error_element .attrib .keys ())
@@ -172,7 +174,7 @@ def test_missing_file(self) -> None:
172174 "" : [
173175 CppcheckError (
174176 file = "" ,
175- line = 0 ,
177+ locations = [] ,
176178 message = "Too many #ifdef configurations - cppcheck only checks "
177179 "12 configurations. Use --force to check all "
178180 "configurations. For more details, use "
@@ -206,14 +208,64 @@ def test_missing_file(self) -> None:
206208
207209 error_element = testcase_element .find ("error" )
208210 self .assertEqual (error_element .get ("file" ), "" )
209- self .assertEqual (error_element .get ("line" ), str (0 ))
210211 self .assertEqual (
211212 error_element .get ("message" ),
212- "0: (information) Too many #ifdef configurations - cppcheck only checks "
213+ "Too many #ifdef configurations - cppcheck only checks "
213214 "12 configurations. Use --force to check all "
214215 "configurations. For more details, use "
215216 "--enable=information." ,
216217 )
218+ self .assertEqual (
219+ error_element .text ,
220+ "The checking of the file will be interrupted because "
221+ "there are too many #ifdef configurations. Checking of "
222+ "all #ifdef configurations can be forced by --force "
223+ "command line option or from GUI preferences. However "
224+ "that may increase the checking time. For more details, "
225+ "use --enable=information." ,
226+ )
227+ # Check that error element is compliant with the spec
228+ for required_attribute in self .junit_error_attributes :
229+ self .assertTrue (required_attribute in error_element .attrib .keys ())
230+
231+ def test_multiple (self ) -> None :
232+ errors = {
233+ "file_name" : [
234+ CppcheckError (
235+ "file_name" ,
236+ [
237+ CppcheckLocation ("file_name" , 4 , 0 , "info" ),
238+ CppcheckLocation ("file_name" , 5 , 0 , "info" ),
239+ ],
240+ "error message" ,
241+ "severity" ,
242+ "error_id" ,
243+ "verbose error message" ,
244+ )
245+ ]
246+ }
247+ tree = generate_test_suite (errors )
248+ testsuite_element = tree .getroot ()
249+ self .assertEqual (testsuite_element .get ("errors" ), str (1 ))
250+ self .assertEqual (testsuite_element .get ("failures" ), str (0 ))
251+ self .assertEqual (testsuite_element .get ("tests" ), str (1 ))
252+ # Check that testsuite element is compliant with the spec
253+ for required_attribute in self .junit_testsuite_attributes :
254+ self .assertTrue (required_attribute in testsuite_element .attrib .keys ())
255+
256+ testcase_element = testsuite_element .find ("testcase" )
257+ self .assertEqual (testcase_element .get ("name" ), "file_name" )
258+ # Check that test_case is compliant with the spec
259+ for required_attribute in self .junit_testcase_attributes :
260+ self .assertTrue (required_attribute in testcase_element .attrib .keys ())
261+
262+ error_element = testcase_element .find ("error" )
263+ self .assertEqual (error_element .get ("file" ), "file_name" )
264+ self .assertEqual (error_element .get ("type" ), "severity" )
265+ self .assertEqual (error_element .get ("message" ), "error message" )
266+ self .assertEqual (
267+ error_element .text , "verbose error message\n file_name:4:0: info\n file_name:5:0: info"
268+ )
217269 # Check that error element is compliant with the spec
218270 for required_attribute in self .junit_error_attributes :
219271 self .assertTrue (required_attribute in error_element .attrib .keys ())
0 commit comments