Browse Source

extended tests for cyclomatic_switch_case_once metric

prozessorkern 8 months ago
parent
commit
2cb69c8603

+ 3 - 1
metrixpp/tests/general/test_std_code_cpp.py

@@ -14,7 +14,9 @@ class Test(tests.common.TestCase):
 
     def test_parser(self):
         
-        runner = tests.common.ToolRunner('collect', ['--std.code.complexity.cyclomatic'])
+        runner = tests.common.ToolRunner('collect',
+                                         ['--std.code.complexity.cyclomatic',
+                                          '--std.code.complexity.cyclomatic_switch_case_once'])
         self.assertExec(runner.run())
 
         runner = tests.common.ToolRunner('view', opts_list=['--format=xml'])

+ 13 - 0
metrixpp/tests/general/test_std_code_cpp/sources/test2.cpp

@@ -35,6 +35,19 @@ int main(int a, string b)
 	{
 
 	}
+	switch(a)
+	{
+	case 1:
+		break;
+	case 2:
+		break;
+	case 3:
+		break;
+	case 4:
+		break;
+	default:
+		break;
+	}
 }
 }
 

+ 1 - 1
metrixpp/tests/general/test_std_code_cpp/test_parser_limit_default_stdout.gold.txt

@@ -73,7 +73,7 @@
 ./test2.cpp:23: warning: Metric 'std.code.complexity:cyclomatic' for region 'main' exceeds the limit.
 	Metric name    : std.code.complexity:cyclomatic
 	Region name    : main
-	Metric value   : 2
+	Metric value   : 6
 	Modified       : None
 	Change trend   : None
 	Limit          : 0.0

+ 11 - 2
metrixpp/tests/general/test_std_code_cpp/test_parser_view_default_stdout.gold.txt

@@ -3,13 +3,22 @@
     <data>
         <aggregated-data>
             <std.code.complexity>
-                <cyclomatic avg="0.19767442" count="86" max="2" min="0" nonzero="False" sup="0" total="17.0">
+                <cyclomatic avg="0.24418605" count="86" max="6" min="0" nonzero="False" sup="0" total="21.0">
                     <distribution-bars>
                         <distribution-bar count="74" metric="0" ratio="0.86046512" />
                         <distribution-bar count="7" metric="1" ratio="0.08139535" />
-                        <distribution-bar count="5" metric="2" ratio="0.05813953" />
+                        <distribution-bar count="4" metric="2" ratio="0.04651163" />
+                        <distribution-bar count="1" metric="6" ratio="0.01162791" />
                     </distribution-bars>
                 </cyclomatic>
+                <cyclomatic_switch_case_once avg="0.20930233" count="86" max="3" min="0" nonzero="False" sup="0" total="18.0">
+                    <distribution-bars>
+                        <distribution-bar count="74" metric="0" ratio="0.86046512" />
+                        <distribution-bar count="7" metric="1" ratio="0.08139535" />
+                        <distribution-bar count="4" metric="2" ratio="0.04651163" />
+                        <distribution-bar count="1" metric="3" ratio="0.01162791" />
+                    </distribution-bars>
+                </cyclomatic_switch_case_once>
             </std.code.complexity>
         </aggregated-data>
         <file-data />

+ 150 - 11
metrixpp/tests/general/test_std_code_cpp/test_parser_view_files_stdout.gold.txt

@@ -26,6 +26,7 @@
 	Line numbers   : 5-8
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./function_ends_on_class.cpp:9: info: Metrics per 'function_end_on_struct' region
 	Region name    : function_end_on_struct
@@ -34,6 +35,7 @@
 	Line numbers   : 9-12
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./function_ends_on_class.cpp:13: info: Metrics per 'function_end_on_namespace' region
 	Region name    : function_end_on_namespace
@@ -42,6 +44,7 @@
 	Line numbers   : 13-16
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./function_ends_on_class.cpp:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
 	Average        : 0.0
@@ -52,6 +55,15 @@
 	  Metric value : Ratio : R-sum : Number of regions
 	             0 : 1.000 : 1.000 : 3	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
+./function_ends_on_class.cpp:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 0.0
+	Minimum        : 0
+	Maximum        : 0
+	Total          : 0.0
+	Distribution   : 3 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 1.000 : 1.000 : 3	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
 ./operator_test.hpp:0: info: Metrics per '__global__' region
 	Region name    : __global__
 	Region type    : global
@@ -73,6 +85,7 @@
 	Line numbers   : 3-29
 	Modified       : None
 	std.code.complexity:cyclomatic: 2
+	std.code.complexity:cyclomatic_switch_case_once: 2
 
 ./operator_test.hpp:31: info: Metrics per 'function_after' region
 	Region name    : function_after
@@ -81,6 +94,7 @@
 	Line numbers   : 31-31
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:35: info: Metrics per 'ALL_operators' region
 	Region name    : ALL_operators
@@ -96,6 +110,7 @@
 	Line numbers   : 36-36
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:37: info: Metrics per 'operator new' region
 	Region name    : operator new
@@ -104,6 +119,7 @@
 	Line numbers   : 37-37
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:38: info: Metrics per 'operator delete' region
 	Region name    : operator delete
@@ -112,6 +128,7 @@
 	Line numbers   : 38-38
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:39: info: Metrics per 'operator new[ ]' region
 	Region name    : operator new[ ]
@@ -120,6 +137,7 @@
 	Line numbers   : 39-39
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:40: info: Metrics per 'operator delete []' region
 	Region name    : operator delete []
@@ -128,6 +146,7 @@
 	Line numbers   : 40-40
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:41: info: Metrics per 'operator+' region
 	Region name    : operator+
@@ -136,6 +155,7 @@
 	Line numbers   : 41-41
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:42: info: Metrics per 'operator -' region
 	Region name    : operator -
@@ -144,6 +164,7 @@
 	Line numbers   : 42-42
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:43: info: Metrics per 'operator *' region
 	Region name    : operator *
@@ -152,6 +173,7 @@
 	Line numbers   : 43-43
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:44: info: Metrics per 'operator /' region
 	Region name    : operator /
@@ -160,6 +182,7 @@
 	Line numbers   : 44-44
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:45: info: Metrics per 'operator=' region
 	Region name    : operator=
@@ -168,6 +191,7 @@
 	Line numbers   : 45-45
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:46: info: Metrics per 'operator<' region
 	Region name    : operator<
@@ -176,6 +200,7 @@
 	Line numbers   : 46-46
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:47: info: Metrics per 'operator >' region
 	Region name    : operator >
@@ -184,6 +209,7 @@
 	Line numbers   : 47-47
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:48: info: Metrics per 'operator+=' region
 	Region name    : operator+=
@@ -192,6 +218,7 @@
 	Line numbers   : 48-48
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:49: info: Metrics per 'operator -=' region
 	Region name    : operator -=
@@ -200,6 +227,7 @@
 	Line numbers   : 49-49
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:50: info: Metrics per 'operator*=' region
 	Region name    : operator*=
@@ -208,6 +236,7 @@
 	Line numbers   : 50-50
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:51: info: Metrics per 'operator/=' region
 	Region name    : operator/=
@@ -216,6 +245,7 @@
 	Line numbers   : 51-51
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:52: info: Metrics per 'operator<<' region
 	Region name    : operator<<
@@ -224,6 +254,7 @@
 	Line numbers   : 52-52
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:53: info: Metrics per 'operator >>' region
 	Region name    : operator >>
@@ -232,6 +263,7 @@
 	Line numbers   : 53-53
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:54: info: Metrics per 'operator <<=' region
 	Region name    : operator <<=
@@ -240,6 +272,7 @@
 	Line numbers   : 54-54
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:55: info: Metrics per 'operator>>=' region
 	Region name    : operator>>=
@@ -248,6 +281,7 @@
 	Line numbers   : 55-55
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:56: info: Metrics per 'operator==' region
 	Region name    : operator==
@@ -256,6 +290,7 @@
 	Line numbers   : 56-56
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:57: info: Metrics per 'operator!=' region
 	Region name    : operator!=
@@ -264,6 +299,7 @@
 	Line numbers   : 57-57
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:58: info: Metrics per 'operator<=' region
 	Region name    : operator<=
@@ -272,6 +308,7 @@
 	Line numbers   : 58-58
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:59: info: Metrics per 'operator >=' region
 	Region name    : operator >=
@@ -280,6 +317,7 @@
 	Line numbers   : 59-59
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:60: info: Metrics per 'operator ++' region
 	Region name    : operator ++
@@ -288,6 +326,7 @@
 	Line numbers   : 60-60
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:61: info: Metrics per 'operator--' region
 	Region name    : operator--
@@ -296,6 +335,7 @@
 	Line numbers   : 61-61
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:62: info: Metrics per 'operator%' region
 	Region name    : operator%
@@ -304,6 +344,7 @@
 	Line numbers   : 62-62
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:63: info: Metrics per 'operator &' region
 	Region name    : operator &
@@ -312,6 +353,7 @@
 	Line numbers   : 63-63
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:64: info: Metrics per 'operator ^' region
 	Region name    : operator ^
@@ -320,6 +362,7 @@
 	Line numbers   : 64-64
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:65: info: Metrics per 'operator !' region
 	Region name    : operator !
@@ -328,6 +371,7 @@
 	Line numbers   : 65-65
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:66: info: Metrics per 'operator|' region
 	Region name    : operator|
@@ -336,6 +380,7 @@
 	Line numbers   : 66-66
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:67: info: Metrics per 'operator~' region
 	Region name    : operator~
@@ -344,6 +389,7 @@
 	Line numbers   : 67-67
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:68: info: Metrics per 'operator &=' region
 	Region name    : operator &=
@@ -352,6 +398,7 @@
 	Line numbers   : 68-68
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:69: info: Metrics per 'operator ^=' region
 	Region name    : operator ^=
@@ -360,6 +407,7 @@
 	Line numbers   : 69-69
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:70: info: Metrics per 'operator |=' region
 	Region name    : operator |=
@@ -368,6 +416,7 @@
 	Line numbers   : 70-70
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:71: info: Metrics per 'operator &&' region
 	Region name    : operator &&
@@ -376,6 +425,7 @@
 	Line numbers   : 71-71
 	Modified       : None
 	std.code.complexity:cyclomatic: 1
+	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./operator_test.hpp:72: info: Metrics per 'operator ||' region
 	Region name    : operator ||
@@ -384,6 +434,7 @@
 	Line numbers   : 72-72
 	Modified       : None
 	std.code.complexity:cyclomatic: 1
+	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./operator_test.hpp:73: info: Metrics per 'operator %=' region
 	Region name    : operator %=
@@ -392,6 +443,7 @@
 	Line numbers   : 73-73
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:74: info: Metrics per 'operator []' region
 	Region name    : operator []
@@ -400,6 +452,7 @@
 	Line numbers   : 74-74
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:75: info: Metrics per 'operator  ()' region
 	Region name    : operator  ()
@@ -408,6 +461,7 @@
 	Line numbers   : 75-75
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:76: info: Metrics per 'operator()' region
 	Region name    : operator()
@@ -416,6 +470,7 @@
 	Line numbers   : 76-76
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:77: info: Metrics per 'operator()' region
 	Region name    : operator()
@@ -424,6 +479,7 @@
 	Line numbers   : 77-77
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:78: info: Metrics per 'operator()' region
 	Region name    : operator()
@@ -432,6 +488,7 @@
 	Line numbers   : 78-78
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:79: info: Metrics per 'operator ()' region
 	Region name    : operator ()
@@ -440,6 +497,7 @@
 	Line numbers   : 79-79
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:80: info: Metrics per 'operator ()' region
 	Region name    : operator ()
@@ -448,6 +506,7 @@
 	Line numbers   : 80-80
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:81: info: Metrics per 'operator ,' region
 	Region name    : operator ,
@@ -456,6 +515,7 @@
 	Line numbers   : 81-81
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:82: info: Metrics per 'operator ->*' region
 	Region name    : operator ->*
@@ -464,6 +524,7 @@
 	Line numbers   : 82-82
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:83: info: Metrics per 'operator->' region
 	Region name    : operator->
@@ -472,6 +533,7 @@
 	Line numbers   : 83-83
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:84: info: Metrics per 'operator.' region
 	Region name    : operator.
@@ -480,6 +542,7 @@
 	Line numbers   : 84-84
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./operator_test.hpp:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
 	Average        : 0.07843137
@@ -492,6 +555,17 @@
 	             1 : 0.039 : 0.980 :  2	|||
 	             2 : 0.020 : 1.000 :  1	|
 
+./operator_test.hpp:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 0.07843137
+	Minimum        : 0
+	Maximum        : 2
+	Total          : 4.0
+	Distribution   : 51 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 0.941 : 0.941 : 48	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+	             1 : 0.039 : 0.980 :  2	|||
+	             2 : 0.020 : 1.000 :  1	|
+
 ./test.c:0: info: Metrics per '__global__' region
 	Region name    : __global__
 	Region type    : global
@@ -506,6 +580,7 @@
 	Line numbers   : 12-14
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:108: info: Metrics per 'boost' region
 	Region name    : boost
@@ -528,6 +603,7 @@
 	Line numbers   : 125-125
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:134: info: Metrics per 'mycontainer' region
 	Region name    : mycontainer
@@ -543,6 +619,7 @@
 	Line numbers   : 136-137
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:138: info: Metrics per 'increase' region
 	Region name    : increase
@@ -551,6 +628,7 @@
 	Line numbers   : 138-138
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:143: info: Metrics per 'mycontainer' region
 	Region name    : mycontainer
@@ -566,6 +644,7 @@
 	Line numbers   : 145-146
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:147: info: Metrics per 'uppercase' region
 	Region name    : uppercase
@@ -574,6 +653,7 @@
 	Line numbers   : 147-152
 	Modified       : None
 	std.code.complexity:cyclomatic: 2
+	std.code.complexity:cyclomatic_switch_case_once: 2
 
 ./test.c:156: info: Metrics per 'main' region
 	Region name    : main
@@ -582,6 +662,7 @@
 	Line numbers   : 155-162
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:164: info: Metrics per 'scoped_ptr' region
 	Region name    : scoped_ptr
@@ -597,6 +678,7 @@
 	Line numbers   : 185-190
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:192: info: Metrics per 'scoped_ptr' region
 	Region name    : scoped_ptr
@@ -605,6 +687,7 @@
 	Line numbers   : 192-198
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:202: info: Metrics per 'scoped_ptr' region
 	Region name    : scoped_ptr
@@ -613,6 +696,7 @@
 	Line numbers   : 202-207
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:210: info: Metrics per '~scoped_ptr' region
 	Region name    : ~scoped_ptr
@@ -621,6 +705,7 @@
 	Line numbers   : 209-216
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:216: info: Metrics per 'reset' region
 	Region name    : reset
@@ -629,6 +714,7 @@
 	Line numbers   : 216-220
 	Modified       : None
 	std.code.complexity:cyclomatic: 1
+	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./test.c:220: info: Metrics per 'operator*' region
 	Region name    : operator*
@@ -637,6 +723,7 @@
 	Line numbers   : 220-224
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:226: info: Metrics per 'operator->' region
 	Region name    : operator->
@@ -645,6 +732,7 @@
 	Line numbers   : 226-230
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:232: info: Metrics per 'operator  float' region
 	Region name    : operator  float
@@ -653,6 +741,7 @@
 	Line numbers   : 232-236
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:238: info: Metrics per 'get' region
 	Region name    : get
@@ -661,6 +750,7 @@
 	Line numbers   : 238-241
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:246: info: Metrics per 'swap' region
 	Region name    : swap
@@ -669,6 +759,7 @@
 	Line numbers   : 246-251
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:254: info: Metrics per 'swap' region
 	Region name    : swap
@@ -677,6 +768,7 @@
 	Line numbers   : 254-257
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:261: info: Metrics per 'get_pointer' region
 	Region name    : get_pointer
@@ -685,6 +777,7 @@
 	Line numbers   : 261-264
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:276: info: Metrics per 'Central' region
 	Region name    : Central
@@ -700,6 +793,7 @@
 	Line numbers   : 277-294
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:296: info: Metrics per 'save' region
 	Region name    : save
@@ -708,6 +802,7 @@
 	Line numbers   : 296-321
 	Modified       : None
 	std.code.complexity:cyclomatic: 1
+	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./test.c:323: info: Metrics per 'show' region
 	Region name    : show
@@ -716,6 +811,7 @@
 	Line numbers   : 323-330
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:332: info: Metrics per 'main' region
 	Region name    : main
@@ -724,6 +820,7 @@
 	Line numbers   : 332-344
 	Modified       : None
 	std.code.complexity:cyclomatic: 2
+	std.code.complexity:cyclomatic_switch_case_once: 2
 
 ./test.c:349: info: Metrics per 'f1' region
 	Region name    : f1
@@ -732,6 +829,7 @@
 	Line numbers   : 349-349
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test.c:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
 	Average        : 0.25
@@ -744,11 +842,22 @@
 	             1 : 0.083 : 0.917 :  2	||||||||
 	             2 : 0.083 : 1.000 :  2	||||||||
 
+./test.c:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 0.25
+	Minimum        : 0
+	Maximum        : 2
+	Total          : 6.0
+	Distribution   : 24 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 0.833 : 0.833 : 20	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+	             1 : 0.083 : 0.917 :  2	||||||||
+	             2 : 0.083 : 1.000 :  2	||||||||
+
 ./test2.cpp:0: info: Metrics per '__global__' region
 	Region name    : __global__
 	Region type    : global
-	Offsets        : 0-628
-	Line numbers   : 1-53
+	Offsets        : 0-736
+	Line numbers   : 1-66
 	Modified       : None
 
 ./test2.cpp:5: info: Metrics per 'A' region
@@ -765,6 +874,7 @@
 	Line numbers   : 7-10
 	Modified       : None
 	std.code.complexity:cyclomatic: 1
+	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./test2.cpp:10: info: Metrics per 'method' region
 	Region name    : method
@@ -773,6 +883,7 @@
 	Line numbers   : 10-13
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test2.cpp:13: info: Metrics per 'operator ++' region
 	Region name    : operator ++
@@ -781,32 +892,45 @@
 	Line numbers   : 13-16
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test2.cpp:22: info: Metrics per 'aaa' region
 	Region name    : aaa
 	Region type    : namespace
-	Offsets        : 173-350
-	Line numbers   : 21-39
+	Offsets        : 173-458
+	Line numbers   : 21-52
 	Modified       : None
 
 ./test2.cpp:23: info: Metrics per 'main' region
 	Region name    : main
 	Region type    : function
-	Offsets        : 192-348
-	Line numbers   : 23-38
+	Offsets        : 192-456
+	Line numbers   : 23-51
 	Modified       : None
-	std.code.complexity:cyclomatic: 2
+	std.code.complexity:cyclomatic: 6
+	std.code.complexity:cyclomatic_switch_case_once: 3
 
 ./test2.cpp:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
-	Average        : 0.75
+	Average        : 1.75
 	Minimum        : 0
-	Maximum        : 2
-	Total          : 3.0
+	Maximum        : 6
+	Total          : 7.0
 	Distribution   : 4 regions in total (including 0 suppressed)
 	  Metric value : Ratio : R-sum : Number of regions
 	             0 : 0.500 : 0.500 : 2	||||||||||||||||||||||||||||||||||||||||||||||||||
 	             1 : 0.250 : 0.750 : 1	|||||||||||||||||||||||||
-	             2 : 0.250 : 1.000 : 1	|||||||||||||||||||||||||
+	             6 : 0.250 : 1.000 : 1	|||||||||||||||||||||||||
+
+./test2.cpp:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 1.0
+	Minimum        : 0
+	Maximum        : 3
+	Total          : 4.0
+	Distribution   : 4 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 0.500 : 0.500 : 2	||||||||||||||||||||||||||||||||||||||||||||||||||
+	             1 : 0.250 : 0.750 : 1	|||||||||||||||||||||||||
+	             3 : 0.250 : 1.000 : 1	|||||||||||||||||||||||||
 
 ./test3.cpp:0: info: Metrics per '__global__' region
 	Region name    : __global__
@@ -829,6 +953,7 @@
 	Line numbers   : 38-48
 	Modified       : None
 	std.code.complexity:cyclomatic: 1
+	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./test3.cpp:53: info: Metrics per 'doFont' region
 	Region name    : doFont
@@ -837,6 +962,7 @@
 	Line numbers   : 53-66
 	Modified       : None
 	std.code.complexity:cyclomatic: 1
+	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./test3.cpp:72: info: Metrics per 'doFont222' region
 	Region name    : doFont222
@@ -845,6 +971,7 @@
 	Line numbers   : 68-87
 	Modified       : None
 	std.code.complexity:cyclomatic: 2
+	std.code.complexity:cyclomatic_switch_case_once: 2
 
 ./test3.cpp:90: info: Metrics per 'not_closed' region
 	Region name    : not_closed
@@ -860,6 +987,7 @@
 	Line numbers   : 110-120
 	Modified       : None
 	std.code.complexity:cyclomatic: 0
+	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./test3.cpp:102: info: Metrics per '__noname__' region
 	Region name    : __noname__
@@ -886,4 +1014,15 @@
 	             1 : 0.500 : 0.750 : 2	||||||||||||||||||||||||||||||||||||||||||||||||||
 	             2 : 0.250 : 1.000 : 1	|||||||||||||||||||||||||
 
+./test3.cpp:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 1.0
+	Minimum        : 0
+	Maximum        : 2
+	Total          : 4.0
+	Distribution   : 4 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 0.250 : 0.250 : 1	|||||||||||||||||||||||||
+	             1 : 0.500 : 0.750 : 2	||||||||||||||||||||||||||||||||||||||||||||||||||
+	             2 : 0.250 : 1.000 : 1	|||||||||||||||||||||||||
+
 

+ 3 - 1
metrixpp/tests/general/test_std_code_cs.py

@@ -14,7 +14,9 @@ class Test(tests.common.TestCase):
 
     def test_parser(self):
         
-        runner = tests.common.ToolRunner('collect', ['--std.code.complexity.cyclomatic'])
+        runner = tests.common.ToolRunner('collect',
+                                         ['--std.code.complexity.cyclomatic',
+                                          '--std.code.complexity.cyclomatic_switch_case_once'])
         self.assertExec(runner.run())
 
         runner = tests.common.ToolRunner('view', ['--nest-regions', '--format=xml'])

+ 14 - 0
metrixpp/tests/general/test_std_code_cs/sources/Generics.cs

@@ -53,6 +53,20 @@ public static class Generics
 			{
 				this.Size(capacity);
 			}
+
+			switch(capacity)
+			{
+				case 1:
+					break;
+				case 2:
+					break;
+				case 3:
+					break;
+				case 4:
+					break;
+				default:
+					break;
+			}
 		}
 	}
 	

+ 1 - 1
metrixpp/tests/general/test_std_code_cs/test_parser_limit_default_stdout.gold.txt

@@ -118,7 +118,7 @@
 ./Generics.cs:50: warning: Metric 'std.code.complexity:cyclomatic' for region 'Grow' exceeds the limit.
 	Metric name    : std.code.complexity:cyclomatic
 	Region name    : Grow
-	Metric value   : 1
+	Metric value   : 5
 	Modified       : None
 	Change trend   : None
 	Limit          : 0.0

+ 14 - 3
metrixpp/tests/general/test_std_code_cs/test_parser_view_default_stdout.gold.txt

@@ -3,17 +3,28 @@
     <data>
         <aggregated-data>
             <std.code.complexity>
-                <cyclomatic avg="1.15384615" count="39" max="6" min="0" nonzero="False" sup="0" total="45.0">
+                <cyclomatic avg="1.25641026" count="39" max="6" min="0" nonzero="False" sup="0" total="49.0">
                     <distribution-bars>
                         <distribution-bar count="23" metric="0" ratio="0.58974359" />
-                        <distribution-bar count="7" metric="1" ratio="0.17948718" />
+                        <distribution-bar count="6" metric="1" ratio="0.15384615" />
                         <distribution-bar count="1" metric="2" ratio="0.02564103" />
                         <distribution-bar count="1" metric="3" ratio="0.02564103" />
                         <distribution-bar count="3" metric="4" ratio="0.07692308" />
-                        <distribution-bar count="3" metric="5" ratio="0.07692308" />
+                        <distribution-bar count="4" metric="5" ratio="0.1025641" />
                         <distribution-bar count="1" metric="6" ratio="0.02564103" />
                     </distribution-bars>
                 </cyclomatic>
+                <cyclomatic_switch_case_once avg="1.17948718" count="39" max="6" min="0" nonzero="False" sup="0" total="46.0">
+                    <distribution-bars>
+                        <distribution-bar count="23" metric="0" ratio="0.58974359" />
+                        <distribution-bar count="6" metric="1" ratio="0.15384615" />
+                        <distribution-bar count="2" metric="2" ratio="0.05128205" />
+                        <distribution-bar count="1" metric="3" ratio="0.02564103" />
+                        <distribution-bar count="3" metric="4" ratio="0.07692308" />
+                        <distribution-bar count="3" metric="5" ratio="0.07692308" />
+                        <distribution-bar count="1" metric="6" ratio="0.02564103" />
+                    </distribution-bars>
+                </cyclomatic_switch_case_once>
             </std.code.complexity>
         </aggregated-data>
         <file-data />

+ 112 - 37
metrixpp/tests/general/test_std_code_cs/test_parser_view_files_stdout.gold.txt

@@ -26,6 +26,7 @@
             	Line numbers   : 74-89
             	Modified       : None
             	std.code.complexity:cyclomatic: 3
+            	std.code.complexity:cyclomatic_switch_case_once: 3
 
 .   .   .   ./File.cs:95: info: Metrics per 'get' region
             	Region name    : get
@@ -34,6 +35,7 @@
             	Line numbers   : 95-114
             	Modified       : None
             	std.code.complexity:cyclomatic: 2
+            	std.code.complexity:cyclomatic_switch_case_once: 2
 
 .   .   .   ./File.cs:120: info: Metrics per 'get' region
             	Region name    : get
@@ -42,6 +44,7 @@
             	Line numbers   : 120-128
             	Modified       : None
             	std.code.complexity:cyclomatic: 1
+            	std.code.complexity:cyclomatic_switch_case_once: 1
 
 .   .   .   ./File.cs:134: info: Metrics per 'get' region
             	Region name    : get
@@ -50,6 +53,7 @@
             	Line numbers   : 134-142
             	Modified       : None
             	std.code.complexity:cyclomatic: 1
+            	std.code.complexity:cyclomatic_switch_case_once: 1
 
 .   .   .   ./File.cs:148: info: Metrics per 'get' region
             	Region name    : get
@@ -58,6 +62,7 @@
             	Line numbers   : 148-156
             	Modified       : None
             	std.code.complexity:cyclomatic: 1
+            	std.code.complexity:cyclomatic_switch_case_once: 1
 
 .   .   .   ./File.cs:160: info: Metrics per 'Close' region
             	Region name    : Close
@@ -66,6 +71,7 @@
             	Line numbers   : 159-187
             	Modified       : None
             	std.code.complexity:cyclomatic: 4
+            	std.code.complexity:cyclomatic_switch_case_once: 4
 
 .   .   .   ./File.cs:190: info: Metrics per 'SetRecord' region
             	Region name    : SetRecord
@@ -74,6 +80,7 @@
             	Line numbers   : 189-226
             	Modified       : None
             	std.code.complexity:cyclomatic: 6
+            	std.code.complexity:cyclomatic_switch_case_once: 6
 
 .   .   .   ./File.cs:229: info: Metrics per 'FileTable' region
             	Region name    : FileTable
@@ -89,6 +96,7 @@
                 	Line numbers   : 235-240
                 	Modified       : None
                 	std.code.complexity:cyclomatic: 0
+                	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./File.cs:245: info: Metrics per 'GetFile' region
             	Region name    : GetFile
@@ -97,6 +105,7 @@
             	Line numbers   : 244-274
             	Modified       : None
             	std.code.complexity:cyclomatic: 5
+            	std.code.complexity:cyclomatic_switch_case_once: 5
 
 .   .   .   ./File.cs:277: info: Metrics per 'GetFile' region
             	Region name    : GetFile
@@ -105,6 +114,7 @@
             	Line numbers   : 276-285
             	Modified       : None
             	std.code.complexity:cyclomatic: 1
+            	std.code.complexity:cyclomatic_switch_case_once: 1
 
 .   .   .   ./File.cs:288: info: Metrics per 'AllocateFile' region
             	Region name    : AllocateFile
@@ -113,6 +123,7 @@
             	Line numbers   : 287-324
             	Modified       : None
             	std.code.complexity:cyclomatic: 5
+            	std.code.complexity:cyclomatic_switch_case_once: 5
 
 .   .   .   ./File.cs:327: info: Metrics per 'FindFreeFile' region
             	Region name    : FindFreeFile
@@ -121,6 +132,7 @@
             	Line numbers   : 326-358
             	Modified       : None
             	std.code.complexity:cyclomatic: 5
+            	std.code.complexity:cyclomatic_switch_case_once: 5
 
 .   .   .   ./File.cs:361: info: Metrics per 'CloseAll' region
             	Region name    : CloseAll
@@ -129,6 +141,7 @@
             	Line numbers   : 360-387
             	Modified       : None
             	std.code.complexity:cyclomatic: 4
+            	std.code.complexity:cyclomatic_switch_case_once: 4
 
 .   .   .   ./File.cs:391: info: Metrics per 'Write' region
             	Region name    : Write
@@ -137,6 +150,7 @@
             	Line numbers   : 389-394
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./File.cs:398: info: Metrics per 'WriteLine' region
             	Region name    : WriteLine
@@ -145,6 +159,7 @@
             	Line numbers   : 396-401
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./File.cs:405: info: Metrics per 'Tab' region
             	Region name    : Tab
@@ -153,6 +168,7 @@
             	Line numbers   : 403-408
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./File.cs:412: info: Metrics per 'Space' region
             	Region name    : Space
@@ -161,6 +177,7 @@
             	Line numbers   : 410-415
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./File.cs:419: info: Metrics per 'Lock' region
             	Region name    : Lock
@@ -169,6 +186,7 @@
             	Line numbers   : 417-422
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./File.cs:426: info: Metrics per 'Unlock' region
             	Region name    : Unlock
@@ -177,6 +195,7 @@
             	Line numbers   : 424-435
             	Modified       : None
             	std.code.complexity:cyclomatic: 1
+            	std.code.complexity:cyclomatic_switch_case_once: 1
 
 ./File.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
 	Average        : 2.05263158
@@ -193,25 +212,40 @@
 	             5 : 0.158 : 0.947 :  3	|||||||||||||||
 	             6 : 0.053 : 1.000 :  1	|||||
 
+./File.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 2.05263158
+	Minimum        : 0
+	Maximum        : 6
+	Total          : 39.0
+	Distribution   : 19 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 0.316 : 0.316 :  6	|||||||||||||||||||||||||||||||
+	             1 : 0.263 : 0.579 :  5	||||||||||||||||||||||||||
+	             2 : 0.053 : 0.632 :  1	|||||
+	             3 : 0.053 : 0.684 :  1	|||||
+	             4 : 0.105 : 0.789 :  2	||||||||||
+	             5 : 0.158 : 0.947 :  3	|||||||||||||||
+	             6 : 0.053 : 1.000 :  1	|||||
+
 ./Generics.cs:0: info: Metrics per '__global__' region
 	Region name    : __global__
 	Region type    : global
-	Offsets        : 0-3134
-	Line numbers   : 1-106
+	Offsets        : 0-3286
+	Line numbers   : 1-120
 	Modified       : None
 
 .   ./Generics.cs:22: info: Metrics per 'Generics' region
     	Region name    : Generics
     	Region type    : class
-    	Offsets        : 1182-3133
-    	Line numbers   : 22-105
+    	Offsets        : 1182-3285
+    	Line numbers   : 22-119
     	Modified       : None
 
 .   .   ./Generics.cs:24: info: Metrics per 'MyArray<T>' region
         	Region name    : MyArray<T>
         	Region type    : class
-        	Offsets        : 1214-1664
-        	Line numbers   : 24-57
+        	Offsets        : 1214-1816
+        	Line numbers   : 24-71
         	Modified       : None
 
 .   .   .   ./Generics.cs:26: info: Metrics per 'NestedClass<Y>' region
@@ -228,6 +262,7 @@
             	Line numbers   : 40-43
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./Generics.cs:45: info: Metrics per 'Size' region
             	Region name    : Size
@@ -236,85 +271,102 @@
             	Line numbers   : 45-48
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./Generics.cs:50: info: Metrics per 'Grow' region
             	Region name    : Grow
             	Region type    : function
-            	Offsets        : 1552-1661
-            	Line numbers   : 50-56
+            	Offsets        : 1552-1813
+            	Line numbers   : 50-70
             	Modified       : None
-            	std.code.complexity:cyclomatic: 1
+            	std.code.complexity:cyclomatic: 5
+            	std.code.complexity:cyclomatic_switch_case_once: 2
 
-.   .   ./Generics.cs:59: info: Metrics per 'IInterface' region
+.   .   ./Generics.cs:73: info: Metrics per 'IInterface' region
         	Region name    : IInterface
         	Region type    : interface
-        	Offsets        : 1668-1775
-        	Line numbers   : 59-63
+        	Offsets        : 1820-1927
+        	Line numbers   : 73-77
         	Modified       : None
 
-.   .   ./Generics.cs:65: info: Metrics per 'Base' region
+.   .   ./Generics.cs:79: info: Metrics per 'Base' region
         	Region name    : Base
         	Region type    : class
-        	Offsets        : 1779-2084
-        	Line numbers   : 65-74
+        	Offsets        : 1931-2236
+        	Line numbers   : 79-88
         	Modified       : None
 
-.   .   .   ./Generics.cs:71: info: Metrics per 'Generics.IInterface.Method2<T>' region
+.   .   .   ./Generics.cs:85: info: Metrics per 'Generics.IInterface.Method2<T>' region
             	Region name    : Generics.IInterface.Method2<T>
             	Region type    : function
-            	Offsets        : 1960-2081
-            	Line numbers   : 70-73
+            	Offsets        : 2112-2233
+            	Line numbers   : 84-87
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
-.   .   ./Generics.cs:76: info: Metrics per 'Derived' region
+.   .   ./Generics.cs:90: info: Metrics per 'Derived' region
         	Region name    : Derived
         	Region type    : class
-        	Offsets        : 2088-2245
-        	Line numbers   : 76-82
+        	Offsets        : 2240-2397
+        	Line numbers   : 90-96
         	Modified       : None
 
-.   .   .   ./Generics.cs:79: info: Metrics per 'Method1<T>' region
+.   .   .   ./Generics.cs:93: info: Metrics per 'Method1<T>' region
             	Region name    : Method1<T>
             	Region type    : function
-            	Offsets        : 2130-2242
-            	Line numbers   : 78-81
+            	Offsets        : 2282-2394
+            	Line numbers   : 92-95
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
-.   .   ./Generics.cs:92: info: Metrics per 'MethodWithConstraint<T,S>' region
+.   .   ./Generics.cs:106: info: Metrics per 'MethodWithConstraint<T,S>' region
         	Region name    : MethodWithConstraint<T,S>
         	Region type    : function
-        	Offsets        : 2698-2798
-        	Line numbers   : 92-94
+        	Offsets        : 2850-2950
+        	Line numbers   : 106-108
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
-.   .   ./Generics.cs:96: info: Metrics per 'MethodWithStructConstraint<T>' region
+.   .   ./Generics.cs:110: info: Metrics per 'MethodWithStructConstraint<T>' region
         	Region name    : MethodWithStructConstraint<T>
         	Region type    : function
-        	Offsets        : 2802-2875
-        	Line numbers   : 96-98
+        	Offsets        : 2954-3027
+        	Line numbers   : 110-112
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
-.   .   ./Generics.cs:100: info: Metrics per 'GetEnumerator' region
+.   .   ./Generics.cs:114: info: Metrics per 'GetEnumerator' region
         	Region name    : GetEnumerator
         	Region type    : function
-        	Offsets        : 2879-3131
-        	Line numbers   : 100-104
+        	Offsets        : 3031-3283
+        	Line numbers   : 114-118
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./Generics.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
-	Average        : 0.125
+	Average        : 0.625
 	Minimum        : 0
-	Maximum        : 1
-	Total          : 1.0
+	Maximum        : 5
+	Total          : 5.0
+	Distribution   : 8 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 0.875 : 0.875 : 7	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+	             5 : 0.125 : 1.000 : 1	||||||||||||
+
+./Generics.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 0.25
+	Minimum        : 0
+	Maximum        : 2
+	Total          : 2.0
 	Distribution   : 8 regions in total (including 0 suppressed)
 	  Metric value : Ratio : R-sum : Number of regions
 	             0 : 0.875 : 0.875 : 7	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-	             1 : 0.125 : 1.000 : 1	||||||||||||
+	             2 : 0.125 : 1.000 : 1	||||||||||||
 
 ./interface.cs:0: info: Metrics per '__global__' region
 	Region name    : __global__
@@ -358,6 +410,7 @@
             	Line numbers   : 75-83
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:88: info: Metrics per 'get' region
             	Region name    : get
@@ -366,6 +419,7 @@
             	Line numbers   : 88-92
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:98: info: Metrics per 'get' region
             	Region name    : get
@@ -374,6 +428,7 @@
             	Line numbers   : 98-102
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:108: info: Metrics per 'get' region
             	Region name    : get
@@ -382,6 +437,7 @@
             	Line numbers   : 108-112
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:118: info: Metrics per 'get' region
             	Region name    : get
@@ -390,6 +446,7 @@
             	Line numbers   : 118-122
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:128: info: Metrics per 'get' region
             	Region name    : get
@@ -398,6 +455,7 @@
             	Line numbers   : 128-131
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:135: info: Metrics per 'Equals' region
             	Region name    : Equals
@@ -406,6 +464,7 @@
             	Line numbers   : 134-146
             	Modified       : None
             	std.code.complexity:cyclomatic: 1
+            	std.code.complexity:cyclomatic_switch_case_once: 1
 
 .   .   .   ./interface.cs:149: info: Metrics per 'GetHashCode' region
             	Region name    : GetHashCode
@@ -414,6 +473,7 @@
             	Line numbers   : 148-152
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:169: info: Metrics per 'ToTitleCase' region
             	Region name    : ToTitleCase
@@ -422,6 +482,7 @@
             	Line numbers   : 168-195
             	Modified       : None
             	std.code.complexity:cyclomatic: 4
+            	std.code.complexity:cyclomatic_switch_case_once: 4
 
 .   .   .   ./interface.cs:198: info: Metrics per 'I.Deserialization.Callback.OnDeserialization' region
             	Region name    : I.Deserialization.Callback.OnDeserialization
@@ -430,6 +491,7 @@
             	Line numbers   : 197-201
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:204: info: Metrics per 'ToString' region
             	Region name    : ToString
@@ -438,6 +500,7 @@
             	Line numbers   : 203-207
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   .   ./interface.cs:211: info: Metrics per 'IDeserializationCallback.OnDeserialization' region
             	Region name    : IDeserializationCallback.OnDeserialization
@@ -446,6 +509,7 @@
             	Line numbers   : 209-214
             	Modified       : None
             	std.code.complexity:cyclomatic: 0
+            	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./interface.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
 	Average        : 0.41666667
@@ -458,4 +522,15 @@
 	             1 : 0.083 : 0.917 :  1	||||||||
 	             4 : 0.083 : 1.000 :  1	||||||||
 
+./interface.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 0.41666667
+	Minimum        : 0
+	Maximum        : 4
+	Total          : 5.0
+	Distribution   : 12 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 0.833 : 0.833 : 10	|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+	             1 : 0.083 : 0.917 :  1	||||||||
+	             4 : 0.083 : 1.000 :  1	||||||||
+
 

+ 3 - 1
metrixpp/tests/general/test_std_code_cs_unit.py

@@ -14,7 +14,9 @@ class Test(tests.common.TestCase):
 
     def test_parser(self):
         
-        runner = tests.common.ToolRunner('collect', ['--std.code.complexity.cyclomatic'])
+        runner = tests.common.ToolRunner('collect',
+                                         ['--std.code.complexity.cyclomatic',
+                                          '--std.code.complexity.cyclomatic_switch_case_once'])
         self.assertExec(runner.run())
 
         runner = tests.common.ToolRunner('view', ['--nest-regions', '--format=xml'])

+ 5 - 0
metrixpp/tests/general/test_std_code_cs_unit/test_parser_view_default_stdout.gold.txt

@@ -8,6 +8,11 @@
                         <distribution-bar count="18" metric="0" ratio="1.0" />
                     </distribution-bars>
                 </cyclomatic>
+                <cyclomatic_switch_case_once avg="0.0" count="18" max="0" min="0" nonzero="False" sup="0" total="0.0">
+                    <distribution-bars>
+                        <distribution-bar count="18" metric="0" ratio="1.0" />
+                    </distribution-bars>
+                </cyclomatic_switch_case_once>
             </std.code.complexity>
         </aggregated-data>
         <file-data />

+ 27 - 0
metrixpp/tests/general/test_std_code_cs_unit/test_parser_view_files_stdout.gold.txt

@@ -19,6 +19,7 @@
         	Line numbers   : 5-9
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:11: info: Metrics per 'testfunction2<T>' region
         	Region name    : testfunction2<T>
@@ -27,6 +28,7 @@
         	Line numbers   : 11-15
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:17: info: Metrics per 'testfunction3<T>' region
         	Region name    : testfunction3<T>
@@ -35,6 +37,7 @@
         	Line numbers   : 17-21
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:23: info: Metrics per 'testfunction4' region
         	Region name    : testfunction4
@@ -43,6 +46,7 @@
         	Line numbers   : 23-27
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:29: info: Metrics per 'testfunction5<T,S>' region
         	Region name    : testfunction5<T,S>
@@ -51,6 +55,7 @@
         	Line numbers   : 29-33
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:35: info: Metrics per 'testfunction6<T,S>' region
         	Region name    : testfunction6<T,S>
@@ -59,6 +64,7 @@
         	Line numbers   : 35-39
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:41: info: Metrics per 'testfunction7<T,S>' region
         	Region name    : testfunction7<T,S>
@@ -67,6 +73,7 @@
         	Line numbers   : 41-46
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:48: info: Metrics per 'testfunction8<T,S>' region
         	Region name    : testfunction8<T,S>
@@ -75,6 +82,7 @@
         	Line numbers   : 48-53
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:55: info: Metrics per 'testfunction9<T,S>' region
         	Region name    : testfunction9<T,S>
@@ -83,6 +91,7 @@
         	Line numbers   : 55-59
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:61: info: Metrics per 'Interface.testfunction10<T,S>' region
         	Region name    : Interface.testfunction10<T,S>
@@ -91,6 +100,7 @@
         	Line numbers   : 61-65
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:67: info: Metrics per 'Interface<T>.testfunction11<T,S>' region
         	Region name    : Interface<T>.testfunction11<T,S>
@@ -99,6 +109,7 @@
         	Line numbers   : 67-71
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:73: info: Metrics per 'Interface<T,S>.testfunction12' region
         	Region name    : Interface<T,S>.testfunction12
@@ -107,6 +118,7 @@
         	Line numbers   : 73-77
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:79: info: Metrics per 'Interface<T,S>.testfunction13<T>' region
         	Region name    : Interface<T,S>.testfunction13<T>
@@ -115,6 +127,7 @@
         	Line numbers   : 79-83
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:85: info: Metrics per 'Interface<T>.testfunction14<T,S>' region
         	Region name    : Interface<T>.testfunction14<T,S>
@@ -123,6 +136,7 @@
         	Line numbers   : 85-89
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:91: info: Metrics per 'Interface<T,S>.testfunction15<T,S>' region
         	Region name    : Interface<T,S>.testfunction15<T,S>
@@ -131,6 +145,7 @@
         	Line numbers   : 91-95
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:97: info: Metrics per 'Interface<T,S>.testfunction16<T>' region
         	Region name    : Interface<T,S>.testfunction16<T>
@@ -139,6 +154,7 @@
         	Line numbers   : 97-101
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:103: info: Metrics per 'Interface<T,S>.testfunction17<T>' region
         	Region name    : Interface<T,S>.testfunction17<T>
@@ -147,6 +163,7 @@
         	Line numbers   : 103-107
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 .   .   ./sample.cs:109: info: Metrics per 'testClass1' region
         	Region name    : testClass1
@@ -204,6 +221,7 @@
         	Line numbers   : 141-145
         	Modified       : None
         	std.code.complexity:cyclomatic: 0
+        	std.code.complexity:cyclomatic_switch_case_once: 0
 
 ./sample.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic' metric
 	Average        : 0.0
@@ -214,4 +232,13 @@
 	  Metric value : Ratio : R-sum : Number of regions
 	             0 : 1.000 : 1.000 : 18	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 
+./sample.cs:: info: Overall metrics for 'std.code.complexity:cyclomatic_switch_case_once' metric
+	Average        : 0.0
+	Minimum        : 0
+	Maximum        : 0
+	Total          : 0.0
+	Distribution   : 18 regions in total (including 0 suppressed)
+	  Metric value : Ratio : R-sum : Number of regions
+	             0 : 1.000 : 1.000 : 18	||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
+
 

+ 3 - 1
metrixpp/tests/general/test_std_code_java.py

@@ -14,7 +14,9 @@ class Test(tests.common.TestCase):
 
     def test_parser(self):
         
-        runner = tests.common.ToolRunner('collect', ['--std.code.complexity.cyclomatic'])
+        runner = tests.common.ToolRunner('collect',
+                                         ['--std.code.complexity.cyclomatic',
+                                          '--std.code.complexity.cyclomatic_switch_case_once'])
         self.assertExec(runner.run())
 
         runner = tests.common.ToolRunner('view', ['--nest-regions', '--format=xml'])

+ 14 - 2
metrixpp/tests/general/test_std_code_java/sources/attrs.java

@@ -3,8 +3,20 @@
 class A
 {
 	@nested_attribute_should_not_be_a_function("word")
-	int function()
+	int function(int parameter)
 	{
-		
+		switch(parameter)
+		{
+			case 1:
+				break;
+			case 2:
+				break;
+			case 3:
+				break;
+			case 4:
+				break;
+			default:
+				break;
+		}
 	}
 }

+ 13 - 2
metrixpp/tests/general/test_std_code_java/test_parser_view_default_stdout.gold.txt

@@ -3,16 +3,27 @@
     <data>
         <aggregated-data>
             <std.code.complexity>
-                <cyclomatic avg="1.05882353" count="119" max="6" min="0" nonzero="False" sup="0" total="126.0">
+                <cyclomatic avg="1.09243697" count="119" max="6" min="0" nonzero="False" sup="0" total="130.0">
                     <distribution-bars>
-                        <distribution-bar count="58" metric="0" ratio="0.48739496" />
+                        <distribution-bar count="57" metric="0" ratio="0.4789916" />
                         <distribution-bar count="31" metric="1" ratio="0.2605042" />
                         <distribution-bar count="15" metric="2" ratio="0.12605042" />
                         <distribution-bar count="8" metric="3" ratio="0.06722689" />
+                        <distribution-bar count="1" metric="4" ratio="0.00840336" />
                         <distribution-bar count="1" metric="5" ratio="0.00840336" />
                         <distribution-bar count="6" metric="6" ratio="0.05042017" />
                     </distribution-bars>
                 </cyclomatic>
+                <cyclomatic_switch_case_once avg="1.06722689" count="119" max="6" min="0" nonzero="False" sup="0" total="127.0">
+                    <distribution-bars>
+                        <distribution-bar count="57" metric="0" ratio="0.4789916" />
+                        <distribution-bar count="32" metric="1" ratio="0.26890756" />
+                        <distribution-bar count="15" metric="2" ratio="0.12605042" />
+                        <distribution-bar count="8" metric="3" ratio="0.06722689" />
+                        <distribution-bar count="1" metric="5" ratio="0.00840336" />
+                        <distribution-bar count="6" metric="6" ratio="0.05042017" />
+                    </distribution-bars>
+                </cyclomatic_switch_case_once>
             </std.code.complexity>
         </aggregated-data>
         <file-data />

File diff suppressed because it is too large
+ 178 - 12
metrixpp/tests/general/test_std_code_java/test_parser_view_files_stdout.gold.txt