1 | /* |
2 | * Copyright (c) 2001-2009, Jean Tessier |
3 | * All rights reserved. |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
8 | * |
9 | * * Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * |
12 | * * Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. |
15 | * |
16 | * * Neither the name of Jean Tessier nor the names of his contributors |
17 | * may be used to endorse or promote products derived from this software |
18 | * without specific prior written permission. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
23 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR |
24 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
25 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
26 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
27 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
28 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
29 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
30 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | package com.jeantessier.metrics; |
34 | |
35 | import java.io.*; |
36 | import java.util.*; |
37 | import javax.xml.parsers.*; |
38 | |
39 | import static org.hamcrest.Matchers.*; |
40 | import static org.junit.Assert.*; |
41 | import org.junit.*; |
42 | import org.xml.sax.*; |
43 | |
44 | import com.jeantessier.classreader.*; |
45 | |
46 | public class TestMetricsGatherer { |
47 | public static final String TEST_CLASS = "test"; |
48 | public static final String TEST_FILENAME = "classes" + File.separator + "test.class"; |
49 | |
50 | private MetricsFactory factory; |
51 | |
52 | @Before |
53 | public void loadTestData() throws IOException, ParserConfigurationException, SAXException { |
54 | factory = new MetricsFactory("test", new MetricsConfigurationLoader(Boolean.getBoolean("DEPENDENCYFINDER_TESTS_VALIDATE")).load("etc" + File.separator + "MetricsConfig.xml")); |
55 | |
56 | ClassfileLoader loader = new AggregatingClassfileLoader(); |
57 | loader.load(Collections.singleton(TEST_FILENAME)); |
58 | loader.getClassfile(TEST_CLASS).accept(new MetricsGatherer(factory)); |
59 | } |
60 | |
61 | @Test |
62 | public void testNbElements() { |
63 | assertCollectionEquals("project names", factory.getProjectNames(), "test"); |
64 | assertCollectionEquals("group names", factory.getGroupNames(), ""); |
65 | assertCollectionEquals("class names", factory.getClassNames(), "test"); |
66 | assertCollectionEquals("method names", factory.getMethodNames(), "test.main(java.lang.String[])", "test.test()"); |
67 | } |
68 | |
69 | @Test |
70 | public void testNbAllElements() { |
71 | assertCollectionEquals("all project names", factory.getAllProjectNames(), "test"); |
72 | assertCollectionEquals("all group names", factory.getAllGroupNames(), "", "java.io", "java.lang", "java.util"); |
73 | assertCollectionEquals("all class names", factory.getAllClassNames(), "java.io.PrintStream", "java.lang.NullPointerException", "java.lang.Object", "java.lang.String", "java.lang.System", "java.util.Collections", "java.util.Collection", "java.util.Set", "test"); |
74 | assertCollectionEquals("all method names", factory.getAllMethodNames(), "java.io.PrintStream.println(java.lang.Object)", "java.lang.Object.Object()", "java.util.Collections.singleton(java.lang.Object)", "test.main(java.lang.String[])", "test.test()"); |
75 | } |
76 | |
77 | @Test |
78 | public void test_test_test() { |
79 | Metrics metrics = factory.createMethodMetrics("test.test()"); |
80 | |
81 | assertMeasurementEquals(metrics, BasicMeasurements.SLOC, 1); |
82 | assertMeasurementEquals(metrics, BasicMeasurements.PARAMETERS, 0); |
83 | assertMeasurementEquals(metrics, BasicMeasurements.LOCAL_VARIABLES, 1); |
84 | |
85 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_INTRA_CLASS_METHOD_DEPENDENCIES); |
86 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_INTRA_PACKAGE_METHOD_DEPENDENCIES); |
87 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_EXTRA_PACKAGE_METHOD_DEPENDENCIES); |
88 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_INTRA_CLASS_FEATURE_DEPENDENCIES); |
89 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_INTRA_PACKAGE_FEATURE_DEPENDENCIES); |
90 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_INTRA_PACKAGE_CLASS_DEPENDENCIES); |
91 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_EXTRA_PACKAGE_FEATURE_DEPENDENCIES, "java.lang.Object.Object()"); |
92 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_EXTRA_PACKAGE_CLASS_DEPENDENCIES); |
93 | } |
94 | |
95 | @Test |
96 | public void test_test_main() { |
97 | Metrics metrics = factory.createMethodMetrics("test.main(java.lang.String[])"); |
98 | |
99 | assertMeasurementEquals(metrics, BasicMeasurements.SLOC, 5); |
100 | assertMeasurementEquals(metrics, BasicMeasurements.PARAMETERS, 1); |
101 | assertMeasurementEquals(metrics, BasicMeasurements.LOCAL_VARIABLES, 3); |
102 | |
103 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_INTRA_CLASS_METHOD_DEPENDENCIES); |
104 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_INTRA_PACKAGE_METHOD_DEPENDENCIES); |
105 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_EXTRA_PACKAGE_METHOD_DEPENDENCIES); |
106 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_INTRA_CLASS_FEATURE_DEPENDENCIES); |
107 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_INTRA_PACKAGE_FEATURE_DEPENDENCIES); |
108 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_INTRA_PACKAGE_CLASS_DEPENDENCIES); |
109 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_EXTRA_PACKAGE_FEATURE_DEPENDENCIES, "java.util.Collections.singleton(java.lang.Object)", "java.lang.Object.Object()", "java.io.PrintStream.println(java.lang.Object)"); |
110 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_EXTRA_PACKAGE_CLASS_DEPENDENCIES, "java.io.PrintStream", "java.lang.NullPointerException", "java.lang.Object", "java.lang.String", "java.lang.System", "java.util.Collection", "java.util.Set"); |
111 | } |
112 | |
113 | @Test |
114 | public void test_test() { |
115 | Metrics metrics = factory.createClassMetrics("test"); |
116 | |
117 | assertMeasurementEquals(metrics, BasicMeasurements.SLOC, 7); |
118 | assertMeasurementEquals(metrics, "M", 2); |
119 | assertMeasurementEquals(metrics, BasicMeasurements.PUBLIC_METHODS, 2); |
120 | assertMeasurementEquals(metrics, BasicMeasurements.PROTECTED_METHODS, 0); |
121 | assertMeasurementEquals(metrics, BasicMeasurements.PRIVATE_METHODS, 0); |
122 | assertMeasurementEquals(metrics, BasicMeasurements.PACKAGE_METHODS, 0); |
123 | assertMeasurementEquals(metrics, BasicMeasurements.FINAL_METHODS, 0); |
124 | assertMeasurementEquals(metrics, BasicMeasurements.ABSTRACT_METHODS, 0); |
125 | assertMeasurementEquals(metrics, BasicMeasurements.DEPRECATED_METHODS, 0); |
126 | assertMeasurementEquals(metrics, BasicMeasurements.SYNTHETIC_METHODS, 0); |
127 | assertMeasurementEquals(metrics, BasicMeasurements.STATIC_METHODS, 1); |
128 | assertMeasurementEquals(metrics, BasicMeasurements.SYNCHRONIZED_METHODS, 0); |
129 | assertMeasurementEquals(metrics, BasicMeasurements.NATIVE_METHODS, 0); |
130 | assertMeasurementEquals(metrics, BasicMeasurements.TRIVIAL_METHODS, 0); |
131 | assertMeasurementEquals(metrics, "PuMR", 1.0); |
132 | assertMeasurementEquals(metrics, "ProMR", 0.0); |
133 | assertMeasurementEquals(metrics, "PriMR", 0.0); |
134 | assertMeasurementEquals(metrics, "PaMR", 0.0); |
135 | assertMeasurementEquals(metrics, "FMR", 0.0); |
136 | assertMeasurementEquals(metrics, "AMR", 0.0); |
137 | assertMeasurementEquals(metrics, "DMR", 0.0); |
138 | assertMeasurementEquals(metrics, "SynthMR", 0.0); |
139 | assertMeasurementEquals(metrics, "SMR", 0.5); |
140 | assertMeasurementEquals(metrics, "SynchMR", 0.0); |
141 | assertMeasurementEquals(metrics, "NMR", 0.0); |
142 | assertMeasurementEquals(metrics, "TMR", 0.0); |
143 | assertMeasurementEquals(metrics, "A", 0.0); |
144 | assertMeasurementEquals(metrics, BasicMeasurements.PUBLIC_ATTRIBUTES, 0); |
145 | assertMeasurementEquals(metrics, BasicMeasurements.PROTECTED_ATTRIBUTES, 0); |
146 | assertMeasurementEquals(metrics, BasicMeasurements.PRIVATE_ATTRIBUTES, 0); |
147 | assertMeasurementEquals(metrics, BasicMeasurements.PACKAGE_ATTRIBUTES, 0); |
148 | assertMeasurementEquals(metrics, BasicMeasurements.FINAL_ATTRIBUTES, 0); |
149 | assertMeasurementEquals(metrics, BasicMeasurements.DEPRECATED_ATTRIBUTES, 0); |
150 | assertMeasurementEquals(metrics, BasicMeasurements.SYNTHETIC_ATTRIBUTES, 0); |
151 | assertMeasurementEquals(metrics, BasicMeasurements.STATIC_ATTRIBUTES, 0); |
152 | assertMeasurementEquals(metrics, BasicMeasurements.TRANSIENT_ATTRIBUTES, 0); |
153 | assertMeasurementEquals(metrics, BasicMeasurements.VOLATILE_ATTRIBUTES, 0); |
154 | assertMeasurementIsNaN(metrics, "PuAR"); |
155 | assertMeasurementIsNaN(metrics, "ProAR"); |
156 | assertMeasurementIsNaN(metrics, "PriAR"); |
157 | assertMeasurementIsNaN(metrics, "PaAR"); |
158 | assertMeasurementIsNaN(metrics, "FAR"); |
159 | assertMeasurementIsNaN(metrics, "DAR"); |
160 | assertMeasurementIsNaN(metrics, "SynthAR"); |
161 | assertMeasurementIsNaN(metrics, "SAR"); |
162 | assertMeasurementIsNaN(metrics, "TAR"); |
163 | assertMeasurementIsNaN(metrics, "VAR"); |
164 | assertMeasurementEquals(metrics, BasicMeasurements.SUBCLASSES, 0); |
165 | assertMeasurementIsEmpty(metrics, BasicMeasurements.DEPTH_OF_INHERITANCE); |
166 | |
167 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_INTRA_PACKAGE_DEPENDENCIES); |
168 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.INBOUND_EXTRA_PACKAGE_DEPENDENCIES); |
169 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_INTRA_PACKAGE_DEPENDENCIES); |
170 | assertCollectionMeasurementEquals(metrics, BasicMeasurements.OUTBOUND_EXTRA_PACKAGE_DEPENDENCIES, "java.lang.Object"); |
171 | } |
172 | |
173 | @Test |
174 | public void test_() { |
175 | assertMeasurementEquals(factory.createGroupMetrics(""), BasicMeasurements.SLOC, 7); |
176 | } |
177 | |
178 | @Test |
179 | public void testProject() { |
180 | assertMeasurementEquals(factory.createProjectMetrics("test"), BasicMeasurements.SLOC, 7); |
181 | } |
182 | |
183 | private void assertCollectionEquals(String message, Collection<String> names, String ... values) { |
184 | assertThat(message, names, hasItems(values)); |
185 | assertThat(message, names.size(), is(values.length)); |
186 | } |
187 | |
188 | private void assertCollectionMeasurementEquals(Metrics metrics, BasicMeasurements measurement, String ... values) { |
189 | assertCollectionMeasurementEquals(metrics, measurement.getAbbreviation(), values); |
190 | } |
191 | |
192 | private void assertCollectionMeasurementEquals(Metrics metrics, String abbreviation, String ... values) { |
193 | Collection<String> dependencies = ((CollectionMeasurement) metrics.getMeasurement(abbreviation)).getValues(); |
194 | assertThat(abbreviation, dependencies, hasItems(values)); |
195 | assertThat(abbreviation, dependencies.size(), is(values.length)); |
196 | } |
197 | |
198 | private void assertMeasurementEquals(Metrics metrics, BasicMeasurements measurement, int expectedValue) { |
199 | assertMeasurementEquals(metrics, measurement.getAbbreviation(), expectedValue); |
200 | } |
201 | |
202 | private void assertMeasurementEquals(Metrics metrics, String abbreviation, int expectedValue) { |
203 | assertThat(abbreviation, metrics.getMeasurement(abbreviation).getValue().intValue(), is(expectedValue)); |
204 | } |
205 | |
206 | private void assertMeasurementEquals(Metrics metrics, String abbreviation, double expectedValue) { |
207 | assertThat(abbreviation, metrics.getMeasurement(abbreviation).getValue().doubleValue(), is(closeTo(expectedValue, 0.01))); |
208 | } |
209 | |
210 | private void assertMeasurementIsNaN(Metrics metrics, String abbreviation) { |
211 | assertTrue(abbreviation, Double.isNaN(metrics.getMeasurement(abbreviation).getValue().doubleValue())); |
212 | } |
213 | |
214 | private void assertMeasurementIsEmpty(Metrics metrics, BasicMeasurements measurement) { |
215 | assertMeasurementIsEmpty(metrics, measurement.getAbbreviation()); |
216 | } |
217 | |
218 | private void assertMeasurementIsEmpty(Metrics metrics, String abbreviation) { |
219 | assertTrue(abbreviation + " should have been ignored", metrics.getMeasurement(abbreviation).isEmpty()); |
220 | } |
221 | } |