/*******************************************************************************
 * Copyright (c) 2016 Uwe Ritzmann 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:
 *     Uwe Ritzmann - initial API and implementation
 *******************************************************************************/
package org.eclipse.m2m.tests.qvt.oml;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.compare.contentmergeviewer.ITokenComparator;
import org.eclipse.compare.rangedifferencer.IRangeComparator;
import org.eclipse.compare.rangedifferencer.RangeDifference;
import org.eclipse.compare.rangedifferencer.RangeDifferencer;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EPackage.Registry;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.xmi.XMIResource;
import org.eclipse.m2m.internal.qvt.oml.QvtMessage;
import org.eclipse.m2m.internal.qvt.oml.common.MDAConstants;
import org.eclipse.m2m.internal.qvt.oml.common.io.FileUtil;
import org.eclipse.m2m.internal.qvt.oml.compiler.CompiledUnit;
import org.eclipse.m2m.internal.qvt.oml.compiler.CompilerUtils;
import org.eclipse.m2m.internal.qvt.oml.compiler.ExeXMISerializer;
import org.eclipse.m2m.internal.qvt.oml.compiler.QVTOCompiler;
import org.eclipse.m2m.internal.qvt.oml.compiler.QvtCompilerOptions;
import org.eclipse.m2m.internal.qvt.oml.compiler.UnitProxy;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfException;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtil;
import org.eclipse.m2m.internal.qvt.oml.emf.util.urimap.MetamodelURIMappingHelper;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QVTEvaluationOptions;
import org.eclipse.m2m.internal.qvt.oml.project.builder.WorkspaceUnitResolver;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.TransformationUtil;
import org.eclipse.m2m.tests.qvt.oml.UnparserTests.TestData;
import org.eclipse.m2m.tests.qvt.oml.util.TestUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import junit.framework.TestCase;

@RunWith(Parameterized.class)
public class TestQvtUnparser extends TestCase {
		
	public TestQvtUnparser(TestData data) {
        super(data.getDir());
        myData = data;        
    }
	
	@Parameters(name="{0}")
	public static Iterable<TestData> data() {
		return Arrays.asList(
			new TestData[] {
		        new TestData("A",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("abstractresult",0,0,1),  //$NONXXX	//1: preMarked
		        new TestData("accessbooleans",0,0),  //$NONXXX
		        new TestData("addclass",0,0),  //$NONXXX
		        new TestData("addclassviamodificationininit",0,0,1),  //$NONXXX	//1: preMarked
		        new TestData("addclassviaoutinocl",0,0),  //$NONXXX
		        new TestData("addclassviasequence",0,0),  //$NONXXX
		        new TestData("addrealtostring",0,0),  //$NONXXX
		        new TestData("addundefined",0,0,26),  //$NONXXX	//26: preMarked
		        new TestData("allinstances",0,0),  //$NONXXX
		        new TestData("AnotherTransformation",0,0),  //$NONXXX
		        new TestData("AnyExtension",0,0),  //$NONXXX
		        new TestData("assert_log_minimal",0,0),  //$NONXXX
		        new TestData("assert_log",0,0),  //$NONXXX
		        new TestData("assignresultininit",0,0),  //$NONXXX
		        new TestData("assigntonullowner",0,0,1),  //$NONXXX	//1: preMarked
		        new TestData("assigntoprimfeature",0,0,1),  //$NONXXX	//1: preMarked
		        new TestData("auxtransf",0,0),  //$NONXXX
		        new TestData("b1",0,0),  //$NONXXX
		        new TestData("bagorderedsetintersection",0,0),  //$NONXXX
		        new TestData("Base",0,0),  //$NONXXX
	        	new TestData("blackboxlib_237781",0,0),  //$NONXXX
				new TestData("blackboxlib_uri",0,0),  //$NONXXX
				new TestData("blackboxlib_annotation_java",0,0),  //$NONXXX
		        new TestData("blackboxlibASTmodel",0,0),  //$NONXXX
		        new TestData("blackboxlib_context",0,0),  //$NONXXX
		        new TestData("bodywithsemicolon",0,0),  //$NONXXX
		        new TestData("boxing",0,0),  //$NONXXX
		        new TestData("bug204126_1",0,0,1),  //$NONXXX // 4: target names in resolve expressions
		        new TestData("bug204126_2",0,0,1),  //$NONXXX // 4: target names in resolve expressions
		        new TestData("bug204126_3",0,0,1),  //$NONXXX // 4: target names in resolve expressions
		        new TestData("bug204126_4",0,0,1),  //$NONXXX // 4: target names in resolve expressions
		        new TestData("bug204126_5",0,0,1),  //$NONXXX // 4: target names in resolve expressions
		        new TestData("bug204126_6",0,0,1),  //$NONXXX // 4: target names in resolve expressions
		        new TestData("bug204126_7",0,0,1),  //$NONXXX // 4: target names in resolve expressions
		        new TestData("bug205303_1",0,0,1+4),  //$NONXXX // 1:preMarked,16: target names in resolve expressions
		        new TestData("bug205303_2",0,0,1+6),  //$NONXXX // 1:preMarked,24: target names in resolve expressions
		        new TestData("bug_214938",0,0),  //$NONXXX
		        new TestData("bug216317",0,0,2),  //$NONXXX // 2*4: target names in resolve expressions
		        new TestData("bug219075_1",0,0),  //$NONXXX
		        new TestData("bug224094",0,0),  //$NONXXX
		        new TestData("bug233984",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("bug2437_1",0,0,4),  //$NONXXX // 4*2: implicit set conversion of OCL analyzer
		        new TestData("bug2437_2",0,0),  //$NONXXX
		        new TestData("bug2437_3",0,0),  //$NONXXX
		        new TestData("bug2437_4",0,0,1),  //$NONXXX // 1*2: implicit set conversion of OCL analyzer
		        new TestData("bug2437_5",0,0,1),  //$NONXXX // 1*2: implicit set conversion of OCL analyzer
		        new TestData("bug244701",0,0),  //$NONXXX
		        new TestData("bug267917",0,0),  //$NONXXX
		        new TestData("bug268636lib",0,0),  //$NONXXX
		        new TestData("bug272869lib",0,0),  //$NONXXX
		        new TestData("bug2732",0,0,2),  //$NONXXX
		        new TestData("bug2741",0,0),  //$NONXXX
		        new TestData("bug274105_274505",0,0,9),  //$NONXXX // 9*2: implicit set conversion of OCL analyzer
		        new TestData("bug2787",0,0,1),  //$NONXXX // 1*2: implicit set conversion of OCL analyzer
		        new TestData("bug2839",0,0,1),  //$NONXXX // 1*2: implicit set conversion of OCL analyzer
		        new TestData("bug289982_ambiguousLib",0,0),  //$NONXXX
		        new TestData("bug289982_lib",0,0),  //$NONXXX
		        new TestData("bug289982_lib_failed",0,0),  //$NONXXX
		        new TestData("bug289982_undefinedLib",0,0),  //$NONXXX
		        new TestData("bug294127",0,0),  //$NONXXX
		        new TestData("bug301134",0,0),  //$NONXXX
		        new TestData("bug314443",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("bug323915",0,0),  //$NONXXX
		        new TestData("bug325192",0,0,4),  //$NONXXX // 4*2: implicit set conversion of OCL analyzer
		        new TestData("bug326871",0,0),  //$NONXXX
		        new TestData("bug326871_lib",0,0),  //$NONXXX
		        new TestData("bug326871_standalone",0,0),  //$NONXXX
		        new TestData("bug370098",0,0),  //$NONXXX
		        new TestData("bug377882",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("bug388325",0,0),  //$NONXXX
		        new TestData("bug388801",0,0),  //$NONXXX
		        new TestData("bug392156",0,0,2+12),  //$NONXXX	//2*2: implicit set conversion of OCL analyzer, 12*4: target names in resolve expressions
		        new TestData("bug392429",0,0),  //$NONXXX
		        new TestData("bug397215",0,0),  //$NONXXX
		        new TestData("bug397398",0,0),  //$NONXXX
		        new TestData("bug400233_lib",0,0),  //$NONXXX
		        new TestData("bug400720",0,0),  //$NONXXX
		        new TestData("bug404647",0,0),  //$NONXXX
		        new TestData("bug410470",0,0),  //$NONXXX
		        new TestData("bug413130",0,0),  //$NONXXX
		        new TestData("bug413131",0,0,1),  //$NONXXX	//42: t6 EAttribute vs. EReference
		        new TestData("bug414363",0,0),  //$NONXXX
		        new TestData("bug414472",0,0),  //$NONXXX
		        new TestData("bug414619",0,0),  //$NONXXX
		        new TestData("bug414642",0,0),  //$NONXXX
		        new TestData("bug415024",0,0),  //$NONXXX
		        new TestData("bug415029",0,0),  //$NONXXX
		        new TestData("bug415209",0,0),  //$NONXXX
		        new TestData("bug415310",0,0),  //$NONXXX
		        new TestData("bug415315",0,0),  //$NONXXX
		        new TestData("bug415661",0,0),  //$NONXXX
		        new TestData("bug416584lib",0,0),  //$NONXXX
		        new TestData("bug417751",0,0),  //$NONXXX
		        new TestData("bug417779",0,0),  //$NONXXX
		        new TestData("bug417996",0,0,2),  //$NONXXX	// 2: order of properties changed
		        new TestData("bug418512",0,0),  //$NONXXX
		        new TestData("bug418961_lib",0,0),  //$NONXXX
		        new TestData("bug419299",0,0),  //$NONXXX
		        new TestData("bug422315",0,0),  //$NONXXX
		        new TestData("bug424086",0,0,2),  //$NONXXX	// 2: target names in resolve expressions
		        new TestData("bug424584",0,0),  //$NONXXX
		        new TestData("bug424740",0,0),  //$NONXXX
		        new TestData("bug424896",0,0),  //$NONXXX
		        new TestData("bug424912",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("bug424979",0,0,10),  //$NONXXX	// 10*2: implicit set conversion of OCL analyzer
		        new TestData("bug425069a",0,0),  //$NONXXX
		        new TestData("bug425634",0,0,10),  //$NONXXX	// 10*4: target names in resolve expressions
		        new TestData("bug427237",0,0),  //$NONXXX
		        new TestData("bug427348",0,0),  //$NONXXX
		        new TestData("bug428028",0,0),  //$NONXXX
		        new TestData("bug428316",0,0),  //$NONXXX
		        new TestData("bug428618",0,0,1),  //$NONXXX // 1*2: implicit set conversion of OCL analyzer
		        new TestData("bug432786",0,0,2),  //$NONXXX	// 2*4: target names in resolve expressions
		        new TestData("bug433292",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("bug433585",0,0),  //$NONXXX
		        new TestData("bug440514",0,0),  //$NONXXX
		        new TestData("bug449445",0,0),  //$NONXXX
		        new TestData("bug449912",0,0),  //$NONXXX
		        new TestData("bug457433",0,0),  //$NONXXX
		        new TestData("bug463395",0,0),  //$NONXXX
		        new TestData("bug463396",0,0),  //$NONXXX
		        new TestData("bug463572_lib",0,0),  //$NONXXX
		        new TestData("bug466705",0,0),  //$NONXXX
		        new TestData("bug467325",0,0),  //$NONXXX
		        new TestData("bug467600",0,0),  //$NONXXX
		        new TestData("bug467600_Bag",0,0),  //$NONXXX
		        new TestData("bug467600_Collection",0,0),  //$NONXXX
		        new TestData("bug467600_List",0,0),  //$NONXXX
		        new TestData("bug467600_OrderedSet",0,0),  //$NONXXX
		        new TestData("bug467600_Sequence",0,0),  //$NONXXX
		        new TestData("bug467600_Set",0,0),  //$NONXXX
		        new TestData("bugzilla443",0,0),  //$NONXXX
		        new TestData("C",0,0),  //$NONXXX
		        new TestData("calldump",0,0),  //$NONXXX
		        new TestData("calloclIsUndefinedforundefined",0,0),  //$NONXXX
		        new TestData("callvirtforundefined",0,0),  //$NONXXX
		        new TestData("castinttodouble",0,0),  //$NONXXX
		        new TestData("chainedAssignments_261024",0,0),  //$NONXXX
		        new TestData("CheckMemoryLeak",0,0),  //$NONXXX
		        new TestData("ChildInTreeInput",0,0),  //$NONXXX
		        new TestData("collectionMappingResult",0,0),  //$NONXXX
		        new TestData("collectreturntype",0,0),  //$NONXXX
		        new TestData("ColorSettingPreviewCode",0,0),  //$NONXXX
		        new TestData("compatible",0,0),  //$NONXXX
		        new TestData("computeExp_250403",0,0),  //$NONXXX
		        new TestData("configpropstype",0,0),  //$NONXXX
		        new TestData("constructors",0,0),  //$NONXXX
		        new TestData("contextlesscall",0,0,1),  //$NONXXX	//1: preMarked
		        new TestData("continue_break",0,0),  //$NONXXX
		        new TestData("continue_perf",0,0),  //$NONXXX
		        new TestData("copynameviacontextmapping",0,0),  //$NONXXX
		        new TestData("customop",0,0),  //$NONXXX
		        new TestData("deprecated_importLocation",0,0),  //$NONXXX
		        new TestData("deprecated_rename",0,0),  //$NONXXX
		        new TestData("dicttype",0,0),  //$NONXXX
		        new TestData("doubleQuoteStrings_262734",0,0),  //$NONXXX
		        new TestData("dupImportLibrary",0,0),  //$NONXXX
		        new TestData("DuplicatedNamesDetection",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("dynamicpackage",0,0),  //$NONXXX
		        new TestData("Ecore2Ecore",0,0),  //$NONXXX
		        new TestData("Ecore2EcoreExt",0,0),  //$NONXXX
		        new TestData("ecore2uml_",0,0),  //$NONXXX
		        //new TestData("Ecore2UML",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("emptyExtents",0,0),  //$NONXXX
		        new TestData("emptyinit",0,0),  //$NONXXX
		        new TestData("emptymodule",0,0),  //$NONXXX
		        new TestData("emptyout",0,0),  //$NONXXX
		        new TestData("endsectfull",0,0),  //$NONXXX
		        new TestData("endsectimplicitpopulation",0,0),  //$NONXXX
		        new TestData("endsectimplicitpopulationnoinit",0,0),  //$NONXXX
		        new TestData("endsectinitnopopulation",0,0),  //$NONXXX
		        new TestData("endsectonly",0,0),  //$NONXXX
		        new TestData("endsectpopulationnoinit",0,0),  //$NONXXX
		        new TestData("endsectresultpatch",0,0),  //$NONXXX
		        new TestData("entryOp",0,0),  //$NONXXX
		        new TestData("equndefined",0,0,28),  //$NONXXX // 28:preMarked
		        new TestData("escape_sequences_250630",0,0),  //$NONXXX
		        new TestData("exec1",0,0),  //$NONXXX
		        new TestData("exec2",0,0),  //$NONXXX
		        new TestData("exec3",0,0),  //$NONXXX
		        new TestData("exec3_lib",0,0),  //$NONXXX
		        new TestData("exists",0,0),  //$NONXXX
		        new TestData("ExtendedLibrary",0,0),  //$NONXXX
		        new TestData("firstlast",0,0),  //$NONXXX
		        new TestData("firstunparsertest",0,0),  //$NONXXX
		        new TestData("FooLibImport",0,0),  //$NONXXX
		        new TestData("forExp_245275",0,0),  //$NONXXX
		        new TestData("getpropfromundefined",0,0),  //$NONXXX
		        new TestData("HelpersAndQueries",0,0),  //$NONXXX
		        new TestData("helperSimpleDef_252173",0,0),  //$NONXXX
		        new TestData("imp",0,0),  //$NONXXX
		        new TestData("implicitpopulation",0,0),  //$NONXXX
		        new TestData("implicitpopulationwithinit",0,0),  //$NONXXX
		        new TestData("implicitSrcImport",0,0),  //$NONXXX
		        new TestData("imported",0,0),  //$NONXXX
		        new TestData("imported2",0,0),  //$NONXXX
		        new TestData("importedFileUnit",0,0),  //$NONXXX
		        new TestData("ImportedLib",0,0),  //$NONXXX
		        new TestData("ImportedMappingTest",0,0,1),  //$NONXXX // 1: preMarked
		        new TestData("ImportedTransf1",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("ImportedTransf2",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("ImportedTransf4",0,0),  //$NONXXX
		        new TestData("incompatible",0,0),  //$NONXXX
		        new TestData("initsectresultpatch",0,0),  //$NONXXX
		        new TestData("inoutcontextparam",0,0),  //$NONXXX
		        new TestData("inoutcontextparamnoresult",0,0),  //$NONXXX
		        new TestData("inoutMapping",0,0),  //$NONXXX
		        new TestData("InplaceEcore",0,0),  //$NONXXX
		        new TestData("IntermediateData",0,0),  //$NONXXX
		        new TestData("intermediateprop_imported",0,0),  //$NONXXX
		        new TestData("intermediateprop_resolve",0,0,2),  //$NONXXX	// 2: preMarked
		        new TestData("intermediateprop_trace",0,0),  //$NONXXX
		        new TestData("intermProperties",0,0,4),  //$NONXXX	// 2: ordering of properties changed
		        new TestData("intermSimple",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("intermWithCrossRefs",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("intermWithExtends",0,0),  //$NONXXX
		        new TestData("intermWithoutExtent",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("invalidcollectioncast",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("invalidConfigProp",0,0),  //$NONXXX
		        new TestData("invresolve_",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("invresolvebyrule",0,0,1+1),  //$NONXXX	// 1: preMarked, 1*4: target names in resolve expressions
		        new TestData("isunique",0,0),  //$NONXXX
		        new TestData("iterateoverintset",0,0),  //$NONXXX
		        new TestData("iteratetest",0,0),  //$NONXXX
		        new TestData("javakeywords",0,0),  //$NONXXX
		        new TestData("lateresolve",0,0,2+1),  //$NONXXX	// 2: preMarked, 1*4: target names in resolve expressions
		        new TestData("LateResolveBase",0,0),  //$NONXXX
		        new TestData("lateresolvebyrule",0,0,2+1),  //$NONXXX	// 2: preMarked, 1*4: target names in resolve expressions
		        new TestData("lateresolve_many",0,0,3),  //$NONXXX	// 2: ordering of top level eClassifiers changed
		        new TestData("Lib",0,0),  //$NONXXX
		        new TestData("Lib1",0,0),  //$NONXXX
		        new TestData("Lib2",0,0),  //$NONXXX
		        new TestData("LibForAccess",0,0),  //$NONXXX
		        new TestData("LibForExtends",0,0),  //$NONXXX
		        new TestData("listLiteral_259754",0,0),  //$NONXXX
		        new TestData("localstrings",0,0),  //$NONXXX
		        new TestData("m3",0,0),  //$NONXXX
		        new TestData("mapDisjuncts",0,0,5),  //$NONXXX	// 5*4: target names in resolve expressions
		        new TestData("mapInherits",0,0,4),  //$NONXXX	// 4*4: target names in resolve expressions
		        new TestData("mapkeyword",0,0,1),  //$NONXXX	// 1: preMarked
		        new TestData("mapMerges",0,0,4),  //$NONXXX	// 4*4: target names in resolve expressions
		        new TestData("mapMultipleInherits",0,0),  //$NONXXX
		        new TestData("MappingBody",0,0),  //$NONXXX
		        new TestData("mappingBodyExpressions_252358",0,0),  //$NONXXX
		        new TestData("MappingExtensionDisjuncts",0,0),  //$NONXXX
		        new TestData("MappingExtensionInherits",0,0),  //$NONXXX
		        new TestData("MappingExtensionMerges",0,0),  //$NONXXX
		        new TestData("Mappings",0,0),  //$NONXXX
		        new TestData("MappingsWhenClause",0,0),  //$NONXXX
		        new TestData("mappingWithNoResultTrace_266854",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("markedTest",0,0),  //$NONXXX
		        new TestData("misplacedTopElements",0,0),  //$NONXXX
		        new TestData("mm_header1",0,0),  //$NONXXX
		        new TestData("mm_header2",0,0),  //$NONXXX
		        new TestData("mm_header3",0,0),  //$NONXXX
		        new TestData("mm_header4",0,0),  //$NONXXX
		        new TestData("mm_modifyvar",0,0),  //$NONXXX
		        new TestData("ModelExtents",0,0),  //$NONXXX
		        new TestData("modifyfeature",0,0),  //$NONXXX
		        new TestData("modifyparam",0,0),  //$NONXXX
		        new TestData("modifyresult",0,0),  //$NONXXX
		        new TestData("modifyvar",0,0),  //$NONXXX
		        new TestData("moduleProperty",0,0),  //$NONXXX
		        new TestData("multilineStrings_262733",0,0),  //$NONXXX
		        new TestData("multipletracerecords",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("multiresultpars",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("nested",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("nestednativeops",0,0),  //$NONXXX
		        new TestData("nestedPropertiesAssignment_262757",0,0,2+1),  //$NONXXX	// 2*2: implicit set conversion of OCL analyzer, 1*4: target names in resolve expressions
		        new TestData("NestedTransformation",0,0),  //$NONXXX
		        new TestData("NewLibrary",0,0),  //$NONXXX
		        new TestData("NewTransformation",0,0),  //$NONXXX
		        new TestData("nocollectoncollection",0,0),  //$NONXXX
		        new TestData("noglobalallinstances",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("NonExecutable",0,0),  //$NONXXX
		        new TestData("nullsource",0,0),  //$NONXXX
		        new TestData("objectExp",0,0),  //$NONXXX
		        new TestData("objectExpBodyExpressions_253051",0,0),  //$NONXXX
		        new TestData("oclAllInstances",0,0),  //$NONXXX
		        new TestData("oclastype",0,0),  //$NONXXX
		        new TestData("ocl_test",0,0,3),  //$NONXXX	// 3: preMarked
		        new TestData("omittedobject",0,0),  //$NONXXX
		        new TestData("omittedobjectwithinit",0,0),  //$NONXXX
		        new TestData("OperationalTransformation1",0,0),  //$NONXXX
		        new TestData("optionalout",0,0),  //$NONXXX
		        new TestData("orderedsetdoesnotconformtoset",0,0),  //$NONXXX
		        new TestData("OtherTransformation",0,0),  //$NONXXX
		        new TestData("outininitvar",0,0),  //$NONXXX
		        new TestData("overload",0,0,3),  //$NONXXX	// 3: preMarked
		        new TestData("overload_205062",0,0),  //$NONXXX
		        new TestData("overload_multipleParams",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("overload_singleParam",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("OverridingMappings",0,0),  //$NONXXX
		        new TestData("populationSection",0,0,1),  //$NONXXX	// 1: preMarked
		        new TestData("primtypesecore",0,0),  //$NONXXX
		        new TestData("propertycollect",0,0,1),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer,
		        new TestData("props",0,0),  //$NONXXX
		        new TestData("q1",0,0),  //$NONXXX
		        new TestData("queries",0,0),  //$NONXXX
		        new TestData("referencedLib",0,0),  //$NONXXX
		        new TestData("ReferencedTransformation",0,0),  //$NONXXX
		        new TestData("registeredDynamic",0,0),  //$NONXXX
		        new TestData("removeclassesinwhile",0,0),  //$NONXXX
		        new TestData("resolveall",0,0,1+4+2),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer, 4*4: target names in resolve expressions, 1: ordering of top level eClassifiers changed
		        new TestData("resolvebeforeoutcompletion",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("resolvebyrule",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("ResolveExpressions",0,0,2),  //$NONXXX	// 2*4: target names in resolve expressions
		        new TestData("resolve_invresolveoneIn",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("resolve_lateresolveoneIn",0,0),  //$NONXXX
		        new TestData("resolve_lateresolveoneInaccess",0,0),  //$NONXXX
		        new TestData("resolvenoinput",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("resolve_notype",0,0,1+2),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer, 1: ordering of top level eClassifiers changed
		        new TestData("resolve_resolveIn",0,0,1+1+2),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer, 1*4: target names in resolve expressions, 1: ordering of top level eClassifiers changed
		        new TestData("resolve_resolveone",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("resolve_resolveoneIn",0,0,1+2),  //$NONXXX	// 1*4: target names in resolve expressions, 1: ordering of top level eClassifiers changed
		        new TestData("resolve_type",0,0,1+1+2),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer, 1*4: target names in resolve expressions, 1: ordering of top level eClassifiers changed
		        new TestData("resolve_vardecl",0,0,1+1+2),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer, 1*4: target names in resolve expressions, 1: ordering of top level eClassifiers changed
		        new TestData("resolve_vardeclcond",0,0,1+2),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer, 1: ordering of top level eClassifiers changed
		        new TestData("resolve_vardeclcondwithvar",0,0,1+2),  //$NONXXX	// 1*2: implicit set conversion of OCL analyzer, 1: ordering of top level eClassifiers changed
		        new TestData("returnundefinedfromquery",0,0),  //$NONXXX
		        new TestData("RootTransfForExtends",0,0),  //$NONXXX
		        new TestData("scr17812",0,0),  //$NONXXX
		        new TestData("scr18514",0,0,2),  //$NONXXX	// 2: preMarked
		        new TestData("scr18572",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("scr18739",0,0),  //$NONXXX
		        new TestData("scr18783",0,0),  //$NONXXX
		        new TestData("scr19364",0,0),  //$NONXXX
		        new TestData("scr20038",0,0),  //$NONXXX
		        new TestData("scr20041",0,0),  //$NONXXX
		        new TestData("scr20469",0,0),  //$NONXXX
		        new TestData("scr20471",0,0),  //$NONXXX
		        new TestData("scr20667",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("scr20811",0,0),  //$NONXXX
		        new TestData("scr21121",0,0),  //$NONXXX
		        new TestData("scr21329",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("scr23070",0,0),  //$NONXXX
		        new TestData("scr878",0,0),  //$NONXXX
		        new TestData("setundefinedtoprimitive",0,0,1),  //$NONXXX	// 1: preMarked
		        new TestData("simple",0,0),  //$NONXXX
		        new TestData("simpleconfigproperty",0,0),  //$NONXXX
		        new TestData("simpleproperty",0,0),  //$NONXXX
		        new TestData("simplerename",0,0),  //$NONXXX
		        new TestData("simpleresolve",0,0,1),  //$NONXXX	// 1*4: target names in resolve expressions
		        new TestData("simplestXCollectShorthand",0,0),  //$NONXXX
		        new TestData("simpletag",0,0),  //$NONXXX
		        new TestData("Simpleuml_To_Rdb",0,0,2),  //$NONXXX
		        new TestData("skippopulation",0,0,1),  //$NONXXX	// 1: preMarked
		        new TestData("slashSingleLineComments_266478",0,0),  //$NONXXX
		        new TestData("somelib",0,0),  //$NONXXX
		        new TestData("stdlibelement",0,0),  //$NONXXX
		        new TestData("stdlibList",0,0,2),  //$NONXXX	// 1: ordering of top level eClassifiers changed
		        new TestData("stdlibModel",0,0),  //$NONXXX
		        new TestData("stdlibString",0,0),  //$NONXXX
		        new TestData("stringescaping",0,0),  //$NONXXX
		        new TestData("subobjects",0,0),  //$NONXXX
		        new TestData("successLib",0,0),  //$NONXXX
		        new TestData("T2",0,0),  //$NONXXX
		        new TestData("TestLib",0,0),  //$NONXXX
		        new TestData("testlibrary",0,0),  //$NONXXX
		        new TestData("traceLookup_287589",0,0),  //$NONXXX
		        new TestData("transf2",0,0),  //$NONXXX
		        new TestData("transf3",0,0),  //$NONXXX
		        new TestData("TransfForAccess",0,0),  //$NONXXX
		        new TestData("transformationWithModuleElements_257055",0,0),  //$NONXXX
		        new TestData("tuples",0,0,1),  //$NONXXX	// 1: preMarked
		        new TestData("twoInputs",0,0),  //$NONXXX
		        new TestData("uml2rdb",0,0),  //$NONXXX
		        new TestData("uml2_stereotypeApplication",0,0),  //$NONXXX
		        new TestData("UMLFoo",0,0),  //$NONXXX
		        new TestData("urilessModeltype",0,0),  //$NONXXX
		        new TestData("usebooleanprop",0,0),  //$NONXXX
		        new TestData("useresultinsameout",0,0),  //$NONXXX
		        new TestData("util",0,0),  //$NONXXX
		        new TestData("Utils",0,0),  //$NONXXX
		        new TestData("varassign",0,0),  //$NONXXX
		        new TestData("varInitExpWithResult_260985",0,0),  //$NONXXX
		        new TestData("varInitGroup_261841",0,0),  //$NONXXX
		        new TestData("virtscr20707",0,0),  //$NONXXX
		        new TestData("virtualPredefinedTypeOpers",0,0),  //$NONXXX
		        new TestData("voidreturn",0,0),  //$NONXXX
		        new TestData("vutil",0,0),  //$NONXXX
		        new TestData("WarmUp",0,0),  //$NONXXX
		        new TestData("_while",0,0),  //$NONXXX
		        new TestData("_while_261024",0,0)  //$NONXXX
/**/		        
			}
		);
	}
	    
	@Override
	@Before
	public void setUp() throws Exception {
		TestUtil.turnOffAutoBuilding();		
		
		String name = "UnparserTest"; //$NON-NLS-1$
        myProject = TestProject.getExistingProject(name);
        if(myProject == null) {
            myProject = new TestProject(name, new String[] {}, 0); 
        }
        File destinationFolder = getDestinationFolder();
        if (destinationFolder.exists()) {
            FileUtil.delete(destinationFolder);
        }		
	}
	
	@Override
	@After
	public void tearDown() throws Exception {
        File destinationFolder = getDestinationFolder();
        if (destinationFolder.exists()) {
            FileUtil.delete(destinationFolder);
        }
        
        File unparseFolder = getUnparseFolder();
        if (unparseFolder.exists()) {
            FileUtil.delete(unparseFolder);
        }
	}
	    
    public TestProject getTestProject() {
        return myProject;
    }
    
	@Override
	@Test
	public void runTest() throws Exception
	{
		File testdataFolder = copyTestdataIntoJunitWorkspace();
		
		CompiledUnit[] testdataCompiledUnit = compileAndCheckErrors(testdataFolder);
		
		IFile testdataCompiledXMI = loadCompiledXMIFile(testdataFolder);

		File unparseFolder = createUnparseFolder();

		unparseIntoFolder(testdataCompiledUnit[0], unparseFolder, testdataFolder.getName() + UNPARSED_SUFFIX);

		CompiledUnit[] unparseCompiledUnit = compileAndCheckErrors(unparseFolder);
		
		IFile unparseCompiledXMI = loadCompiledXMIFile(unparseFolder);

		unparseIntoFolder(unparseCompiledUnit[0], unparseFolder, testdataFolder.getName() + UNPARSED_SUFFIX + UNPARSED_SUFFIX);
		
		assertErrorCountEquality(testdataCompiledUnit, unparseCompiledUnit);
		
		assertEclipseCompareEquals(testdataCompiledXMI, unparseCompiledXMI);
	}
	
	private void assertEclipseCompareEquals(IFile testdataXMIResource, IFile unparseXMIResource)
	{
		String[] testdataLines = readAllLines(testdataXMIResource);
		String[] unparseLines = readAllLines(unparseXMIResource);
		
		QvtoxComparator testdataComparator = new QvtoxComparator(testdataLines);
		QvtoxComparator unparseComparator = new QvtoxComparator(unparseLines);
				
		RangeDifference[] differences = RangeDifferencer.findDifferences(testdataComparator,unparseComparator);
		
		String assertCopyEqualityMessage =
				myData.getEclipseDiffCount() == 0 ?
						"\nOriginal and copy expression differ at " + differences.length + " places" :
							"\nOriginal and copy expression differ at " + differences.length + " places instead of at " + myData.getEclipseDiffCount() + " places";
		for ( int i = 0; i < differences.length; i++ )
		{
			assertCopyEqualityMessage += "\n" + printRangeDifference(differences[i], testdataLines, unparseLines);
		}

		assertTrue(assertCopyEqualityMessage,differences.length==myData.getEclipseDiffCount());
	}
	
	private static class QvtoxComparator implements ITokenComparator
	{
		private String[] lines;
		private int[] lineStarts;
		
		public QvtoxComparator(String[] ln)
		{
			lines = ln;
			lineStarts = QvtoxComparator.calculateLineStarts(lines);
		}

		public int getRangeCount()
		{
			return lines.length;
		}

		public boolean rangesEqual(int thisIndex, IRangeComparator thatRangeComparator, int thatIndex)
		{
			String thisRange = lines[thisIndex];
			String thatRange = ((QvtoxComparator) thatRangeComparator).lines[thatIndex];
			if ( thisRange.contains("<lineBreaks") && thatRange.contains("<lineBreaks")) return true;
			if ( thisRange.contains("<offsets") && thatRange.contains("<offsets") ) return true;
			if ( thisRange.contains("<sourceURI") && thatRange.contains("<sourceURI") ) return true;
			boolean isEqual = thisRange.equals(thatRange);
			return isEqual;
		}

		public boolean skipRangeComparison(int length, int maxLength, IRangeComparator thatRangeComparator)
		{
			return false;
		}

		public int getTokenStart(int index)
		{
			return lineStarts[index];
		}

		public int getTokenLength(int index)
		{
			return lines[index].length();
		}
		
		private static int[] calculateLineStarts(String[] lines)
		{
			int[] lineStarts = new int[lines.length];
			for (int i = 1; i < lineStarts.length; i++)
			{
				lineStarts[i] = lineStarts[i-1] + lines[i-1].length();
			}
			return lineStarts;
		}
	}
	
	private String printRangeDifference(RangeDifference rangeDifference,String[] leftLines, String[] rightLines)
	{
		String result = rangeDifference.toString();
		
		for ( int i = 0, index = rangeDifference.leftStart(); i < rangeDifference.leftLength(); i++, index++)
		{
			result += "\n----LEFT:  " + leftLines[index];
		}
		for ( int i = 0, index = rangeDifference.rightStart(); i < rangeDifference.rightLength(); i++, index++)
		{
			result += "\n----RIGHT: " + rightLines[index];
		}
		
		return result;
	}
	
	private String[] readAllLines(IFile file)
	{
		ArrayList<String> lines = new ArrayList<String>();
		try
		{
			BufferedReader reader = new BufferedReader(new InputStreamReader(file.getContents()));
			String line = reader.readLine();
			while ( line != null )
			{
				lines.add(line);
				line = reader.readLine();
			}
			reader.close();
		}
		catch (Exception exp ){}
		
		return lines.toArray(new String[0]);
	}
	
	private File copyTestdataIntoJunitWorkspace() throws Exception
	{
		copyData(getOriginalPathSegment(), "unparserTestData/" + getOriginalPathSegment()); //$NON-NLS-1$
		
        File folder = getDestinationFolder(); //$NON-NLS-1$

        assertTrue("Invalid folder " + folder, folder.exists() && folder.isDirectory()); //$NON-NLS-1$

        return folder;
	}

	private CompiledUnit[] compileAndCheckErrors(File folder) throws Exception
	{
		CompiledUnit[] compiledUnits = compile(folder);
		
		assertTrue("No results", compiledUnits.length > 0); //$NON-NLS-1$
		
		List<QvtMessage> allErrors = getAllErrors(compiledUnits, myData.usesSourceAnnotations());
		
		String assertErrorCountEqualityMessage = "Compiled QVTo units in " + folder.getName() + " are not error free:"; 
		if ( allErrors.size() > myData.getErrCount() )
		{
			assertErrorCountEqualityMessage += "\n--- errors: ---";
			for (Iterator<QvtMessage> iterator = allErrors.iterator(); iterator.hasNext();)
			{
				QvtMessage qvtMessage = (QvtMessage) iterator.next();
				assertErrorCountEqualityMessage += "\n" + qvtMessage.getLineNum() + ":" + qvtMessage.getMessage();
			}
		}		
		
		assertTrue(assertErrorCountEqualityMessage,allErrors.size() <= myData.getErrCount());

		return compiledUnits;
	}

	private CompiledUnit[] compile(File folder) throws Exception
	{
		final String topName = folder.getName() + MDAConstants.QVTO_FILE_EXTENSION_WITH_DOT;
		getFile(folder, topName);
		WorkspaceUnitResolver resolver = new WorkspaceUnitResolver(Collections.singletonList(getIFolder(folder)));
		QVTOCompiler compiler = CompilerUtils.createCompiler();
		
	    QvtCompilerOptions options = new QvtCompilerOptions();
	    options.setGenerateCompletionData(false);
	    
	    UnitProxy unit = resolver.resolveUnit(folder.getName());
	    assert unit != null;

		CompiledUnit[] compiledUnits = new CompiledUnit[] { compiler.compile(unit, options, new BasicMonitor()) };
		
		saveCompiledUnitsAsCompiledXMI(compiler, compiledUnits);
		saveCompiledUnitsAsStandardXMI(compiler, compiledUnits);
	
		return compiledUnits;		
	}
	
	private IFile loadCompiledXMIFile(File folder)
	{
		IFolder sourcesFolder = getSourcesFolder();
		IFolder resourceFolder = sourcesFolder.getFolder(folder.getName());
		IFile file = resourceFolder.getFile(folder.getName() + '.' + ExeXMISerializer.COMPILED_XMI_FILE_EXTENSION);
		return file;
	}

	private void saveCompiledUnitsAsCompiledXMI(QVTOCompiler compiler, CompiledUnit[] compiledUnits) throws IOException
	{
		ResourceSet metamodelResourceSet = compiler.getResourceSet();
		Registry registry = MetamodelURIMappingHelper.mappingsToEPackageRegistry(myProject.project, metamodelResourceSet);
		ExeXMISerializer.saveUnitXMI(compiledUnits, registry != null ? registry : EPackage.Registry.INSTANCE);
	}

	private void saveCompiledUnitsAsStandardXMI(QVTOCompiler compiler, CompiledUnit[] compiledUnits) throws Exception, EmfException
	{
		CompiledUnit compiledUnit = compiledUnits[0];
		URI copyURI = compiledUnit.getURI().trimFileExtension().appendFileExtension(XMIResource.XMI_NS);
		
		Resource copyResource = EmfUtil.createResource(copyURI, EmfUtil.getOutputResourceSet());
		copyResource.getContents().addAll(compiledUnit.getModules());
		
		EmfUtil.saveModel(copyResource, EmfUtil.DEFAULT_SAVE_OPTIONS);
		
		myProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
	}

	private File createUnparseFolder() throws Exception
	{
		createFolder(getUnparsePathSegment());
        File copyFolder = getUnparseFolder(); //$NON-NLS-1$
		assertTrue("Invalid folder " + copyFolder, copyFolder.exists() && copyFolder.isDirectory()); //$NON-NLS-1$
		return copyFolder;
	}

	private void unparseIntoFolder(CompiledUnit compiledUnit, File unparseFolder, String fileName) throws Exception, EmfException
	{
		String copyPath =
				"/" + myProject.getProject().getName() +
				"/" + getUnparsePathSegment() +
				"/" + fileName + MDAConstants.QVTO_FILE_EXTENSION_WITH_DOT;
		URI copyURI = URI.createPlatformResourceURI(copyPath,true);
		
		Resource copyResource = EmfUtil.createResource(copyURI, EmfUtil.getOutputResourceSet());
		copyResource.getContents().addAll(compiledUnit.getModules());
		
		Map<Object, Object> options = new LinkedHashMap<Object, Object>(EmfUtil.DEFAULT_SAVE_OPTIONS);
		options.put(QVTEvaluationOptions.FLAG_QVTO_UNPARSE_ENABLED, Boolean.TRUE);
		
		EmfUtil.saveModel(copyResource, options);
		
		myProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
	}

	private void assertErrorCountEquality(CompiledUnit[] testdataCompiledUnit, CompiledUnit[] unparseCompiledUnit) {
			String assertErrorCountEqualityMessage = "Errors in original and copy: "; 
			int testdataErrorCount = getAllErrors(testdataCompiledUnit, myData.usesSourceAnnotations()).size();
			int unparseErrorCount = getAllErrors(unparseCompiledUnit, myData.usesSourceAnnotations()).size();
			if ( unparseErrorCount != testdataErrorCount )
			{
				assertErrorCountEqualityMessage += "\n--- original errors: ---";
				for (Iterator<QvtMessage> iterator = getAllErrors(testdataCompiledUnit, myData.usesSourceAnnotations()).iterator(); iterator.hasNext();)
				{
					QvtMessage qvtMessage = (QvtMessage) iterator.next();
					assertErrorCountEqualityMessage += "\n" + qvtMessage.getLineNum() + ":" + qvtMessage.getMessage();
				}
				assertErrorCountEqualityMessage += "\n--- errors in copy: ---";
				for (Iterator<QvtMessage> iterator = getAllErrors(unparseCompiledUnit, myData.usesSourceAnnotations()).iterator(); iterator.hasNext();)
				{
					QvtMessage qvtMessage = (QvtMessage) iterator.next();
					assertErrorCountEqualityMessage += "\n" + qvtMessage.getLineNum() + ":" + qvtMessage.getMessage();
				}
			}
			
			assertErrorCountEqualityMessage += "\nError count of copy mismatches: "; 
			if ( unparseErrorCount > myData.getErrCount() )
				assertEquals(assertErrorCountEqualityMessage, testdataErrorCount,unparseErrorCount); //$NON-NLS-1$	
		}

	private String getOriginalPathSegment()
	{
		return "sources/" + myData.getDir();
	}
	
	private static final String UNPARSED_SUFFIX = "-unparsed"; 

	private String getUnparsePathSegment() {
		return getOriginalPathSegment() + UNPARSED_SUFFIX;
	}

	private File getDestinationFolder()
	{
		return new File(myProject.getProject().getLocation().toString() + "/" + getOriginalPathSegment());
	}
	
	private IFolder getSourcesFolder()
	{
		IProject project = myProject.getProject();
		IFolder sourcesFolder = project.getFolder("sources");
		return sourcesFolder;
	}
	
	private File getUnparseFolder()
	{
		return new File(myProject.getProject().getLocation().toString() + "/" + getUnparsePathSegment());
	}
	  
    private List<QvtMessage> getAllErrors(CompiledUnit[] compiled, boolean concreteSyntaxOnly) {
        List<QvtMessage> errors = new ArrayList<QvtMessage>();
        for (CompiledUnit compilationResult : compiled) {        	
            TransformationUtil.getErrors(compilationResult, errors, concreteSyntaxOnly);
        }

        return errors;
    }
    
	private static File getFile(File folder, final String expectedName) {
		File file = new File(folder, expectedName);
        assertTrue("Inexistent file: " + file, file.exists()); //$NON-NLS-1$
        assertTrue("Non-File file: " + file, file.isFile()); //$NON-NLS-1$
        return file;
	}
    
	private IContainer getIFolder(File folderUnderWorkspace) throws MalformedURLException, URISyntaxException {
		IWorkspace workspace = ResourcesPlugin.getWorkspace();
		IPath location = new Path(folderUnderWorkspace.getAbsolutePath());
		IContainer[] containers = workspace.getRoot().findContainersForLocationURI(URIUtil.toURI(location.makeAbsolute().toFile().toURI().toURL()));
		if(containers == null || containers.length != 1 || containers[0] instanceof IFolder == false) {
			throw new RuntimeException("Folder not found: " + folderUnderWorkspace); //$NON-NLS-1$
		}
		
		return (IFolder)containers[0];
	}
	
	private void copyData(String destPath, String srcPath) throws Exception
	{
		File sourceFolder = TestUtil.getPluginRelativeFolder(srcPath);
		File destFolder = createFolder(destPath);
		FileUtil.copyFolder(sourceFolder, destFolder);
		myProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
	}	
	
	private File createFolder(String destPath) throws Exception
	{
		File destFolder = new File(myProject.getProject().getLocation().toString() + "/" + destPath); //$NON-NLS-1$
		destFolder.mkdirs();
		myProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
		return destFolder;
	}	
	
    private final TestData myData;
	private TestProject myProject;	
}
