Commit c8d6ecc8 authored by Philip Makedonski's avatar Philip Makedonski
Browse files

* refactored tests, updated meta-data, added serialisation tests

parent 5340db6c
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
		<attributes>
			<attribute name="maven.pomderived" value="true"/>
		</attributes>
	</classpathentry>
	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
	<classpathentry kind="src" output="target/classes" path="src">
		<attributes>
			<attribute name="test" value="true"/>
			<attribute name="optional" value="true"/>
			<attribute name="maven.pomderived" value="true"/>
		</attributes>
	</classpathentry>
	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21">
	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
		<attributes>
			<attribute name="module" value="true"/>
			<attribute name="maven.pomderived" value="true"/>
		</attributes>
	</classpathentry>
	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
	<classpathentry kind="output" path="target/classes"/>
</classpath>
+2 −0
Original line number Diff line number Diff line
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21
org.eclipse.jdt.core.compiler.compliance=21
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.release=enabled
org.eclipse.jdt.core.compiler.source=21
+112 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.tx.tests;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Scanner;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.ocl.xtext.completeocl.CompleteOCLStandaloneSetup;
import org.eclipse.xtext.testing.InjectWith;
import org.eclipse.xtext.testing.extensions.InjectionExtension;
import org.eclipse.xtext.testing.util.ParseHelper;
import org.eclipse.xtext.testing.validation.ValidationTestHelper;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.Validator;
import org.etsi.mts.tdl.tdlPackage;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.extension.ExtendWith;

import com.google.inject.Inject;

@ExtendWith(InjectionExtension.class)
@InjectWith(TDLtxInjectorProvider.class)
public abstract class TDLtxAbstractTest {
	static {
		org.etsi.mts.tdl.tdlPackage.eINSTANCE.getName();
		org.etsi.mts.tdl.structuredobjectives.StructuredObjectivesPackage.eINSTANCE.getName();
		org.etsi.mts.tdl.extendedconfigurations.ExtendedConfigurationsPackage.eINSTANCE.getName();
		CompleteOCLStandaloneSetup.doSetup();
		Validator.registerValidator("model/tdl-constraints.ocl", tdlPackage.eINSTANCE);
	}

	@Inject
	protected ParseHelper<Package> parseHelper;
	
	@Inject
	protected ValidationTestHelper validationHelper;

	@Inject
	protected ResourceSet rs;

	public Collection<DynamicTest> dynamicTestsFromFiles() throws Exception {
		List<DynamicTest> tests = new ArrayList<>();
		File modelsFolder = findModelsFolder();
		
		if (modelsFolder != null && modelsFolder.exists()) {
			File[] files = modelsFolder.listFiles((dir, name) -> name.endsWith(".tdltx"));
			if (files != null) {
				for (File file : files) {
					String fileName = file.getName();
					tests.add(DynamicTest.dynamicTest("Verify: " + fileName, () -> verifySingleModel(file)));
				}
			}
		}
		return tests;
	}

	protected File findModelsFolder() {
		URL url = getClass().getResource("/models");
		if (url != null) {
			try { return new File(url.toURI()); } catch (Exception e) {}
		}
		String userDir = System.getProperty("user.dir");
		File f = new File(userDir, "src/models");
		if (f.exists()) return f;
		f = new File(userDir, "org.etsi.mts.tdl.tx.tests/src/models");
		if (f.exists()) return f;
		return new File("plugins/org.etsi.mts.tdl.tx.tests/src/models");
	}

	protected String loadModelContent(String resourcePath) throws Exception {
		try (InputStream is = getClass().getResourceAsStream(resourcePath)) {
			if (is == null) {
				File f = new File("src" + resourcePath);
				if (f.exists()) {
					//TODO: delimiters are platform specific?
					try (Scanner s = new Scanner(f).useDelimiter("\\A")) {
						return s.hasNext() ? s.next() : "";
					}
				}
				throw new RuntimeException("Model not found: " + resourcePath);
			}
			try (Scanner s = new Scanner(is).useDelimiter("\\A")) {
				return s.hasNext() ? s.next() : "";
			}
		}
	}

	protected void dumpStructure(EObject obj, StringBuilder sb, int indent) {
		for (int i = 0; i < indent; i++) sb.append("  ");
		sb.append(obj.eClass().getName());
		
		EAttribute nameAttr = (EAttribute) obj.eClass().getEStructuralFeature("name");
		if (nameAttr != null) {
			Object value = obj.eGet(nameAttr);
			if (value != null) sb.append(": ").append(value);
		}
		sb.append("\n");
		
		for (EObject child : obj.eContents()) {
			dumpStructure(child, sb, indent + 1);
		}
	}

	public abstract void verifySingleModel(File file) throws Exception;

}
+3 −96
Original line number Diff line number Diff line
package org.etsi.mts.tdl.tx.tests;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Scanner;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.ocl.xtext.completeocl.CompleteOCLStandaloneSetup;
import org.eclipse.xtext.testing.InjectWith;
import org.eclipse.xtext.testing.extensions.InjectionExtension;
import org.eclipse.xtext.testing.util.ParseHelper;
import org.eclipse.xtext.testing.validation.ValidationTestHelper;
import org.etsi.mts.tdl.Package;
import org.etsi.mts.tdl.Validator;
import org.etsi.mts.tdl.tdlPackage;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.extension.ExtendWith;

import com.google.inject.Inject;

@ExtendWith(InjectionExtension.class)
@InjectWith(TDLtxInjectorProvider.class)
//Generated by Xtext
//@InjectWith(TDLtxInjectorProviderGenerated.class)
public class TDLtxParsingTest {
	static {
		org.etsi.mts.tdl.tdlPackage.eINSTANCE.getName();
		org.etsi.mts.tdl.structuredobjectives.StructuredObjectivesPackage.eINSTANCE.getName();
		org.etsi.mts.tdl.extendedconfigurations.ExtendedConfigurationsPackage.eINSTANCE.getName();
		CompleteOCLStandaloneSetup.doSetup();
		Validator.registerValidator("model/tdl-constraints.ocl", tdlPackage.eINSTANCE);
	}

	@Inject
	private ParseHelper<Package> parseHelper;
	
	@Inject
	private ValidationTestHelper validationHelper;

	@Inject
	private ResourceSet rs;

	
	private String loadModelContent(String resourcePath) throws Exception {
		try (InputStream is = getClass().getResourceAsStream(resourcePath)) {
			if (is == null) {
				File f = new File("src" + resourcePath);
				if (f.exists()) {
					//TODO: delimiters are platform specific?
					try (Scanner s = new Scanner(f).useDelimiter("\\A")) {
						return s.hasNext() ? s.next() : "";
					}
				}
				throw new RuntimeException("Model not found: " + resourcePath);
			}
			try (Scanner s = new Scanner(is).useDelimiter("\\A")) {
				return s.hasNext() ? s.next() : "";
			}
		}
	}

	private void dumpStructure(EObject obj, StringBuilder sb, int indent) {
		for (int i = 0; i < indent; i++) sb.append("  ");
		sb.append(obj.eClass().getName());
		
		EAttribute nameAttr = (EAttribute) obj.eClass().getEStructuralFeature("name");
		if (nameAttr != null) {
			Object value = obj.eGet(nameAttr);
			if (value != null) sb.append(": ").append(value);
		}
		sb.append("\n");
public class TDLtxParsingTest extends TDLtxAbstractTest {
	
		for (EObject child : obj.eContents()) {
			dumpStructure(child, sb, indent + 1);
		}
	}

	@TestFactory
	public Collection<DynamicTest> dynamicTestsFromFiles() throws Exception {
		List<DynamicTest> tests = new ArrayList<>();
		File modelsFolder = findModelsFolder();
		
		if (modelsFolder != null && modelsFolder.exists()) {
			File[] files = modelsFolder.listFiles((dir, name) -> name.endsWith(".tdltx"));
			if (files != null) {
				for (File file : files) {
					String fileName = file.getName();
					tests.add(DynamicTest.dynamicTest("Verify: " + fileName, () -> verifySingleModel(file)));
				}
			}
		}
		return tests;
		return super.dynamicTestsFromFiles();
	}

	private File findModelsFolder() {
		URL url = getClass().getResource("/models");
		if (url != null) {
			try { return new File(url.toURI()); } catch (Exception e) {}
		}
		String userDir = System.getProperty("user.dir");
		File f = new File(userDir, "src/models");
		if (f.exists()) return f;
		f = new File(userDir, "org.etsi.mts.tdl.tx.tests/src/models");
		if (f.exists()) return f;
		return new File("plugins/org.etsi.mts.tdl.tx.tests/src/models");
	}

	@Test
	public void verifyLoadModelAttributes() throws Exception {
@@ -137,6 +43,7 @@ public class TDLtxParsingTest {

	}
	
	@Override
	public void verifySingleModel(File file) throws Exception {
		String fileName = file.getName();
		System.out.println("Verifying: "+fileName);
+86 −0
Original line number Diff line number Diff line
package org.etsi.mts.tdl.tx.tests;

import java.io.File;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.Collection;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.etsi.mts.tdl.Package;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestFactory;

//Generated by Xtext
//@InjectWith(TDLtxInjectorProviderGenerated.class)
public class TDLtxSerialisationTest extends TDLtxAbstractTest {
	

	@TestFactory
	public Collection<DynamicTest> dynamicTestsFromFiles() throws Exception {
		return super.dynamicTestsFromFiles();
	}


	@Test
	public void verifyLoadModelAttributes() throws Exception {
		Package result = parseHelper.parse(loadModelContent("/models/loadModel.tdltx"));
		Assertions.assertNotNull(result);
		Assertions.assertEquals("testP", result.getName());
	}

//	@Test
	public void verifyAllModels() throws Exception {
		File modelsFolder = findModelsFolder();
		if (modelsFolder != null && modelsFolder.exists()) {
			File[] files = modelsFolder.listFiles((dir, name) -> name.endsWith(".tdltx"));
			if (files != null) {
				for (File file : files) {
					verifySingleModel(file);
				}
			}
		}

	}
	
	@Override
	public void verifySingleModel(File file) throws Exception {
		String extension = "tdltx";
		String fileName = file.getName();
		if (fileName.endsWith(".tdltx."+extension)) {
			return;
		}
		System.out.println("Verifying: "+fileName);
		String content = loadModelContent("/models/" + fileName);
		URI uri = URI.createFileURI(file.getAbsolutePath());
//		Package result = parseHelper.parse(content, uri, rs);
		Package result = parseHelper.parse(content);
		
		Assertions.assertNotNull(result, "Parser returned null for " + fileName);
		Assertions.assertTrue(result.eResource().getErrors().isEmpty(), 
			"Syntax errors in " + fileName + ": " + result.eResource().getErrors());
		
		//NOTE: this requires manual registration of validator when running in eclipse, completeOCL initialisation when running in maven 
		validationHelper.assertNoErrors(result);
		
		URI targetURI = URI.createURI(uri.toString()+"."+extension);
//		XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
//		resourceSet = rs;
		Resource tr = rs.createResource(targetURI);
		
		tr.getContents().add(EcoreUtil.copy(result));
		try {
			EcoreUtil.resolveAll(tr);
			tr.save(OutputStream.nullOutputStream(), null);
		} catch (Exception e1) {
			System.err.println("  Translation: "+e1.getMessage());
			//e1.printStackTrace();
			Assertions.fail(e1.getMessage(), e1);
			//TODO: provide an error dialog, fall back to XF, indicate approximate location based on error message / details
		}
	}

}