/*******************************************************************************
 * Copyright (c) 2008, 2012 Obeo.
 * 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:
 *     Obeo - initial API and implementation
 *******************************************************************************/
package org.eclipse.acceleo.parser.tests;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.acceleo.common.internal.utils.compatibility.AcceleoCompatibilityEclipseHelper;
import org.eclipse.acceleo.common.internal.utils.compatibility.OCLVersion;
import org.eclipse.acceleo.common.utils.ModelUtils;
import org.eclipse.acceleo.internal.parser.cst.utils.FileContent;
import org.eclipse.acceleo.model.mtl.MtlPackage;
import org.eclipse.acceleo.parser.AcceleoFile;
import org.eclipse.acceleo.parser.AcceleoParser;
import org.eclipse.acceleo.parser.AcceleoParserProblem;
import org.eclipse.acceleo.parser.AcceleoSourceBuffer;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.osgi.framework.Bundle;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

public class AcceleoParserTests {

	private static Bundle bundle;

	@BeforeClass
	public static void setUp() throws Exception {
		bundle = Platform.getBundle("org.eclipse.acceleo.parser.tests"); //$NON-NLS-1$
	}

	@AfterClass
	public static void tearDown() throws Exception {
		bundle = null;
	}

	private File createFile(String pathName) {
		try {
			String fileLocation = FileLocator.resolve(bundle.getEntry(pathName)).getPath();
			return new File(fileLocation);
		} catch (IOException e) {
			fail(e.getMessage());
		} catch (NullPointerException e) {
			/*
			 * on the server the unit test fails with an NPE :S
			 */
			fail(e.getMessage());
		}
		return null;
	}

	private URI createFileURI(String pathName) {
		try {
			String fileLocation = FileLocator.resolve(bundle.getEntry(pathName)).getPath();
			if (fileLocation.startsWith("file:")) { //$NON-NLS-1$
				fileLocation = fileLocation.substring("file:".length()); //$NON-NLS-1$
			}
			return URI.createFileURI(fileLocation);
		} catch (IOException e) {
			fail(e.getMessage());
		}
		return null;
	}

	@Test
	public void testCompileSourceBufferEcoreAcceleoWithImport() {
		File file = createFile("/data/template/mtlParserEcore.mtl"); //$NON-NLS-1$
		if (file == null) {
			return;
		}
		AcceleoSourceBuffer source = new AcceleoSourceBuffer(file);
		AcceleoParser parser = new AcceleoParser();
		ResourceSet resourceSet = new ResourceSetImpl();
		Resource resource = ModelUtils.createResource(URI
				.createURI("http://acceleo.eclipse.org/default.emtl"), resourceSet); //$NON-NLS-1$
		List<URI> dependencies = new ArrayList<URI>();
		dependencies.add(createFileURI("/data/template/mtlParserEcoreCommon.emtl")); //$NON-NLS-1$
		parser.parse(source, resource, dependencies);
		assertNotNull(source.getAST());
		if (source.getProblems().getList().size() > 0
				&& AcceleoCompatibilityEclipseHelper.getCurrentOCLVersion() != OCLVersion.GANYMEDE) {
			// Remark : It fails for eclipse 3.4 because OCL didn't support "Set(String)"
			fail(source.getProblems().getMessage());
		}
	}

	public void testCompileRecursiveModuleExtend() {
		// Difficult to test, deactivating this test for now.
		List<File> files = new ArrayList<File>();
		files.add(createFile("/data/template/RecursiveModule1.mtl")); //$NON-NLS-1$
		files.add(createFile("/data/template/RecursiveModule2.mtl")); //$NON-NLS-1$
		File problemFile = createFile("/data/template/RecursiveModule3.mtl"); //$NON-NLS-1$
		files.add(problemFile);
		List<URI> resources = new ArrayList<URI>();
		resources.add(createFileURI("/data/template/RecursiveModule1.emtl")); //$NON-NLS-1$
		resources.add(createFileURI("/data/template/RecursiveModule2.emtl")); //$NON-NLS-1$
		resources.add(createFileURI("/data/template/RecursiveModule3.emtl")); //$NON-NLS-1$
		AcceleoParser parser = new AcceleoParser();
		List<URI> dependencies = new ArrayList<URI>();
		List<AcceleoFile> acceleoFiles = new ArrayList<AcceleoFile>();
		for (File inputFile : files) {
			acceleoFiles.add(new AcceleoFile(inputFile, AcceleoFile.simpleModuleName(inputFile)));
		}
		parser.parse(acceleoFiles, resources, dependencies, null, new BasicMonitor());

		for (File file : files) {
			List<AcceleoParserProblem> problems = parser.getProblems(file).getList();
			if (file != problemFile) {
				assertEquals(0, problems.size());
			} else {
				assertEquals(1, problems.size());
			}
		}
	}

	@Test
	public void testCompileSourceBufferLibrary2textAcceleo() {
		File file = createFile("/data/template/mtlParserLibrary2text.mtl"); //$NON-NLS-1$
		AcceleoSourceBuffer source = new AcceleoSourceBuffer(file);
		AcceleoParser parser = new AcceleoParser();
		ResourceSet resourceSet = new ResourceSetImpl();
		Resource resource = ModelUtils.createResource(URI
				.createURI("http://acceleo.eclipse.org/default.emtl"), resourceSet); //$NON-NLS-1$
		parser.parse(source, resource, new ArrayList<URI>());
		assertNotNull(source.getAST());
		if (source.getProblems().getList().size() > 0) {
			fail(source.getProblems().getMessage());
		}
	}

	@Test
	public void testCompileFileLibrary2textAcceleo() {
		File iFile = createFile("/data/template/mtlParserLibrary2text.mtl"); //$NON-NLS-1$
		URI oURI = createFileURI("/data/template/mtlParserLibrary2text.emtl"); //$NON-NLS-1$
		testCompileFile(iFile, oURI, 0);
	}

	@Test
	public void testCompileFileLibrary2textAcceleoWithBadOutputURI() {
		File iFile = createFile("/data/template/mtlParserLibrary2text.mtl"); //$NON-NLS-1$
		URI oURI = URI.createURI("http://acceleo.eclipse.org"); //$NON-NLS-1$
		testCompileFile(iFile, oURI, 1);
	}

	private void testCompileFile(File iFile, URI oURI, int problemsCount) {
		List<File> iFiles = new ArrayList<File>();
		iFiles.add(iFile);
		AcceleoParser parser = new AcceleoParser();
		List<URI> oURIs = new ArrayList<URI>();
		oURIs.add(oURI);
		assertNull(parser.getProblems(iFile));
		List<AcceleoFile> acceleoFiles = new ArrayList<AcceleoFile>();
		for (File inputFile : iFiles) {
			acceleoFiles.add(new AcceleoFile(inputFile, AcceleoFile.simpleModuleName(inputFile)));
		}
		parser.parse(acceleoFiles, oURIs, new ArrayList<URI>(), null, new BasicMonitor());
		if (parser.getProblems(iFile).getList().size() != problemsCount) {
			fail("You must have " + problemsCount + " syntax errors : " //$NON-NLS-1$ //$NON-NLS-2$
					+ parser.getProblems(iFile).getMessage());
		}
		if (problemsCount == 0) {
			assertEquals(parser.getProblems(iFile).getMessage(), ""); //$NON-NLS-1$
			assertEquals(parser.getProblems(iFile).toString(), ""); //$NON-NLS-1$
		} else {
			assertTrue(parser.getProblems(iFile).getMessage() != null);
			Iterator<AcceleoParserProblem> it = parser.getProblems(iFile).getList().iterator();
			while (it.hasNext()) {
				AcceleoParserProblem parserProblem = it.next();
				assertTrue(parserProblem.getMessage() != null);
				assertTrue(parserProblem.getLine() > 0);
				assertTrue(parserProblem.getPosBegin() > -1);
				assertTrue(parserProblem.getPosEnd() > -1);
				assertTrue(parserProblem.toString().length() > 0);
			}
		}
		parser.getProblems(iFile).clear();
	}

	@Test
	public void testIndentStrategy() {
		File file = createFile("/data/template/mtlIndentStrategy.mtl"); //$NON-NLS-1$
		AcceleoSourceBuffer source = new AcceleoSourceBuffer(file);
		AcceleoParser parser = new AcceleoParser();
		ResourceSet resourceSet = new ResourceSetImpl();
		Resource resource = ModelUtils.createResource(URI
				.createURI("http://acceleo.eclipse.org/default.emtl"), resourceSet); //$NON-NLS-1$
		List<URI> dependencies = new ArrayList<URI>();
		parser.parse(source, resource, dependencies);
		assertNotNull(source.getAST());
		if (source.getProblems().getList().size() > 0) {
			fail(source.getProblems().getMessage());
		}
		String[] results = {"\n", "\n", "\t\t", "\n", "\t\t", "\n", "\n", "\t", "\n", "\t\t", "\n", "\t\t\t", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$ //$NON-NLS-10$ //$NON-NLS-11$ //$NON-NLS-12$
				"\n", "\t\t\t", "\n", "\n", "\n\t\t", "\n", "\n" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
		int i = -1;
		StringBuffer report = new StringBuffer();
		Iterator<EObject> it = resource.getContents().get(0).eAllContents();
		while (it.hasNext()) {
			EObject eObject = it.next();
			if (eObject instanceof org.eclipse.ocl.ecore.StringLiteralExp
					&& !(eObject.eContainer() != null && eObject.eContainer().eContainingFeature() == MtlPackage.eINSTANCE
							.getIfBlock_IfExpr())) {
				i++;
				org.eclipse.ocl.ecore.StringLiteralExp literal = (org.eclipse.ocl.ecore.StringLiteralExp)eObject;
				String symbol = literal.getStringSymbol().replaceAll("\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
				if (i >= results.length || !results[i].equals(symbol)) {
					int line = FileContent.lineNumber(source.getBuffer(), literal.getStartPosition());
					report.append("New value at line " + line + " [" + i + "] = '" + symbol + "'\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
				}
			}
		}
		if (report.length() > 0) {
			System.out.print(report);
			fail(report.toString());
		}
	}

}
