| /******************************************************************************* |
| * Copyright (c) 2000, 2015 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.core.tests.performance; |
| |
| import java.io.PrintStream; |
| import java.text.NumberFormat; |
| import junit.framework.*; |
| |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.jdt.core.*; |
| import org.eclipse.jdt.core.search.*; |
| import org.eclipse.test.performance.Performance; |
| |
| /** |
| */ |
| @SuppressWarnings("rawtypes") |
| public class FullSourceWorkspaceTypeHierarchyTests extends FullSourceWorkspaceTests implements IJavaSearchConstants { |
| |
| // Tests counter |
| private static int TESTS_COUNT = 0; |
| private final static int WARMUP_COUNT = 5; |
| |
| // Log files |
| private static PrintStream[] LOG_STREAMS = new PrintStream[DIM_NAMES.length]; |
| |
| // Formats |
| private final static NumberFormat INT_FORMAT = NumberFormat.getIntegerInstance(); |
| |
| /** |
| * @param name |
| */ |
| public FullSourceWorkspaceTypeHierarchyTests(String name) { |
| super(name); |
| } |
| |
| static { |
| // TESTS_NAMES = new String[] { "testPerSuperTypes" }; |
| } |
| public static Test suite() { |
| Test suite = buildSuite(testClass()); |
| TESTS_COUNT = suite.countTestCases(); |
| createPrintStream(testClass(), LOG_STREAMS, TESTS_COUNT, null); |
| return suite; |
| } |
| |
| private static Class testClass() { |
| return FullSourceWorkspaceTypeHierarchyTests.class; |
| } |
| |
| /* (non-Javadoc) |
| * @see junit.framework.TestCase#setUp() |
| */ |
| protected void setUp() throws Exception { |
| super.setUp(); |
| this.resultCollector = new JavaSearchResultCollector(); |
| } |
| /* (non-Javadoc) |
| * @see junit.framework.TestCase#tearDown() |
| */ |
| protected void tearDown() throws Exception { |
| |
| // End of execution => one test less |
| TESTS_COUNT--; |
| |
| // Log perf result |
| if (LOG_DIR != null) { |
| logPerfResult(LOG_STREAMS, TESTS_COUNT); |
| } |
| |
| // Call super at the end as it close print streams |
| super.tearDown(); |
| } |
| |
| /** |
| * Simple search result collector: only count matches. |
| */ |
| class JavaSearchResultCollector extends SearchRequestor { |
| int count = 0; |
| public void acceptSearchMatch(SearchMatch match) throws CoreException { |
| this.count++; |
| } |
| } |
| |
| protected JavaSearchResultCollector resultCollector; |
| |
| public void testPerfAllTypes() throws CoreException { |
| tagAsSummary("Type hierarchy", true); // put in fingerprint |
| ICompilationUnit unit = getCompilationUnit("org.eclipse.jdt.core", "org.eclipse.jdt.internal.compiler.ast", "ASTNode.java"); |
| assertNotNull("ASTNode not found!", unit); |
| |
| // Warm up |
| for (int i=0; i<WARMUP_COUNT; i++) { |
| IType[] types = unit.getType("ASTNode").newTypeHierarchy(null).getAllClasses(); |
| if (i==0) { |
| System.out.println(" - "+INT_FORMAT.format(types.length)+" all classes found in hierarchy."); |
| } |
| } |
| |
| // Clean memory |
| runGc(); |
| |
| // Measures |
| for (int i=0; i<MEASURES_COUNT; i++) { |
| runGc(); |
| startMeasuring(); |
| unit.getType("ASTNode").newTypeHierarchy(null).getAllClasses(); |
| stopMeasuring(); |
| } |
| |
| // Commit |
| commitMeasurements(); |
| assertPerformance(); |
| } |
| |
| /* |
| * A direct subclass of org.eclipse.jface.text.templates.TemplateVariableResolver is called Collection. |
| * Collection is also an interface that is the root of a deep hierarchy in java.util. |
| * This test proves that the interface and all its potential subtypes are not injected while computing |
| * the hierarchy. |
| * (test for bug 108820 Index based type hierarchy should not consider interfaces in index when focus is a class) |
| */ |
| public void testPerfClassWithPotentialSubinterfaces() throws CoreException { |
| ICompilationUnit unit = getCompilationUnit("org.eclipse.text", "org.eclipse.jface.text.templates", "TemplateVariableResolver.java"); |
| assertNotNull("TemplateVariableResolver not found!", unit); |
| |
| // Warm up |
| IType type = unit.getType("TemplateVariableResolver"); |
| for (int i=0; i<WARMUP_COUNT; i++) { |
| type.newTypeHierarchy(null); |
| } |
| |
| // Clean memory |
| runGc(); |
| |
| // Measures |
| for (int i=0; i<MEASURES_COUNT; i++) { |
| runGc(); |
| startMeasuring(); |
| type.newTypeHierarchy(null); |
| stopMeasuring(); |
| } |
| |
| // Commit |
| commitMeasurements(); |
| assertPerformance(); |
| |
| } |
| |
| // Test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=301438 |
| public void testPerSuperTypes() throws CoreException { |
| assertNotNull("Parser not found!", PARSER_WORKING_COPY); |
| setComment(Performance.EXPLAINS_DEGRADATION_COMMENT, |
| "Extra handling of type parameters even in case of 1.4 projects"); |
| // Warm up |
| for (int i=0; i<10*WARMUP_COUNT; i++) { // More Warm up is required. |
| IType[] types = PARSER_WORKING_COPY.getType("Parser").newSupertypeHierarchy(null).getAllClasses(); |
| if (i==0) { |
| System.out.println(" - "+INT_FORMAT.format(types.length)+" classes found in hierarchy."); |
| } |
| } |
| |
| // Clean memory |
| runGc(); |
| |
| // Measures |
| for (int i=0; i<MEASURES_COUNT; i++) { |
| runGc(); |
| startMeasuring(); |
| for (int j =0; j < 20; j++) { |
| PARSER_WORKING_COPY.getType("Parser").newSupertypeHierarchy(null).getAllClasses(); |
| } |
| stopMeasuring(); |
| } |
| |
| // Commit |
| commitMeasurements(); |
| assertPerformance(); |
| } |
| |
| } |