1   /***
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3    */
4   package test.net.sourceforge.pmd.rules;
5   
6   import net.sourceforge.pmd.PMD;
7   import net.sourceforge.pmd.Report;
8   import net.sourceforge.pmd.Rule;
9   import net.sourceforge.pmd.RuleSetNotFoundException;
10  import net.sourceforge.pmd.RuleViolation;
11  import test.net.sourceforge.pmd.testframework.RuleTst;
12  
13  import java.util.Iterator;
14  
15  public class CyclomaticComplexityTest extends RuleTst {
16  
17      private Rule rule;
18  
19      public void setUp() throws RuleSetNotFoundException {
20          rule = findRule("codesize", "CyclomaticComplexity");
21      }
22  
23      public void testOneMethod() throws Throwable {
24          rule.addProperty("reportLevel", "1");
25          Report report = new Report();
26          runTestFromString(TEST1, rule, report);
27          Iterator i = report.iterator();
28          RuleViolation rv = (RuleViolation) i.next();
29          assertTrue(rv.getDescription().indexOf("Highest = 1") != -1);
30      }
31  
32      public void testNastyComplicatedMethod() throws Throwable {
33          rule.addProperty("reportLevel", "10");
34          Report report = new Report();
35          runTestFromString(TEST2, rule, report);
36          Iterator i = report.iterator();
37          RuleViolation rv = (RuleViolation) i.next();
38          assertTrue(rv.getDescription().indexOf("Highest = 12") != -1);
39      }
40  
41      public void testConstructor() throws Throwable {
42          rule.addProperty("reportLevel", "1");
43          Report report = new Report();
44          runTestFromString(TEST3, rule, report);
45          Iterator i = report.iterator();
46          RuleViolation rv = (RuleViolation) i.next();
47          assertTrue(rv.getDescription().indexOf("Highest = 1") != -1);
48      }
49  
50      public void testLessComplicatedThanReportLevel() throws Throwable {
51          rule.addProperty("reportLevel", "10");
52          Report report = new Report();
53          runTestFromString(TEST1, rule, report);
54          assertEquals(0, report.size());
55      }
56  
57      private static final String TEST1 =
58              "public class Foo {" + PMD.EOL +
59              " public void foo() {}" + PMD.EOL +
60              "}";
61  
62      private static final String TEST2 =
63              "public class Foo {" + PMD.EOL +
64              " public void example() {" + PMD.EOL +
65              "  int x = 0;" + PMD.EOL +
66              "  int a = 0;" + PMD.EOL +
67              "  int b = 0;" + PMD.EOL +
68              "  int c = 0;" + PMD.EOL +
69              "  int d = 0;" + PMD.EOL +
70              "  int a1 = 0;" + PMD.EOL +
71              "  int a2 = 0;" + PMD.EOL +
72              "  int b1 = 0;" + PMD.EOL +
73              "  int b2 = 0;" + PMD.EOL +
74              "  int z = 0;" + PMD.EOL +
75              "  int h = 0;" + PMD.EOL +
76              "  int e = 0;" + PMD.EOL +
77              "  int f = 0;" + PMD.EOL +
78              "" + PMD.EOL +
79              "  if (a == b) {" + PMD.EOL +
80              "   if (a1 == b1) {" + PMD.EOL +
81              "     x=2;" + PMD.EOL +
82              "   } else if (a2 == b2) {" + PMD.EOL +
83              "     x=2;" + PMD.EOL +
84              "   }" + PMD.EOL +
85              "            else" + PMD.EOL +
86              "            {" + PMD.EOL +
87              "                x=2;" + PMD.EOL +
88              "            }" + PMD.EOL +
89              "        }" + PMD.EOL +
90              "       else if (c == d)" + PMD.EOL +
91              "        {" + PMD.EOL +
92              "           while (c == d)" + PMD.EOL +
93              "            {" + PMD.EOL +
94              "                x=2;" + PMD.EOL +
95              "            }" + PMD.EOL +
96              "        }" + PMD.EOL +
97              "       else if (e == f)" + PMD.EOL +
98              "        {" + PMD.EOL +
99              "           for (int n = 0; n < h; n++)" + PMD.EOL +
100             "            {" + PMD.EOL +
101             "                x=2;" + PMD.EOL +
102             "            }" + PMD.EOL +
103             "        }" + PMD.EOL +
104             "        else" + PMD.EOL +
105             "        {" + PMD.EOL +
106             "            switch (z)" + PMD.EOL +
107             "            {" + PMD.EOL +
108             "               case 1:" + PMD.EOL +
109             "                x=2;" + PMD.EOL +
110             "                    break;" + PMD.EOL +
111             "" + PMD.EOL +
112             "              case 2:" + PMD.EOL +
113             "                x=2;" + PMD.EOL +
114             "                    break;" + PMD.EOL +
115             "" + PMD.EOL +
116             "              case 3:" + PMD.EOL +
117             "                x=2;" + PMD.EOL +
118             "                    break;" + PMD.EOL +
119             "" + PMD.EOL +
120             "              default:" + PMD.EOL +
121             "                x=2;" + PMD.EOL +
122             "                    break;" + PMD.EOL +
123             "            }" + PMD.EOL +
124             "        }" + PMD.EOL +
125             "    }" + PMD.EOL +
126             "}";
127 
128     private static final String TEST3 =
129             "public class Foo {" + PMD.EOL +
130             " public Foo() {}" + PMD.EOL +
131             "}";
132 
133 }