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),
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 }