/*******************************************************************************
 * Copyright (c) 2015, 2018 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     E.D.Willink - initial API and implementation
 *******************************************************************************/
package org.eclipse.qvtd.all.tests;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.examples.xtext.tests.TestFile;
import org.eclipse.ocl.examples.xtext.tests.TestProject;
import org.eclipse.ocl.pivot.resource.ProjectManager;
import org.eclipse.qvtd.text.utilities.TextModelResourceFactoryImpl;
import org.eclipse.qvtd.xtext.qvtbase.tests.XtextTestCase;

/**
 * Tests.
 */
public class TextModelTests extends XtextTestCase
{
	protected void doTextTest(String testPath) throws IOException {
		ProjectManager projectManager = getTestProjectManager();
		ResourceSet resourceSet = new ResourceSetImpl();
		projectManager.initializeResourceSet(resourceSet);
		TestProject testProject = getTestProject();
		String inPath = getTestBundleName() + "/models/" + testPath + ".textmodel";
		URI inURI = URI.createPlatformResourceURI(inPath, true);
		TestFile outFile = testProject.getOutputFile(testPath + ".out.textmodel");
		TestFile xmlFile = testProject.getOutputFile(testPath + ".xml");
		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("textmodel", new TextModelResourceFactoryImpl());
		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml", new XMLResourceFactoryImpl());
		Resource textResource = resourceSet.getResource(inURI, true);
		textResource.toString();
		URI xmlURI = xmlFile.getURI();
		URI textOutURI = outFile.getURI();
		textResource.setURI(textOutURI);
		textResource.save(null);
		Resource xmlResource = resourceSet.createResource(xmlURI);
		xmlResource.getContents().addAll(textResource.getContents());
		xmlResource.save(null);
		//
		String inFileString = readFile(new InputStreamReader(resourceSet.getURIConverter().createInputStream(inURI)));
		String outFileString = readFile(new FileReader(outFile.getFile()));
		assertEquals(inFileString, outFileString);
	}

	protected String readFile(@NonNull Reader reader) throws IOException {
		StringBuilder s = new StringBuilder();
		BufferedReader bufferedReader = new BufferedReader(reader);
		for (String line; (line = bufferedReader.readLine()) != null; ) {
			s.append(line);
			s.append("\n");
		}
		bufferedReader.close();
		return s.toString();
	}

	public void testText_BadIndents() throws Exception {
		String testPath = "badindents";
		doTextTest(testPath);
	}

	public void testText_BadTree() throws Exception {
		String testPath = "badtree";
		doTextTest(testPath);
	}

	public void testText_List() throws Exception {
		String testPath = "list";
		doTextTest(testPath);
	}

	public void testText_SimpleIndents() throws Exception {
		String testPath = "simpleindents";
		doTextTest(testPath);
	}

	public void testText_Tree() throws Exception {
		String testPath = "tree";
		doTextTest(testPath);
	}

}
