/*******************************************************************************
 * 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.mylar.monitor.reports.tests;

import java.io.File;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.core.runtime.Path;
import org.eclipse.mylar.internal.core.MylarContext;
import org.eclipse.mylar.internal.core.ScalingFactor;
import org.eclipse.mylar.internal.core.ScalingFactors;
import org.eclipse.mylar.internal.monitor.InteractionEventLogger;
import org.eclipse.mylar.monitor.tests.MylarMonitorTestsPlugin;
import org.eclipse.mylar.provisional.core.IMylarElement;
import org.eclipse.mylar.provisional.core.InteractionEvent;

/**
 * @author Mik Kersten
 */
public class ContextParsingTest extends TestCase {

	private static final String PATH_USAGE_FILE = "testdata/usage-parsing.zip";

	private List<InteractionEvent> events;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		File file;
		if (MylarMonitorTestsPlugin.getDefault() != null) {
			file = FileTool.getFileInPlugin(MylarMonitorTestsPlugin.getDefault(), new Path(PATH_USAGE_FILE));
		} else {
			file = new File(PATH_USAGE_FILE);
		}
		InteractionEventLogger logger = new InteractionEventLogger(file);
		events = logger.getHistoryFromFile(file);
	}

	@Override
	protected void tearDown() throws Exception {
		super.tearDown();
		events.clear();
	}

	public void testOriginIdValidity() {
		for (InteractionEvent event : events) {
			if (event.isValidStructureHandle()) {
				assertFalse(event.getStructureHandle().equals("null"));
			}
		}
	}
	
	public void testHistoryParsingWithDecayReset() {
		ScalingFactors scalingFactors = new ScalingFactors();
//		scalingFactors.setDecay(new ScalingFactor("decay", .05f)); 
		MylarContext context = new MylarContext("test", scalingFactors);
		int numEvents = 0;
		for (InteractionEvent event : events) {
			if (event.isValidStructureHandle()) {
//			if (SelectionMonitor.isValidStructureHandle(event)) {
				InteractionEvent newEvent = InteractionEvent.makeCopy(event, 1f);
				context.parseEvent(newEvent); 
				if (event.isValidStructureHandle() && event.getKind().equals(InteractionEvent.Kind.SELECTION)) {
//				if (SelectionMonitor.isValidStructureHandle(event) && event.getKind().equals(InteractionEvent.Kind.SELECTION)) {
					IMylarElement element = context.parseEvent(event);
					
					// reset decay if not selected
					if (element.getInterest().getValue() < 0) { 
						float decayOffset = (-1) * (element.getInterest().getValue()) + 1;
						element = context.parseEvent(new InteractionEvent(InteractionEvent.Kind.MANIPULATION,
								event.getStructureKind(), event.getStructureHandle(), "test-decay", decayOffset));
					} 
					
					assertTrue("should be positive: " + element.getInterest().getValue(), element.getInterest().getValue() >= 0);
					numEvents++;
				}
			}
		}
	}
	
	public void testScalingVactorSet() {
		ScalingFactors scalingFactors = new ScalingFactors();
		scalingFactors.setDecay(new ScalingFactor("decay", 0f)); 
		MylarContext context = new MylarContext("test", scalingFactors);
		assertEquals(0f, context.getScalingFactors().getDecay().getValue());	 	
	}
}
