1 |
| |
2 |
| |
3 |
| |
4 |
| |
5 |
| |
6 |
| |
7 |
| |
8 |
| |
9 |
| |
10 |
| |
11 |
| |
12 |
| |
13 |
| |
14 |
| |
15 |
| |
16 |
| |
17 |
| |
18 |
| |
19 |
| |
20 |
| |
21 |
| |
22 |
| |
23 |
| |
24 |
| |
25 |
| |
26 |
| |
27 |
| |
28 |
| |
29 |
| |
30 |
| |
31 |
| |
32 |
| |
33 |
| package com.jeantessier.diff; |
34 |
| |
35 |
| import java.io.*; |
36 |
| import javax.xml.parsers.*; |
37 |
| import javax.xml.xpath.*; |
38 |
| |
39 |
| import org.xml.sax.*; |
40 |
| |
41 |
| import com.jeantessier.classreader.*; |
42 |
| |
43 |
| public class TestClassReport extends TestDifferencesFactoryBase implements ErrorHandler { |
44 |
| private static final String MODIFIED_CLASS_NAME = "ModifiedPackage.ModifiedClass"; |
45 |
| |
46 |
| private Classfile oldClassfile; |
47 |
| private Classfile newClassfile; |
48 |
| |
49 |
| private ClassDifferences classDifferences; |
50 |
| |
51 |
| private ClassReport classReport; |
52 |
| |
53 |
| private XMLReader reader; |
54 |
| |
55 |
18
| protected void setUp() throws Exception {
|
56 |
18
| super.setUp();
|
57 |
| |
58 |
18
| oldClassfile = getOldJar().getClassfile(MODIFIED_CLASS_NAME);
|
59 |
18
| newClassfile = getNewJar().getClassfile(MODIFIED_CLASS_NAME);
|
60 |
| |
61 |
18
| classDifferences = new ClassDifferences(MODIFIED_CLASS_NAME, oldClassfile, newClassfile);
|
62 |
| |
63 |
18
| classReport = new ClassReport();
|
64 |
| |
65 |
18
| boolean validate = Boolean.getBoolean("DEPENDENCYFINDER_TESTS_VALIDATE");
|
66 |
| |
67 |
18
| reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
|
68 |
18
| reader.setFeature("http://xml.org/sax/features/validation", validate);
|
69 |
18
| reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", validate);
|
70 |
18
| reader.setErrorHandler(this);
|
71 |
| } |
72 |
| |
73 |
1
| public void testXmlEscapingRemovedLessThanFieldValue() throws Exception {
|
74 |
1
| String name = "REMOVED_LESS_THAN_STRING";
|
75 |
1
| addRemovedFieldDifferences(name);
|
76 |
| |
77 |
1
| classReport.visitClassDifferences(classDifferences);
|
78 |
| |
79 |
1
| assertAttributeValue("removed-fields/declaration", name, "<");
|
80 |
| } |
81 |
| |
82 |
1
| public void testXmlEscapingRemovedAmpersandFieldValue() throws Exception {
|
83 |
1
| String name = "REMOVED_AMPERSAND_STRING";
|
84 |
1
| addRemovedFieldDifferences(name);
|
85 |
| |
86 |
1
| classReport.visitClassDifferences(classDifferences);
|
87 |
| |
88 |
1
| assertAttributeValue("removed-fields/declaration", name, "&");
|
89 |
| } |
90 |
| |
91 |
1
| public void testXmlEscapingRemovedGreaterThanFieldValue() throws Exception {
|
92 |
1
| String name = "REMOVED_GREATER_THAN_STRING";
|
93 |
1
| addRemovedFieldDifferences(name);
|
94 |
| |
95 |
1
| classReport.visitClassDifferences(classDifferences);
|
96 |
| |
97 |
1
| assertAttributeValue("removed-fields/declaration", name, ">");
|
98 |
| } |
99 |
| |
100 |
1
| public void testXmlEscapingRemovedQuoteFieldValue() throws Exception {
|
101 |
1
| String name = "REMOVED_QUOTE_STRING";
|
102 |
1
| addRemovedFieldDifferences(name);
|
103 |
| |
104 |
1
| classReport.visitClassDifferences(classDifferences);
|
105 |
| |
106 |
1
| assertAttributeValue("removed-fields/declaration", name, "\"");
|
107 |
| } |
108 |
| |
109 |
1
| public void testXmlEscapingRemovedApostropheFieldValue() throws Exception {
|
110 |
1
| String name = "REMOVED_APOSTROPHE_STRING";
|
111 |
1
| addRemovedFieldDifferences(name);
|
112 |
| |
113 |
1
| classReport.visitClassDifferences(classDifferences);
|
114 |
| |
115 |
1
| assertAttributeValue("removed-fields/declaration", name, "'");
|
116 |
| } |
117 |
| |
118 |
1
| public void testXmlEscapingRemovedNonAsciiFieldValue() throws Exception {
|
119 |
1
| String name = "REMOVED_NON_ASCII_STRING";
|
120 |
1
| addRemovedFieldDifferences(name);
|
121 |
| |
122 |
1
| classReport.visitClassDifferences(classDifferences);
|
123 |
| |
124 |
1
| assertAttributeValue("removed-fields/declaration", name, "•");
|
125 |
| } |
126 |
| |
127 |
1
| public void testXmlEscapingModifiedLessThanFieldValue() throws Exception {
|
128 |
1
| String name = "MODIFIED_LESS_THAN_STRING";
|
129 |
1
| addModifiedFieldDifferences(name);
|
130 |
| |
131 |
1
| classReport.visitClassDifferences(classDifferences);
|
132 |
| |
133 |
1
| assertAttributeValue("modified-fields/feature/modified-declaration/new-declaration", name, "<");
|
134 |
| } |
135 |
| |
136 |
1
| public void testXmlEscapingModifiedAmpersandFieldValue() throws Exception {
|
137 |
1
| String name = "MODIFIED_AMPERSAND_STRING";
|
138 |
1
| addModifiedFieldDifferences(name);
|
139 |
| |
140 |
1
| classReport.visitClassDifferences(classDifferences);
|
141 |
| |
142 |
1
| assertAttributeValue("modified-fields/feature/modified-declaration/new-declaration", name, "&");
|
143 |
| } |
144 |
| |
145 |
1
| public void testXmlEscapingModifiedGreaterThanFieldValue() throws Exception {
|
146 |
1
| String name = "MODIFIED_GREATER_THAN_STRING";
|
147 |
1
| addModifiedFieldDifferences(name);
|
148 |
| |
149 |
1
| classReport.visitClassDifferences(classDifferences);
|
150 |
| |
151 |
1
| assertAttributeValue("modified-fields/feature/modified-declaration/new-declaration", name, ">");
|
152 |
| } |
153 |
| |
154 |
1
| public void testXmlEscapingModifiedQuoteFieldValue() throws Exception {
|
155 |
1
| String name = "MODIFIED_QUOTE_STRING";
|
156 |
1
| addModifiedFieldDifferences(name);
|
157 |
| |
158 |
1
| classReport.visitClassDifferences(classDifferences);
|
159 |
| |
160 |
1
| assertAttributeValue("modified-fields/feature/modified-declaration/new-declaration", name, "\"");
|
161 |
| } |
162 |
| |
163 |
1
| public void testXmlEscapingModifiedApostropheFieldValue() throws Exception {
|
164 |
1
| String name = "MODIFIED_APOSTROPHE_STRING";
|
165 |
1
| addModifiedFieldDifferences(name);
|
166 |
| |
167 |
1
| classReport.visitClassDifferences(classDifferences);
|
168 |
| |
169 |
1
| assertAttributeValue("modified-fields/feature/modified-declaration/new-declaration", name, "'");
|
170 |
| } |
171 |
| |
172 |
1
| public void testXmlEscapingModifiedNonAsciiFieldValue() throws Exception {
|
173 |
1
| String name = "MODIFIED_NON_ASCII_STRING";
|
174 |
1
| addModifiedFieldDifferences(name);
|
175 |
| |
176 |
1
| classReport.visitClassDifferences(classDifferences);
|
177 |
| |
178 |
1
| assertAttributeValue("modified-fields/feature/modified-declaration/new-declaration", name, "•");
|
179 |
| } |
180 |
| |
181 |
1
| public void testXmlEscapingNewLessThanFieldValue() throws Exception {
|
182 |
1
| String name = "NEW_LESS_THAN_STRING";
|
183 |
1
| addNewFieldDifferences(name);
|
184 |
| |
185 |
1
| classReport.visitClassDifferences(classDifferences);
|
186 |
| |
187 |
1
| assertAttributeValue("new-fields/declaration", name, "<");
|
188 |
| } |
189 |
| |
190 |
1
| public void testXmlEscapingNewAmpersandFieldValue() throws Exception {
|
191 |
1
| String name = "NEW_AMPERSAND_STRING";
|
192 |
1
| addNewFieldDifferences(name);
|
193 |
| |
194 |
1
| classReport.visitClassDifferences(classDifferences);
|
195 |
| |
196 |
1
| assertAttributeValue("new-fields/declaration", name, "&");
|
197 |
| } |
198 |
| |
199 |
1
| public void testXmlEscapingNewGreaterThanFieldValue() throws Exception {
|
200 |
1
| String name = "NEW_GREATER_THAN_STRING";
|
201 |
1
| addNewFieldDifferences(name);
|
202 |
| |
203 |
1
| classReport.visitClassDifferences(classDifferences);
|
204 |
| |
205 |
1
| assertAttributeValue("new-fields/declaration", name, ">");
|
206 |
| } |
207 |
| |
208 |
1
| public void testXmlEscapingNewQuoteFieldValue() throws Exception {
|
209 |
1
| String name = "NEW_QUOTE_STRING";
|
210 |
1
| addNewFieldDifferences(name);
|
211 |
| |
212 |
1
| classReport.visitClassDifferences(classDifferences);
|
213 |
| |
214 |
1
| assertAttributeValue("new-fields/declaration", name, "\"");
|
215 |
| } |
216 |
| |
217 |
1
| public void testXmlEscapingNewApostropheFieldValue() throws Exception {
|
218 |
1
| String name = "NEW_APOSTROPHE_STRING";
|
219 |
1
| addNewFieldDifferences(name);
|
220 |
| |
221 |
1
| classReport.visitClassDifferences(classDifferences);
|
222 |
| |
223 |
1
| assertAttributeValue("new-fields/declaration", name, "'");
|
224 |
| } |
225 |
| |
226 |
1
| public void testXmlEscapingNewNonAsciiFieldValue() throws Exception {
|
227 |
1
| String name = "NEW_NON_ASCII_STRING";
|
228 |
1
| addNewFieldDifferences(name);
|
229 |
| |
230 |
1
| classReport.visitClassDifferences(classDifferences);
|
231 |
| |
232 |
1
| assertAttributeValue("new-fields/declaration", name, "•");
|
233 |
| } |
234 |
| |
235 |
6
| private void addRemovedFieldDifferences(String name) {
|
236 |
6
| Field_info oldField = oldClassfile.getField(name);
|
237 |
6
| FieldDifferences fieldDifferences = new FieldDifferences(oldField.getFullName(), oldField, null);
|
238 |
6
| classDifferences.getFeatureDifferences().add(fieldDifferences);
|
239 |
| } |
240 |
| |
241 |
6
| private void addModifiedFieldDifferences(String name) {
|
242 |
6
| Field_info oldField = oldClassfile.getField(name);
|
243 |
6
| Field_info newField = newClassfile.getField(name);
|
244 |
6
| FieldDifferences fieldDifferences = new FieldDifferences(oldField.getFullName(), oldField, newField);
|
245 |
6
| fieldDifferences.setConstantValueDifference(true);
|
246 |
6
| classDifferences.getFeatureDifferences().add(fieldDifferences);
|
247 |
| } |
248 |
| |
249 |
6
| private void addNewFieldDifferences(String name) {
|
250 |
6
| Field_info newField = newClassfile.getField(name);
|
251 |
6
| FieldDifferences fieldDifferences = new FieldDifferences(newField.getFullName(), null, newField);
|
252 |
6
| classDifferences.getFeatureDifferences().add(fieldDifferences);
|
253 |
| } |
254 |
| |
255 |
18
| private void assertAttributeValue(String nodeName, String nameAttribute, String valueAttribute) throws Exception {
|
256 |
18
| String xmlDocument = classReport.render();
|
257 |
| |
258 |
18
| try {
|
259 |
18
| reader.parse(new InputSource(new StringReader(xmlDocument)));
|
260 |
| } catch (SAXException ex) { |
261 |
0
| fail("Could not parse XML Document: " + ex.getMessage() + "\n" + xmlDocument);
|
262 |
| } catch (IOException ex) { |
263 |
0
| fail("Could not read XML Document: " + ex.getMessage() + "\n" + xmlDocument);
|
264 |
| } |
265 |
| |
266 |
18
| XPath xPath = XPathFactory.newInstance().newXPath();
|
267 |
18
| InputSource in = new InputSource(new StringReader(xmlDocument));
|
268 |
| |
269 |
18
| String xPathExpression = "*/" + nodeName + "[@name='" + nameAttribute + "']/@value";
|
270 |
18
| String result = xPath.evaluate(xPathExpression, in);
|
271 |
18
| assertEquals("XPath \"" + xPathExpression + "\" in \n" + xmlDocument, valueAttribute, result);
|
272 |
| } |
273 |
| |
274 |
0
| public void error(SAXParseException ex) {
|
275 |
| |
276 |
| } |
277 |
| |
278 |
0
| public void fatalError(SAXParseException ex) {
|
279 |
| |
280 |
| } |
281 |
| |
282 |
0
| public void warning(SAXParseException ex) {
|
283 |
| |
284 |
| } |
285 |
| } |