/**
 * Copyright (c) 2013 committers of YAKINDU 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:
 * 	committers of YAKINDU - initial API and implementation
 * 
 */
package org.yakindu.sct.refactoring.refactor;

import org.eclipse.xtext.junit4.InjectWith;
import org.eclipse.xtext.junit4.XtextRunner;
import org.junit.Assert;
import org.junit.runner.RunWith;
import org.yakindu.sct.model.sgraph.State;
import org.yakindu.sct.model.sgraph.Statechart;
import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
import org.yakindu.sct.test.models.TestModelInjectorProvider;

/**
 * Base test class for state based refactorings.
 * 
 * @author thomas kutz - Initial contribution and API
 * 
 */
@RunWith(XtextRunner.class)
@InjectWith(TestModelInjectorProvider.class)
public abstract class StateBasedRefactoringTest extends RefactoringTest {

	protected void testRefactoringOnState(String pathToInitialSct, String pathToExpectedSct, String stateName) {
		Statechart initial = models.loadStatechartFromResource(pathToInitialSct);

		State state = getStateByName(initial, stateName);

		AbstractRefactoring<?> refactoring = getRefactoring(state);
		AbstractSCTResource initialRes = (AbstractSCTResource) initial.eResource();
		initialRes.setSerializerEnabled(true);
		refactoring.internalExecute();
		initialRes.setSerializerEnabled(false);
		initialRes.linkSpecificationElements();

		Statechart expected = models.loadStatechartFromResource(pathToExpectedSct);

		compareStatecharts(initial, expected);
	}

	protected void testRefactoringIsExecutableOnState(String pathToInitialSct, String pathToExpectedSct,
			String stateName, boolean expectedResult) {
		Statechart initial = models.loadStatechartFromResource(pathToInitialSct);

		State state = getStateByName(initial, stateName);

		AbstractRefactoring<?> refactoring = getRefactoring(state);
		if (expectedResult) {
			Assert.assertTrue("Refactoring on state '" + stateName + "' was not executable, although it should be.",
					refactoring.isExecutable());
		} else {
			Assert.assertFalse("Refactoring on state '" + stateName + "' was executable, although it should not be.",
					refactoring.isExecutable());
		}
	}

	protected abstract AbstractRefactoring<?> getRefactoring(State state);

}
