View Javadoc
1   /*
2   NPathComplexity
3   max = 0
4   
5   
6   */
7   
8   package com.puppycrawl.tools.checkstyle.checks.metrics.npathcomplexity;
9   // Advise: for lack of ambiguity try to make all factors prime numbers
10  public class InputNPathComplexity {
11      //NP = 5
12      void testIfWithExpression() { // violation
13          // NP = (if-range=1) + 1 + (expr=3) = 5
14          if (true && true || (true || true)) { }
15      }
16  
17      //NP = 5
18      void testIfElseWithExpression() { // violation
19          // NP = (if-range=1) + (else-range=1) + (expr=3) = 5
20          if (true && true || (true || true)) { }
21          else { }
22      }
23  
24      //NP = 4
25      int testSimpleSwitch() { // violation
26          int a = 0;
27          // NP = (case-range[1]=1) + (case-range[2]=1) + (case-range[3]=1)
28          //         + (default-range=1) + (expr=0) = 4
29          switch(a) {
30          case 1:
31              break;
32          case 2:
33          case 3:
34              break;
35          }
36          return a;
37      }
38  
39      //NP = 4
40      void testSimpleSwitchWithDefault() { // violation
41          int a = 0;
42          // NP = (case-range[1]=1) + (case-range[2]=1) + (case-range[3]=1)
43          //         + (default-range=1) + (expr=0) = 4
44          switch(a) {
45          case 1:
46              break;
47          case 2:
48          case 3:
49              break;
50          default:
51              break;
52          }
53      }
54  
55      //NP = 6
56      void testSwitchWithExpression() { // violation
57          int a = 0;
58          // NP = (case-range[1]=1) + (case-range[2]=1) + (case-range[3]=1)
59          //         + (default-range=1) + (expr=2) = 6
60          switch(true ? a : a) {
61          case 1:
62              break;
63          case 2:
64          case 3:
65              break;
66          default:
67              break;
68          }
69      }
70  
71      //NP = 15
72      void testComplexSwitch() { // violation
73          int a = 0;
74          // NP = (case-range[1]=2) + (case-range[2]=5*2) + (case-range[3]=2)
75          //         + (default-range=1) + (expr=0) = 15
76          switch(a) {
77          case 1:
78              // NP(case-range) = (if-range=1) + 1 + (expr=0) = 2
79              if (true) { }
80              break;
81          case 2:
82              // NP(case-range) = (if-range=1) + (else-range=1) + (expr=3) = 5
83              if (true && true || (true || true)) { }
84              else { }
85              // NP(case-range) = (if-range=1) + 1 + (expr=0) = 2
86              if (true) { }
87          case 3:
88              // NP(case-range) = (if-range=1) + 1 + (expr=0) = 2
89              if (true) { }
90              break;
91          default:
92              break;
93          }
94      }
95  
96      // NP = 11
97      void testComplexIfElse() { // violation
98          // NP = (if-range=1) + (else-range=9) + (expr=1) = 11
99          if (true && true) { }
100         // NP(else-range) = (if-range=1) + (else-range=6) + (expr=2) = 9
101         else if (true || true || true) { }
102         // NP(else-range) = (if-range=1) + 1 + (expr=4) = 6
103         else if (true && true && true || true || true) { }
104     }
105 
106     // NP = 8
107     boolean testComplexReturn() { // violation
108         // NP = (if-range=3) + (else-range=4) + (expr=1) = 8
109         if (true && true) {
110             // NP(if-range) = 3
111             return true && true || (true && true);
112         } else {
113             // NP(else-range) = (expr(1)=0) + (expr(2)=1) + (expr(3)=1) + 2 = 4
114             return true ? true && true : true || true;
115         }
116     }
117 
118     // NP = (for-statement[1]=2) * (for-statement[2]=3)
119     //         * (for-statement[3]=4) * (for-statement[4]=5) = 120
120     void testForCyclesComplex() { // violation
121         // NP(for-statement) = (for-range=1) + (expr(1)=0) + (expr(2)=0) + (expr(3)=0) + 1 = 2
122         for (int i = 0; i < 10; i++);
123         // NP(for-statement) = (for-range=1) + (expr(1)=0) + (expr(2)=1) + (expr(3)=0) + 1 = 3
124         for (int i = 0; i < 10 && true; i++);
125         // NP(for-statement) = (for-range=1) + (expr(1)=2) + (expr(2)=0) + (expr(3)=0) + 1 = 4
126         for (int i = true ? 0 : 0; i < 10; i++);
127         // NP(for-statement) = (for-range=1) + (expr(1)=0) + (expr(2)=1+2) + (expr(3)=0) + 1 = 5
128         for (int i = 0; true ? i < 10 : true || true; i++);
129     }
130 
131     // NP = (while-statement[1]=2) * (while-statement[2]=3) = 6
132     boolean testWhileCyclesComplex() { // violation
133         int a = 0;
134         // NP(while-statement) = (while-range=1) + (expr=0) + 1 = 2
135         while (a != 0) { }
136         // NP(while-statement) = (while-range=1) + (expr=1) + 1 = 3
137         while (a != 0 && a == 0) { return a == 0 || a == 0; }
138         return true;
139     }
140 
141     // NP = (do-statement[1]=6) * (do-statement[2]=3) = 21
142     void testDoWhileCyclesComplex() { // violation
143         int a = 0;
144         // NP(do-statement) = (do-range=1) + (expr=1) + 1 = 3
145         do { } while (a < 10 && true);
146         // NP(do-statement) =
147         //         (do-range=3) + ((expr(1)=0) + (expr(2)=0) + (expr(3)=1) + 2) + 1 = 7
148         do {
149             // NP(do-range) = (do-range=1) + (expr=1) + 1 = 3
150             do { } while (a < 10 || true);
151         } while (true ? a > 10 : (a < 10 || true));
152     }
153 
154     // NP = (question-statement[1]=5) * (question-statement[2]=7) = 35
155     void testComplexTernaryOperator() { // violation
156         // NP(question-statement) = (expr(1)=0) + (expr(2)=2) + (expr(3)=1+2) + 2 = 7
157         boolean a = true ? (true ? true : true) : (false ? (true || false) : true);
158         // NP(question-statement) = (expr(1)=0) + (expr(2)=2) + (expr(3)=1) + 2 = 5;
159         boolean b = true ? (true ? true : true) : true || true;
160     }
161 
162     // NP = (if-expression[1]=5) * (if-expression[2]=5) = 25
163     void testSimpleTernaryBadFormatting() { // violation
164         // NP(if-expression) = (if-range=2) + 1 + (expr=2) = 5
165         if(
166            true ? true : true
167                 ) { boolean a = true ? true
168                         : true;
169         }
170         // NP(if-expression) = (if-range=2) + 1 + (expr=2) = 5
171         if(
172                 true ? true : true) { boolean b = true ? true : true;
173              }
174     }
175 
176     //Calculation for try-catch is wrong now
177     //See issue #3814 https://github.com/checkstyle/checkstyle/issues/3814
178     void testTryCatch() { // violation
179        try {
180        }
181        catch (Exception e) {
182        }
183     }
184 
185 }