/*******************************************************************************
 * Copyright (c) 2011, 2012 E.D.Willink 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:
 *   L.Goubet, E.D.Willink - Initial API and implementation
 *******************************************************************************/

package org.eclipse.ocl.examples.pivot.tests;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.ocl.examples.pivot.ParserException;
import org.eclipse.ocl.examples.pivot.PivotConstants;
import org.eclipse.ocl.examples.pivot.Root;
import org.eclipse.ocl.examples.pivot.manager.MetaModelManager;
import org.eclipse.ocl.examples.pivot.uml.UML2Pivot;
import org.eclipse.uml2.uml.util.UMLUtil;
import org.eclipse.uml2.uml.util.UMLUtil.UML2EcoreConverter;

/**
 * Test suite with a simple Fruit model.
 */
@SuppressWarnings("nls")
public abstract class PivotStateMachineTestSuite extends PivotTestSuite
{
	protected EPackage statefulEPackage;
	protected EFactory statefulEFactory;

//	protected org.eclipse.ocl.examples.pivot.Package fruitPackage;
	
	protected EClass c1Class;

	public PivotStateMachineTestSuite(boolean useCodeGen) {
		super(useCodeGen);
	}

	@SuppressWarnings("null")
	protected Resource getPivotFromUML(MetaModelManager metaModelManager, Resource umlResource) throws ParserException {
//		String problem = UML2Pivot.initialize(metaModelManager.getExternalResourceSet());
//		assertNull(problem);
		UML2Pivot uml2Pivot = UML2Pivot.getAdapter(umlResource, metaModelManager);
		Root pivotRoot = uml2Pivot.getPivotRoot();
		Resource asResource = pivotRoot.eResource();
		assertNoResourceErrors("Normalisation failed", asResource);
		assertNoValidationErrors("Normalisation invalid", asResource);
		return asResource;
	}
	
	protected Resource initStateMachinePackage() throws ParserException {
		ResourceSet resourceSet2 = resourceSet;
		assert resourceSet2 != null;
		UML2Pivot.initialize(resourceSet2);
		URI uri = getTestModelURI("model/StateMachines.uml");
		Resource umlResource = resourceSet2.getResource(uri, true);
		List<EObject> contents = umlResource.getContents();
		Map<String, String> options = new HashMap<String, String>();
		options.put(UML2EcoreConverter.OPTION__ECORE_TAGGED_VALUES, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__REDEFINING_OPERATIONS, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__REDEFINING_PROPERTIES, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__SUBSETTING_PROPERTIES, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__UNION_PROPERTIES, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__DERIVED_FEATURES, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__DUPLICATE_OPERATIONS, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__DUPLICATE_OPERATION_INHERITANCE, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__DUPLICATE_FEATURES, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__DUPLICATE_FEATURE_INHERITANCE, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__SUPER_CLASS_ORDER, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__ANNOTATION_DETAILS, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__INVARIANT_CONSTRAINTS, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__OPERATION_BODIES, UMLUtil.OPTION__PROCESS);
		options.put(UML2EcoreConverter.OPTION__COMMENTS,  UMLUtil.OPTION__PROCESS);
		UML2EcoreConverter uml2EcoreConverter = new UML2EcoreConverter();
		Collection<? extends EObject> ecoreContents = uml2EcoreConverter.convert(contents, options, null, null);
		Resource ecoreResource = resourceSet2.createResource(URI.createURI("StateMachines.ecore"));
		ecoreResource.getContents().addAll(ecoreContents);
		statefulEPackage = (EPackage) ecoreResource.getContents().get(0);
		statefulEFactory = statefulEPackage.getEFactoryInstance();
		c1Class = (EClass) statefulEPackage.getEClassifier("C1");
//		OCL ocl1 = OCL.newInstance();
//		MetaModelManager metaModelManager1 = ocl1.getMetaModelManager();
//		try {
			Resource asResource = getPivotFromUML(metaModelManager, umlResource);
		return asResource;
	}

	@SuppressWarnings("null")
	@Override
    protected void setUp() throws Exception {
        super.setUp();
		metaModelManager.addGlobalNamespace(PivotConstants.OCL_NAME, metaModelManager.getASMetamodel());
    }
}
