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 }