1   package test.net.sourceforge.pmd.rules.design;
2   
3   import net.sourceforge.pmd.PMD;
4   import net.sourceforge.pmd.Rule;
5   import net.sourceforge.pmd.RuleSetNotFoundException;
6   import test.net.sourceforge.pmd.testframework.SimpleAggregatorTst;
7   import test.net.sourceforge.pmd.testframework.TestDescriptor;
8   
9   public class ImmutableFieldTest extends SimpleAggregatorTst {
10  
11      private Rule rule;
12  
13      public void setUp() throws RuleSetNotFoundException {
14          rule = findRule("design", "ImmutableField");
15      }
16  
17      public void testAll() {
18         runTests(new TestDescriptor[] {
19             new TestDescriptor(TEST1, "could be immutable, only assigned in constructor", 1, rule),
20             new TestDescriptor(TEST2, "could be immutable, only assigned in decl", 1, rule),
21             new TestDescriptor(TEST3, "ok, assigned twice", 0, rule),
22             new TestDescriptor(TEST4, "ok, static field ", 0, rule), // TODO - probably should check these, not just discard them
23             new TestDescriptor(TEST5, "ok, one constructor assigns, one doesn't", 0, rule),
24             new TestDescriptor(TEST6, "ok, assignment via postfix expression", 0, rule),
25             new TestDescriptor(TEST7, "postfix expressions imply mutability", 0, rule),
26             new TestDescriptor(TEST8, "compound assignment", 0, rule),
27             new TestDescriptor(TEST9, "preincrement", 0, rule),
28             new TestDescriptor(TEST10, "predecrement", 0, rule),
29             new TestDescriptor(TEST11, "compound assignment 2", 0, rule),
30             new TestDescriptor(TEST12, "rhs 2", 0, rule),
31             new TestDescriptor(TEST13, "assignment in constructor is in try block", 0, rule),
32             new TestDescriptor(TEST14, "assignment in method is in try block", 0, rule),
33             new TestDescriptor(TEST15, "assignment in constructor in loop is ok", 0, rule),
34         });
35      }
36  
37      private static final String TEST1 =
38      "public class Foo {" + PMD.EOL +
39      " private int x;" + PMD.EOL +
40      " public Foo() {" + PMD.EOL +
41      "  x = 2;" + PMD.EOL +
42      " }" + PMD.EOL +
43      "}";
44  
45      private static final String TEST2 =
46      "public class Foo {" + PMD.EOL +
47      " private int x = 42;" + PMD.EOL +
48      "}";
49  
50      private static final String TEST3 =
51      "public class Foo {" + PMD.EOL +
52      " private int x;" + PMD.EOL +
53      " public Foo() {" + PMD.EOL +
54      "  x = 41;" + PMD.EOL +
55      " }" + PMD.EOL +
56      " public void bar() {" + PMD.EOL +
57      "  x = 42;" + PMD.EOL +
58      " }" + PMD.EOL +
59      "}";
60  
61      private static final String TEST4 =
62      "public class Foo {" + PMD.EOL +
63      " private static int x = 0;" + PMD.EOL +
64      " private final int y;" + PMD.EOL +
65      " public Foo() {" + PMD.EOL +
66      "  y = x;" + PMD.EOL +
67      "  x++;" + PMD.EOL +
68      " }" + PMD.EOL +
69      "}";
70  
71      private static final String TEST5 =
72      "public class Foo {" + PMD.EOL +
73      " private int x;" + PMD.EOL +
74      " public Foo(int y) {" + PMD.EOL +
75      "  x = y;" + PMD.EOL +
76      " }" + PMD.EOL +
77      " public Foo() {}" + PMD.EOL +
78      "}";
79  
80      private static final String TEST6 =
81      "public class Foo {" + PMD.EOL +
82      " private int x;" + PMD.EOL +
83      " public Foo() {}" + PMD.EOL +
84      " private void bar() {x++;}" + PMD.EOL +
85      "}";
86  
87      private static final String TEST7 =
88      "public class Foo {" + PMD.EOL +
89      " private int x = 0;" + PMD.EOL +
90      " private void bar() {" + PMD.EOL +
91      "  x++;" + PMD.EOL +
92      " }" + PMD.EOL +
93      "}";
94  
95      private static final String TEST8 =
96      "public class Foo {" + PMD.EOL +
97      " private int w;" + PMD.EOL +
98      " private int z;" + PMD.EOL +
99      " private void bar() {" + PMD.EOL +
100     "  w = 2;" + PMD.EOL +
101     "  z = 4;" + PMD.EOL +
102     " }" + PMD.EOL +
103     " private void gaz() {" + PMD.EOL +
104     "  w += z++;" + PMD.EOL +
105     " }" + PMD.EOL +
106     "}";
107 
108     private static final String TEST9 =
109     "public class Foo {" + PMD.EOL +
110     " private int x = 0;" + PMD.EOL +
111     " public void bar() {" + PMD.EOL +
112     "  ++x;" + PMD.EOL +
113     " }" + PMD.EOL +
114     "}";
115 
116     private static final String TEST10 =
117     "public class Foo {" + PMD.EOL +
118     " private int x = 0;" + PMD.EOL +
119     " public void bar() {" + PMD.EOL +
120     "  --x;" + PMD.EOL +
121     " }" + PMD.EOL +
122     "}";
123 
124     private static final String TEST11 =
125     "public class Foo {" + PMD.EOL +
126     " private int x = 0;" + PMD.EOL +
127     " public void bar() {" + PMD.EOL +
128     "  x += 1;" + PMD.EOL +
129     " }" + PMD.EOL +
130     "}";
131 
132     private static final String TEST12 =
133     "public class Foo {" + PMD.EOL +
134     " private int x = 0;" + PMD.EOL +
135     " public void bar() {" + PMD.EOL +
136     "  Object y = new Bar(x++);" + PMD.EOL +
137     " }" + PMD.EOL +
138     "}";
139 
140     private static final String TEST13 =
141     "public class Foo {" + PMD.EOL +
142     " private int x;" + PMD.EOL +
143     " public Foo() {" + PMD.EOL +
144     "  try {" + PMD.EOL +
145     "   x = 2;" + PMD.EOL +
146     "  } catch (Exception e) {}" + PMD.EOL +
147     " }" + PMD.EOL +
148     "}";
149 
150     private static final String TEST14 =
151     "public class Foo {" + PMD.EOL +
152     " private int x;" + PMD.EOL +
153     " public void bar() {" + PMD.EOL +
154     "  try {" + PMD.EOL +
155     "   x = 2;" + PMD.EOL +
156     "  } catch (Exception e) {}" + PMD.EOL +
157     " }" + PMD.EOL +
158     "}";
159 
160     private static final String TEST15 =
161     "public class Foo {" + PMD.EOL +
162     " private int x;" + PMD.EOL +
163     " public Foo() {" + PMD.EOL +
164     "  for (int i=0; i<10; i++) { x += 5; }" + PMD.EOL +
165     " }" + PMD.EOL +
166     "}";
167 
168 }