/**
 * *******************************************************************************
 * Copyright (c) 2008 The University of York.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 * 
 * Contributors:
 *     Louis Rose - initial API and implementation
 * ******************************************************************************
 *
 * $Id: HutnAcceptanceTest.java,v 1.2 2008/08/07 12:44:24 louis Exp $
 */
package org.eclipse.epsilon.hutn.test.acceptance.util;

import static org.junit.Assert.fail;

import java.io.File;

import org.eclipse.epsilon.hutn.exceptions.HutnGenerationException;
import org.eclipse.epsilon.hutn.test.model.HutnTestWithFamiliesMetaModel;
import org.eclipse.epsilon.common.parse.problem.ParseProblem;
import org.eclipse.epsilon.hutn.HutnModule;
import org.eclipse.epsilon.hutn.IHutnModule;
import org.eclipse.epsilon.test.util.ModelWithEolAssertions;
import org.junit.AfterClass;

public abstract class HutnAcceptanceTest extends HutnTestWithFamiliesMetaModel {

	protected static ModelWithEolAssertions model;
	
	protected static ModelWithEolAssertions generateModel(String hutn) throws Exception {
		return generateModel(hutn, null);
	}
	
	protected static ModelWithEolAssertions generateModel(String hutn, String path) throws Exception {
		final IHutnModule module = new HutnModule();
		
		return generateModel(module, module.parse(hutn), path);
	}
	
	protected static ModelWithEolAssertions generateModel(File hutnSource) throws Exception {
		final IHutnModule module = new HutnModule();
		
		return generateModel(module, module.parse(hutnSource), null);
	}

	private static ModelWithEolAssertions generateModel(IHutnModule module, boolean parsedCorrectly, String outputPath) throws Exception, HutnGenerationException {
		
		
		if (!parsedCorrectly) {
			for (ParseProblem p : module.getParseProblems()) {
				System.err.println(p);
			}
			fail("Could not parse HUTN.");
		}
		
		final ModelWithEolAssertions result = new ModelWithEolAssertions(module.generateEmfModel());

		if (outputPath != null) {
			result.store(outputPath);
		}
		
		return result;
	}
	
	@AfterClass
	public static void disposeModel() {
		if (model != null) model.dispose();
	}
}
