/testability-explorer/src/test/java/com/google/test/metric/report/issues/IssuesReporterTest.java

http://testability-explorer.googlecode.com/ · Java · 187 lines · 134 code · 23 blank · 30 comment · 0 complexity · 19de23e53cd5558a822283bfc93ead8c MD5 · raw file

  1. /*
  2. * Copyright 2009 Google Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.google.test.metric.report.issues;
  17. import com.google.test.metric.ClassCost;
  18. import com.google.test.metric.ClassInfo;
  19. import com.google.test.metric.ClassRepository;
  20. import com.google.test.metric.CostModel;
  21. import com.google.test.metric.CostUtil;
  22. import com.google.test.metric.JavaClassRepository;
  23. import com.google.test.metric.MetricComputer;
  24. import static com.google.test.metric.report.issues.IssueSubType.COMPLEXITY;
  25. import static com.google.test.metric.report.issues.IssueSubType.NON_MOCKABLE;
  26. import static com.google.test.metric.report.issues.IssueSubType.SETTER;
  27. import static com.google.test.metric.report.issues.IssueSubType.STATIC_INIT;
  28. import static com.google.test.metric.report.issues.IssueSubType.STATIC_METHOD;
  29. import static com.google.test.metric.report.issues.IssueType.CONSTRUCTION;
  30. import com.google.test.metric.testing.MetricComputerBuilder;
  31. import com.google.test.metric.testing.MetricComputerJavaDecorator;
  32. import junit.framework.TestCase;
  33. import java.util.LinkedList;
  34. import java.util.List;
  35. import java.util.Map;
  36. /**
  37. * Tests for {@link com.google.test.metric.report.issues.IssuesReporterTest}
  38. * These are integration tests which start from an actual class, and assert
  39. * what issues are reported on that class.
  40. *
  41. * @author alexeagle@google.com (Alex Eagle)
  42. */
  43. public class IssuesReporterTest extends TestCase {
  44. private IssuesReporter issuesReporter;
  45. private MetricComputerJavaDecorator decoratedComputer;
  46. private HypotheticalCostModel costModel;
  47. @Override
  48. protected void setUp() throws Exception {
  49. super.setUp();
  50. ClassRepository repo = new JavaClassRepository();
  51. MetricComputer toDecorate = new MetricComputerBuilder().withClassRepository(repo).build();
  52. decoratedComputer = new MetricComputerJavaDecorator(toDecorate, repo);
  53. costModel = new HypotheticalCostModel(new CostModel());
  54. issuesReporter = new IssuesReporter(new LinkedList<ClassIssues>(), this.costModel);
  55. }
  56. private static class SeveralConstructionIssues {
  57. public SeveralConstructionIssues() {
  58. // Contributes 3
  59. CostUtil.staticCost3();
  60. // Contributes 2
  61. int a = 0;
  62. @SuppressWarnings("unused")
  63. int b = a > 5 ? 3 : 5;
  64. b = a < 4 ? 4 : 3;
  65. // Contributes 4
  66. new CostUtil().instanceCost4();
  67. }
  68. }
  69. public void testSeveralConstructionIssues() throws Exception {
  70. ClassIssues classIssues = issuesReporter.determineIssues(
  71. decoratedComputer.compute(SeveralConstructionIssues.class));
  72. assertEquals(classIssues.toString(), 3, classIssues.getSize());
  73. Map<String,List<Issue>> constructionIssues = classIssues.getConstructionIssues();
  74. assertTrue(classIssues.toString(), constructionIssues.containsKey(COMPLEXITY.toString()));
  75. Issue complexity = constructionIssues.get(COMPLEXITY.toString()).get(0);
  76. assertEquals(2/9f, complexity.getContributionToClassCost(), 0.001f);
  77. assertTrue(classIssues.toString(), constructionIssues.containsKey(STATIC_METHOD.toString()));
  78. Issue staticCall = constructionIssues.get(STATIC_METHOD.toString()).get(0);
  79. assertEquals(3/9f, staticCall.getContributionToClassCost(), 0.001f);
  80. assertTrue(classIssues.toString(), constructionIssues.containsKey(NON_MOCKABLE.toString()));
  81. Issue collaborator = constructionIssues.get(NON_MOCKABLE.toString()).get(0);
  82. assertEquals(4/9f, collaborator.getContributionToClassCost(), 0.001f);
  83. }
  84. private static class SeveralNonMockableMethodIssues {
  85. public void foo() {
  86. CostUtil.staticCost2();
  87. CostUtil.staticCost4();
  88. }
  89. }
  90. public void testSeveralNonMockableMethodIssues() throws Exception {
  91. ClassCost cost = decoratedComputer.compute(SeveralNonMockableMethodIssues.class);
  92. ClassIssues classIssues = issuesReporter.determineIssues(
  93. cost);
  94. assertEquals(2, classIssues.getSize());
  95. List<Issue> issues = classIssues.getCollaboratorIssues().get(STATIC_METHOD.toString());
  96. Issue issue0 = issues.get(0);
  97. Issue issue1 = issues.get(1);
  98. assertEquals(6, cost.getTotalComplexityCost() + 10 * cost.getTotalGlobalCost());
  99. assertEquals(4/6f, issue0.getContributionToClassCost(), 0.001f);
  100. assertEquals(2/6f, issue1.getContributionToClassCost(), 0.001f);
  101. }
  102. public void testMultipleMethodInvocationSourcesDoesntBlowUp() throws Exception {
  103. // Threw an exception at one time
  104. ClassIssues classIssues = issuesReporter.determineIssues(
  105. decoratedComputer.compute(ClassInfo.class));
  106. }
  107. private static class StaticInit {
  108. // 10
  109. private static int a = 1;
  110. // 10
  111. private static String b = "b";
  112. // 4
  113. public void otherCost() {
  114. new CostUtil().instanceCost4();
  115. }
  116. }
  117. public void testStaticInitializationInClass() throws Exception {
  118. ClassIssues classIssues = issuesReporter.determineIssues(decoratedComputer.compute(StaticInit.class));
  119. List<Issue> issues = classIssues.getIssues(CONSTRUCTION, STATIC_INIT);
  120. assertEquals(classIssues.toString(), 2, issues.size());
  121. assertEquals("int a", issues.get(1).getElement());
  122. //TODO 1/7 doesn't seem right - class is 21 but reduced to 18 without this issue??
  123. assertEquals(1/7f, issues.get(1).getContributionToClassCost(), 0.001f);
  124. assertEquals("String b", issues.get(0).getElement());
  125. assertEquals(1/7f, issues.get(0).getContributionToClassCost(), 0.001f);
  126. }
  127. private static class Setters {
  128. private String foo;
  129. public void setFoo(String foo) {
  130. int a = 0;
  131. @SuppressWarnings("unused")
  132. int b = a > 5 ? 3 : 5;
  133. this.foo = foo;
  134. }
  135. public String doFoo() {
  136. return foo;
  137. }
  138. }
  139. public void testSetterCountsAsConstructionIssue() throws Exception {
  140. ClassIssues classIssues = issuesReporter.determineIssues(decoratedComputer.compute(Setters.class));
  141. assertEquals(classIssues.toString(), 2, classIssues.getSize());
  142. assertEquals(classIssues.toString(), 1, classIssues.getIssues(CONSTRUCTION, SETTER).size());
  143. }
  144. static class SubclassOfSetterCost extends HasSetterCost {
  145. public void doThing() {
  146. }
  147. }
  148. public void testImplicitCostFromSuperClassHasSourceLocationInOtherFile() throws Exception {
  149. ClassIssues classIssues =
  150. issuesReporter.determineIssues(decoratedComputer.compute(SubclassOfSetterCost.class));
  151. List<Issue> issues = classIssues.getIssues(CONSTRUCTION, IssueSubType.SETTER);
  152. assertEquals(1, issues.size());
  153. assertEquals("com/google/test/metric/report/issues/HasSetterCost.java",
  154. issues.get(0).getLocation().getFile());
  155. }
  156. public void testClassesWithNoIssuesAreStillAddedToQueue() throws Exception {
  157. TriageIssuesQueue<ClassIssues> queue =
  158. new TriageIssuesQueue<ClassIssues>(1, 10, new ClassIssues.TotalCostComparator());
  159. IssuesReporter issuesReporterWithRealQueue = new IssuesReporter(queue, costModel);
  160. ClassCost cost = decoratedComputer.compute(SeveralConstructionIssues.class);
  161. issuesReporterWithRealQueue.inspectClass(cost);
  162. assertEquals(1, queue.size());
  163. }
  164. }