blob: 2629d38fb9c4ec93e0c03d0aa5bcfd1393751456 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004 - 2006 University Of British Columbia 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:
* University Of British Columbia - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.sandbox.tests;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.mylyn.context.core.ContextCorePlugin;
import org.eclipse.mylyn.context.ui.ContextUiPlugin;
import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
import org.eclipse.mylyn.internal.java.ui.actions.FocusPackageExplorerAction;
import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
import org.eclipse.mylyn.internal.monitor.reports.collectors.FocusedUiUsageAnalysisCollector;
import org.eclipse.mylyn.internal.monitor.reports.collectors.FocusedUiViewUsageCollector;
import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
import org.eclipse.mylyn.internal.tasks.ui.actions.TaskActivateAction;
import org.eclipse.mylyn.monitor.core.InteractionEvent;
import org.eclipse.mylyn.monitor.ui.MonitorUiPlugin;
import org.eclipse.mylyn.monitor.usage.ReportGenerator;
import org.eclipse.mylyn.monitor.usage.UsageStatisticsSummary;
/**
* @author Mik Kersten
*/
public class StatisticsReportingTest extends TestCase {
private InteractionEventLogger logger;
private FocusedUiViewUsageCollector viewCollector = new FocusedUiViewUsageCollector();
private FocusedUiUsageAnalysisCollector editRatioCollector = new FocusedUiUsageAnalysisCollector();;
private ReportGenerator report;
@Override
protected void setUp() throws Exception {
super.setUp();
assertNotNull(ContextCorePlugin.getDefault());
assertNotNull(JavaUiBridgePlugin.getDefault());
assertNotNull(PackageExplorerPart.openInActivePerspective());
UiUsageMonitorPlugin.getDefault().startMonitoring();
assertTrue(UiUsageMonitorPlugin.getDefault().isMonitoringEnabled());
logger = UiUsageMonitorPlugin.getDefault().getInteractionLogger();
logger.clearInteractionHistory();
List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
collectors.add(viewCollector);
collectors.add(editRatioCollector);
report = new ReportGenerator(logger, collectors);
report.forceSyncForTesting(true);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
protected InteractionEvent mockExplorerSelection(String handle) {
InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.SELECTION, "java", handle,
JavaUI.ID_PACKAGES);
MonitorUiPlugin.getDefault().notifyInteractionObserved(event);
return event;
}
protected void mockEdit(String handle) {
MonitorUiPlugin.getDefault().notifyInteractionObserved(
new InteractionEvent(InteractionEvent.Kind.EDIT, "java", handle, JavaUI.ID_PACKAGES));
}
protected void mockTypesSelection(String handle) {
MonitorUiPlugin.getDefault().notifyInteractionObserved(
new InteractionEvent(InteractionEvent.Kind.SELECTION, "java", handle, JavaUI.ID_TYPES_VIEW));
}
public void testEditRatio() throws InvocationTargetException, InterruptedException {
logger.stopMonitoring();
PackageExplorerPart part = PackageExplorerPart.openInActivePerspective();
assertNotNull(part.getTreeViewer());
part.setFocus();
logger.startMonitoring();
final InteractionEvent first = mockExplorerSelection("A.java");
mockUserDelay();
mockUserDelay();
final InteractionEvent second = mockExplorerSelection("A.java");
assertTrue(!first.getDate().equals(second.getDelta()));
try {
// XXX: this is a hack and sensitive to CPU speeds
Thread.sleep(3000);
} catch (InterruptedException ie) {
fail();
}
mockEdit("A.java");
MonitorUiPlugin.getDefault().notifyInteractionObserved(
InteractionEvent.makeCommand(TaskActivateAction.ID, ""));
mockExplorerSelection("A.java");
mockEdit("A.java");
mockUserDelay();
mockEdit("A.java");
logger.stopMonitoring();
report.getStatisticsFromInteractionHistory(logger.getOutputFile(), null);
// TODO: these are off from expected when test run alone, due to unknown
// element selections
assertEquals(0.5f, editRatioCollector.getBaselineRatio(-1));
assertEquals(2f, editRatioCollector.getMylarRatio(-1));
}
@SuppressWarnings("unused")
public void testSimpleSelection() {
mockExplorerSelection("A.java");
report.getStatisticsFromInteractionHistory(logger.getOutputFile(), new JobChangeAdapter() {
public void done() {
UsageStatisticsSummary summary = report.getLastParsedSummary();
assertTrue(summary.getSingleSummaries().size() > 0);
}
});
}
@SuppressWarnings("unused")
public void testFilteredModeDetection() throws IOException {
UiUsageMonitorPlugin.getDefault().addMonitoredPreferences(
ContextUiPlugin.getDefault().getPluginPreferences());
UiUsageMonitorPlugin.getDefault().getInteractionLogger().clearInteractionHistory();
mockExplorerSelection("A.java");
mockUserDelay();
mockExplorerSelection("A.java");
mockUserDelay();
mockTypesSelection("A.java");
assertNotNull(ContextUiPlugin.getDefault().getPreferenceStore());
String prefId = FocusPackageExplorerAction.PREF_ID_PREFIX + JavaUI.ID_PACKAGES;
assertNotNull(prefId);
PackageExplorerPart part = PackageExplorerPart.openInActivePerspective();
assertNotNull(part);
// AbstractFocusViewAction action =
// FocusPackageExplorerAction.getActionForPart(part);
// assertNotNull(action);
ContextUiPlugin.getDefault().getPreferenceStore().setValue(prefId, true);
mockExplorerSelection("A.java");
mockUserDelay();
mockExplorerSelection("A.java");
mockUserDelay();
mockTypesSelection("A.java");
ContextUiPlugin.getDefault().getPreferenceStore().setValue(prefId, false);
mockExplorerSelection("A.java");
logger.stopMonitoring();
report.getStatisticsFromInteractionHistory(logger.getOutputFile(), new JobChangeAdapter() {
public void done() {
int normal = viewCollector.getNormalViewSelections().get(JavaUI.ID_PACKAGES);
assertEquals(5, normal);
int filtered = viewCollector.getFilteredViewSelections().get(JavaUI.ID_PACKAGES);
assertEquals(2, filtered);
UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(
ContextUiPlugin.getDefault().getPluginPreferences());
}
});
}
/**
* Delay enough to make replicated events different
*/
private void mockUserDelay() {
// TODO: Refactor into mylar.core.tests
try {
// XXX: this could be sensitive to CPU speeds
Thread.sleep(100);
} catch (InterruptedException ie) {
fail();
}
}
}