| /******************************************************************************* |
| * Copyright (c) 2012, 2016 Willink Transformations 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: |
| * E.D.Willink - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ocl.examples.test.xtext; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.File; |
| import java.io.FileReader; |
| import java.io.FileWriter; |
| import java.io.IOException; |
| import java.io.Reader; |
| import java.io.Writer; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.tools.JavaFileObject; |
| import javax.tools.SimpleJavaFileObject; |
| |
| import org.apache.log4j.Logger; |
| import org.eclipse.core.resources.IContainer; |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.IWorkspaceRoot; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.emf.codegen.ecore.generator.Generator; |
| import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory; |
| import org.eclipse.emf.codegen.ecore.genmodel.GenModel; |
| import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter; |
| import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapterFactory; |
| import org.eclipse.emf.codegen.ecore.genmodel.util.GenModelUtil; |
| import org.eclipse.emf.common.EMFPlugin; |
| import org.eclipse.emf.common.util.BasicMonitor; |
| import org.eclipse.emf.common.util.Diagnostic; |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.common.util.Monitor; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.ecore.EClass; |
| import org.eclipse.emf.ecore.EFactory; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.emf.ecore.plugin.EcorePlugin; |
| import org.eclipse.emf.ecore.presentation.EcoreEditor; |
| 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.EcoreResourceFactoryImpl; |
| import org.eclipse.emf.mwe.core.ConfigurationException; |
| import org.eclipse.jdt.annotation.NonNull; |
| import org.eclipse.jdt.annotation.Nullable; |
| import org.eclipse.ocl.examples.codegen.dynamic.JavaFileUtil; |
| import org.eclipse.ocl.examples.codegen.oclinecore.OCLinEcoreGeneratorAdapterFactory; |
| import org.eclipse.ocl.examples.pivot.tests.PivotTestSuite; |
| import org.eclipse.ocl.examples.pivot.tests.TestOCL; |
| import org.eclipse.ocl.examples.xtext.tests.TestCaseAppender; |
| import org.eclipse.ocl.examples.xtext.tests.TestUIUtil; |
| import org.eclipse.ocl.examples.xtext.tests.TestUtil; |
| import org.eclipse.ocl.pivot.PivotPackage; |
| import org.eclipse.ocl.pivot.internal.resource.StandaloneProjectMap; |
| import org.eclipse.ocl.pivot.oclstdlib.OCLstdlibPackage; |
| import org.eclipse.ocl.pivot.resource.ProjectManager; |
| import org.eclipse.ocl.pivot.utilities.ClassUtil; |
| import org.eclipse.ocl.pivot.utilities.LabelUtil; |
| import org.eclipse.ocl.pivot.utilities.OCL; |
| import org.eclipse.ocl.pivot.utilities.PivotUtil; |
| import org.eclipse.ocl.pivot.utilities.ValueUtil; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.IWorkbenchPage; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.ide.IDE; |
| import org.eclipse.ui.intro.IIntroManager; |
| import org.eclipse.uml2.uml.Model; |
| import org.eclipse.uml2.uml.editor.presentation.UMLEditor; |
| import org.eclipse.xtext.diagnostics.ExceptionDiagnostic; |
| import org.eclipse.xtext.util.EmfFormatter; |
| import org.osgi.framework.Bundle; |
| |
| import junit.framework.TestCase; |
| |
| /** |
| * Tests that load a model and verify that there are no unresolved proxies as a |
| * result. |
| */ |
| public class UsageTests |
| extends PivotTestSuite// XtextTestCase |
| { |
| |
| private static final class JavaSourceFileObject |
| extends SimpleJavaFileObject { |
| |
| private JavaSourceFileObject(java.net.URI uri) { |
| super(uri, Kind.SOURCE); |
| } |
| |
| @Override |
| public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { |
| char[] buf = new char[4096]; |
| StringBuffer s = new StringBuffer(); |
| Reader reader = new FileReader(new File(uri)); |
| try { |
| int len; |
| while ((len = reader.read(buf)) > 0) { |
| s.append(buf, 0, len); |
| } |
| } |
| finally { |
| reader.close(); |
| } |
| return s.toString(); |
| } |
| } |
| |
| public Logger log; |
| |
| /** |
| * Checks all resources in a resource set for any errors or warnings. |
| * |
| * @param resourceSet |
| * @throws ConfigurationException |
| * if any error present |
| */ |
| public void checkResourceSet(ResourceSet resourceSet) |
| throws ConfigurationException { |
| int errorCount = 0; |
| for (Resource aResource : resourceSet.getResources()) { |
| List<Resource.Diagnostic> errors = aResource.getErrors(); |
| if (errors.size() > 0) { |
| for (Resource.Diagnostic error : errors) { |
| if (error instanceof ExceptionDiagnostic) { |
| log.error("Error for '" + aResource.getURI() + "'", |
| ((ExceptionDiagnostic) error).getException()); |
| } else { |
| log.error(error + " for '" + aResource.getURI() + "'"); |
| } |
| errorCount++; |
| } |
| } |
| List<Resource.Diagnostic> warnings = aResource.getWarnings(); |
| if (warnings.size() > 0) { |
| for (Resource.Diagnostic warning : warnings) { |
| if (warning instanceof ExceptionDiagnostic) { |
| log.warn("Warning for '" + aResource.getURI() + "'", |
| ((ExceptionDiagnostic) warning).getException()); |
| } else { |
| log.warn(warning + " for '" + aResource.getURI() + "'"); |
| } |
| } |
| } |
| } |
| if (errorCount > 0) { |
| throw new RuntimeException("Errors in ResourceSet"); |
| } |
| } |
| |
| @Override |
| protected @NonNull TestOCL createOCL() { |
| return new TestOCL(getTestPackageName(), getName(), getProjectMap()); |
| } |
| |
| protected void getCompilationUnits(@NonNull List<JavaFileObject> compilationUnits, |
| @NonNull File directory) throws Exception { |
| File[] files = directory.listFiles(); |
| if (files != null) { |
| for (File file : files) { |
| if (file.isDirectory()) { |
| getCompilationUnits(compilationUnits, file); |
| } else if (file.isFile()) { |
| // System.out.println("Compiling " + file); |
| compilationUnits.add(new JavaSourceFileObject(file.toURI())); |
| } |
| } |
| } |
| } |
| |
| protected void getCompilationUnits(@NonNull List<JavaFileObject> compilationUnits, |
| @NonNull IContainer container) throws CoreException { |
| for (IResource member : container.members()) { |
| if (member instanceof IContainer) { |
| getCompilationUnits(compilationUnits, (IContainer) member); |
| } else if ((member instanceof IFile) |
| && member.getFileExtension().equals("java")) { |
| java.net.URI locationURI = member.getLocationURI(); |
| // System.out.println("Compiling " + locationURI); |
| compilationUnits.add(new JavaSourceFileObject(locationURI)); |
| } |
| } |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| log = Logger.getLogger(UsageTests.class); |
| // AcceleoNature.class.getName(); // Pull in the plugin for Hudson |
| TestUtil.doOCLinEcoreSetup(); |
| configurePlatformResources(); |
| // resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() |
| // .put("pivot", new XMIResourceFactoryImpl()); //$NON-NLS-1$ |
| } |
| |
| @Override |
| protected void tearDown() |
| throws Exception { |
| log = null; |
| uninstall(); |
| super.tearDown(); |
| } |
| |
| public static @NonNull String createClassPath(@NonNull List<String> projectNames) { |
| IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); |
| String pathSeparator = null; |
| StringBuilder s = new StringBuilder(); |
| for (String projectName : projectNames) { |
| String projectPath = null; |
| IProject project = root.getProject(projectName); |
| if (project != null) { |
| IPath location = project.getLocation(); |
| if (location != null) { |
| projectPath = location.toString() + "/"; |
| } |
| } |
| if (projectPath == null) { |
| Bundle bundle = Platform.getBundle(projectName); |
| if (bundle != null) { |
| projectPath = bundle.getLocation(); |
| } |
| } |
| |
| if (projectPath != null) { |
| if (projectPath.startsWith("reference:")) { |
| projectPath = projectPath.substring(10); |
| } |
| URI uri = URI.createURI(projectPath); |
| if (uri.isFile()) { |
| String fileString = uri.toFileString(); |
| assert fileString != null; |
| projectPath = fileString.replace("\\", "/"); |
| } |
| assert projectPath != null; |
| if (projectPath.endsWith("/")) { |
| projectPath = projectPath + "bin"; |
| } |
| if (pathSeparator != null) { |
| s.append(pathSeparator); |
| } |
| else { |
| pathSeparator = System.getProperty("path.separator"); |
| } |
| s.append(projectPath); |
| } |
| } |
| return s.toString(); |
| } |
| |
| public @NonNull String createGenModelContent(@NonNull String testProjectPath, @NonNull String fileName, @Nullable Map<@NonNull String, @Nullable String> genOptions) { |
| String interfacePackageSuffix = genOptions != null ? genOptions.get("interfacePackageSuffix") : null; |
| String metaDataPackageSuffix = genOptions != null ? genOptions.get("metaDataPackageSuffix") : null; |
| String usedGenPackages = genOptions != null ? genOptions.get("usedGenPackages") : null; |
| StringBuilder s = new StringBuilder(); |
| s.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); |
| s.append("<genmodel:GenModel xmi:version=\"2.0\"\n"); |
| s.append(" xmlns:xmi=\"http://www.omg.org/XMI\"\n"); |
| s.append(" xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\"\n"); |
| s.append(" xmlns:genmodel=\"http://www.eclipse.org/emf/2002/GenModel\"\n"); |
| s.append(" modelDirectory=\"/" + testProjectPath + "/src-gen\"\n"); |
| s.append(" modelPluginID=\"" + fileName + "." + fileName + "\"\n"); |
| s.append(" modelName=\"" + fileName + "\"\n"); |
| s.append(" importerID=\"org.eclipse.emf.importer.ecore\"\n"); |
| s.append(" complianceLevel=\"8.0\"\n"); |
| s.append(" operationReflection=\"true\"\n"); |
| s.append(" copyrightFields=\"false\"\n"); |
| s.append(" bundleManifest=\"false\"\n"); |
| s.append(" pluginKey=\"\"\n"); |
| s.append(" usedGenPackages=\""); |
| if (usedGenPackages != null) { |
| s.append(usedGenPackages + " "); |
| } |
| s.append("platform:/resource/org.eclipse.ocl.pivot/model/oclstdlib.genmodel#//oclstdlib\"\n"); |
| s.append(" updateClasspath=\"false\">\n"); |
| s.append(" <genAnnotations source=\"http://www.eclipse.org/OCL/GenModel\">\n"); |
| s.append(" <details key=\"Use Delegates\" value=\"false\"/>\n"); |
| s.append(" <details key=\"Use Null Annotations\" value=\"true\"/>\n"); |
| s.append(" </genAnnotations>\n"); |
| s.append(" <foreignModel>" + fileName + ".ecore</foreignModel>\n"); |
| s.append(" <genPackages prefix=\"" + fileName + "\"\n"); |
| s.append(" disposableProviderFactory=\"true\"\n"); |
| s.append(" ecorePackage=\"" + fileName + ".ecore#/\"\n"); |
| if (interfacePackageSuffix != null) { |
| s.append(" interfacePackageSuffix=\"" + interfacePackageSuffix + "\"\n"); |
| } |
| if (metaDataPackageSuffix != null) { |
| s.append(" metaDataPackageSuffix=\"" + metaDataPackageSuffix + "\"\n"); |
| } |
| s.append(" />\n"); |
| s.append("</genmodel:GenModel>\n"); |
| s.append("\n");; |
| return s.toString(); |
| } |
| |
| public @NonNull URI createGenModelFile(String fileName, String fileContent) throws IOException { |
| File file = new File(getProjectFile(), fileName); |
| Writer writer = new FileWriter(file); |
| writer.append(fileContent); |
| writer.close(); |
| return getProjectFileURI(fileName); |
| } |
| |
| protected @NonNull URI createModels(@NonNull String testProjectName, @NonNull String testFileStem, |
| @Nullable String oclinecoreFile, @NonNull String genmodelFile) |
| throws CoreException, IOException { |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| IProject project = TestUtil.createJavaProject(testProjectName); |
| TestUtil.createManifest(project, testProjectName, null, null, null); |
| } |
| OCL ocl2 = OCL.newInstance(getProjectMap()); |
| if (oclinecoreFile != null) { |
| createEcoreFile(ocl2, testFileStem, oclinecoreFile); |
| } |
| URI genModelURI = createGenModelFile(testFileStem + ".genmodel", genmodelFile); |
| // System.out.println("Generating Ecore Model using '" + genModelURI + "'"); |
| ocl2.dispose(); |
| return genModelURI; |
| } |
| |
| protected boolean doCompile(@NonNull String testProjectName, @NonNull String... extraClasspathProjects) throws Exception { |
| List<@NonNull String> classpathProjects = new ArrayList<>(); |
| classpathProjects.add("org.eclipse.emf.common"); |
| classpathProjects.add("org.eclipse.emf.ecore"); |
| classpathProjects.add("org.eclipse.jdt.annotation"); |
| classpathProjects.add("org.eclipse.ocl.pivot"); |
| classpathProjects.add("org.eclipse.osgi"); |
| for (String extraClasspathProject : extraClasspathProjects) { |
| classpathProjects.add(extraClasspathProject); |
| } |
| // List<String> compilationOptions = new ArrayList<String>(); |
| // compilationOptions.add("-d"); |
| // compilationOptions.add("bin"); |
| // compilationOptions.add("-source"); |
| // compilationOptions.add("1.5"); |
| // compilationOptions.add("-target"); |
| // compilationOptions.add("1.5"); |
| // compilationOptions.add("-g"); |
| List<@NonNull JavaFileObject> compilationUnits = new ArrayList<>(); |
| Object context = null; |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| IWorkspace workspace = ResourcesPlugin.getWorkspace(); |
| IProject project = workspace.getRoot().getProject(testProjectName); |
| if (project != null) { |
| getCompilationUnits(compilationUnits, project); |
| // java.net.URI locationURI = project.getLocationURI(); |
| // String binURI = URIUtil.toUnencodedString(locationURI) + "/bin"; |
| // URI uri = URI.createURI(binURI); |
| // if (uri.isFile()) { |
| // String fileString = uri.toFileString(); |
| // assert fileString != null; |
| // binURI = fileString.replace("\\", "/"); |
| // } |
| // compilationOptions.set(1, binURI); |
| // new File(locationURI.getPath() + "/bin").mkdirs(); |
| // compilationOptions.add("-cp"); |
| // String path = createClassPath(classpathProjects); |
| // compilationOptions.add(path); |
| } |
| context = project; |
| } else { |
| File dir = new File("src-gen/" + testProjectName); |
| getCompilationUnits(compilationUnits, dir); |
| context = dir; |
| } |
| |
| /* DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>(); |
| |
| ServiceLoader<JavaCompiler> javaCompilerLoader = ServiceLoader.load(JavaCompiler.class); |
| Iterator<JavaCompiler> iterator = javaCompilerLoader.iterator(); |
| while (iterator.hasNext()) { |
| JavaCompiler next = iterator.next(); |
| next.getClass().toString(); |
| } |
| JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); |
| |
| StandardJavaFileManager stdFileManager = compiler |
| .getStandardFileManager(null, Locale.getDefault(), null); |
| |
| // System.out.printf("%6.3f getTask\n", 0.001 * |
| // (System.currentTimeMillis()-base)); |
| CompilationTask compilerTask = compiler.getTask(null, stdFileManager, |
| diagnostics, compilationOptions, null, compilationUnits); |
| // System.out.printf("%6.3f call\n", 0.001 * |
| // (System.currentTimeMillis()-base)); |
| if (!compilerTask.call()) { |
| StringBuilder s2 = new StringBuilder(); |
| s2.append("javac"); |
| for (String compilationOption : compilationOptions) { |
| s2.append(" "); |
| s2.append(compilationOption); |
| } |
| for (JavaFileObject compilationUnit : compilationUnits) { |
| s2.append("\n "); |
| s2.append(compilationUnit); |
| } |
| System.out.println(s2.toString()); |
| StringBuilder s = new StringBuilder(); |
| for (javax.tools.Diagnostic<?> diagnostic : diagnostics.getDiagnostics()) { |
| s.append("\n" + diagnostic); |
| } |
| if (s.length() > 0) { |
| throw new IOException("Failed to compile " + context + s.toString()); |
| } |
| System.out.println("Compilation of " + context + " returned false but no diagnostics"); |
| } */ |
| |
| JavaFileUtil.compileClasses(compilationUnits, String.valueOf(context), "bin", classpathProjects); |
| |
| |
| |
| // System.out.printf("%6.3f close\n", 0.001 * |
| // (System.currentTimeMillis()-base)); |
| // stdFileManager.close(); // Close the file manager which re-opens automatically |
| // System.out.printf("%6.3f forName\n", 0.001 * |
| // (System.currentTimeMillis()-base)); |
| // Class<?> testClass = Class.forName(qualifiedName); |
| // return testClass; |
| |
| return true; |
| } |
| |
| public static void doDelete(@NonNull String testProjectName) throws Exception { |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| TestUIUtil.deleteIProject(testProjectName); |
| } else { |
| File dir = new File("src-gen/" + testProjectName); |
| if (dir.exists()) { |
| TestUtil.deleteDirectory(dir); |
| } |
| } |
| } |
| |
| protected void doGenModel(@NonNull String testProjectName, @NonNull URI genmodelURI) throws Exception { |
| OCL ocl = createOCL(); |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| TestUIUtil.suppressGitPrefixPopUp(); |
| IWorkspace workspace = ResourcesPlugin.getWorkspace(); |
| IProject project = workspace.getRoot().getProject(testProjectName); |
| if (!project.exists()) { |
| project.create(null); |
| project.open(null); |
| } |
| } |
| // MetamodelManager metamodelManager2 = new MetamodelManager(); |
| // metamodelManager = metamodelManager2; |
| // GeneratorAdapterFactory.Descriptor.Registry.INSTANCE.addDescriptor( org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eNS_URI, OCLinEcoreGeneratorAdapterFactory.DESCRIPTOR); |
| URI fileURI = genmodelURI; //getProjectFileURI(testFileStem + ".genmodel"); |
| // System.out.println("Generating Ecore Model using '" + fileURI + "'"); |
| // metamodelManager2.dispose(); |
| ResourceSet resourceSet = ocl.getResourceSet(); |
| ProjectManager projectMap = ocl.getProjectManager(); |
| projectMap.configure(resourceSet, StandaloneProjectMap.LoadFirstStrategy.INSTANCE, StandaloneProjectMap.MapToFirstConflictHandler.INSTANCE); |
| resourceSet.getPackageRegistry().put(org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eNS_URI, org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE); |
| //FIXME this is needed so long as Pivot.genmodel is a UML genmodel |
| resourceSet.getPackageRegistry().put(org.eclipse.uml2.codegen.ecore.genmodel.GenModelPackage.eNS_URI, org.eclipse.uml2.codegen.ecore.genmodel.GenModelPackage.eINSTANCE); |
| resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("genmodel", new EcoreResourceFactoryImpl()); |
| GeneratorAdapterFactory.Descriptor.Registry.INSTANCE.addDescriptor( org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eNS_URI, GenModelGeneratorAdapterFactory.DESCRIPTOR); |
| GeneratorAdapterFactory.Descriptor.Registry.INSTANCE.addDescriptor( org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eNS_URI, OCLinEcoreGeneratorAdapterFactory.DESCRIPTOR); |
| if (resourceSet instanceof ResourceSetImpl) { |
| ResourceSetImpl resourceSetImpl = (ResourceSetImpl) resourceSet; |
| Map<URI, Resource> uriResourceMap = resourceSetImpl.getURIResourceMap(); |
| if (uriResourceMap != null) { |
| uriResourceMap.clear(); |
| } |
| } |
| resourceSet.getResources().clear(); |
| Resource resource = resourceSet.getResource(fileURI, true); |
| // EcoreUtil.resolveAll(resourceSet); -- genModel can fail if |
| // proxies resolved here |
| // problem arises if genmodel has an obsolete feature for a feature |
| // moved up the inheritance hierarchy |
| // since the proxy seems to be successfully resolved giving a double |
| // feature |
| checkResourceSet(resourceSet); |
| EObject eObject = resource.getContents().get(0); |
| if (!(eObject instanceof GenModel)) { |
| throw new ConfigurationException("No GenModel found in '" + resource.getURI() + "'"); |
| } |
| GenModel genModel = (GenModel) eObject; |
| genModel.reconcile(); |
| checkResourceSet(resourceSet); |
| // genModel.setCanGenerate(true); |
| // validate(); |
| |
| genModel.setValidateModel(true); // The more checks the better |
| // genModel.setCodeFormatting(true); // Normalize layout |
| genModel.setForceOverwrite(false); // Don't overwrite read-only files |
| genModel.setCanGenerate(true); |
| // genModel.setFacadeHelperClass(null); // Non-null gives JDT |
| // default NPEs |
| // genModel.setFacadeHelperClass(StandaloneASTFacadeHelper.class.getName()); |
| // // Bug 308069 |
| // genModel.setValidateModel(true); |
| genModel.setBundleManifest(false); // New manifests should be generated manually |
| genModel.setUpdateClasspath(false); // New class-paths should be generated manually |
| // genModel.setComplianceLevel(GenJDKLevel.JDK50_LITERAL); |
| // genModel.setRootExtendsClass("org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"); |
| Diagnostic diagnostic = genModel.diagnose(); |
| if (diagnostic.getSeverity() != Diagnostic.OK) { |
| fail(diagnostic.toString()); |
| } |
| |
| /* |
| * JavaModelManager.getJavaModelManager().initializePreferences(); new |
| * JavaCorePreferenceInitializer().initializeDefaultPreferences(); |
| * |
| * GenJDKLevel genSDKcomplianceLevel = genModel.getComplianceLevel(); |
| * String complianceLevel = JavaCore.VERSION_1_5; switch |
| * (genSDKcomplianceLevel) { case JDK60_LITERAL: complianceLevel = |
| * JavaCore.VERSION_1_6; case JDK14_LITERAL: complianceLevel = |
| * JavaCore.VERSION_1_4; default: complianceLevel = |
| * JavaCore.VERSION_1_5; } // Hashtable<?,?> defaultOptions = |
| * JavaCore.getDefaultOptions(); // |
| * JavaCore.setComplianceOptions(complianceLevel, defaultOptions); // |
| * JavaCore.setOptions(defaultOptions); |
| */ |
| |
| String oldGenModelStr = EmfFormatter.objToStr(genModel); |
| Generator generator = GenModelUtil.createGenerator(genModel); |
| Monitor monitor = new BasicMonitor(); |
| diagnostic = generator.generate(genModel, GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, monitor); |
| if (diagnostic.getSeverity() != Diagnostic.OK) { |
| String s = PivotUtil.formatDiagnostics(diagnostic, "\n"); |
| fail("Generation failure" + s); |
| } |
| genModel.reconcile(); // Delete the GenOperations |
| String newGenModelStr = EmfFormatter.objToStr(genModel); |
| TestCase.assertEquals(oldGenModelStr, newGenModelStr); |
| // metamodelManager.dispose(); |
| } |
| |
| public void testBug370824() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug370824"; |
| String testProjectName = "bug370824"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = "package bug370824 : bug370824 = 'http://bug370824'\n" |
| + "{\n" |
| + " class Clase1\n" |
| + " {\n" |
| + " invariant : self.name.size() > 0;\n" |
| + " attribute name : String[?] { ordered };\n" |
| + " }\n" |
| + "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, "Bug370824", null); |
| URI genModelURI = createModels(testProjectName, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| ocl.dispose(); |
| } |
| |
| public void testBug409650() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug409650"; |
| String testProjectName = "bug409650"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = "package bug409650 : bug409650 = 'http://bug409650'\n" |
| + "{\n" |
| + " class Clase1\n" |
| + " {\n" |
| + " invariant : self.name.size() > 0;\n" |
| + " attribute name : String[?] { ordered };\n" |
| + " operation copy(b : Boolean) : Boolean { body: b; }\n" |
| + " operation complement(b : Boolean) : Boolean { body: not b; }\n" |
| + " operation myPrefixedName(s1 : String, s2 : String) : String { body: s1 + name + s2; }\n" |
| + " operation me() : Clase1 { body: self.oclAsType(Clase1); }\n" |
| + " }\n" + "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, "Bug409650", null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| String qualifiedPackageName = testProjectName + "." + testFileStem + "Package"; |
| EPackage ePackage = doLoadPackage(qualifiedPackageName); |
| // System.out.println("Loaded " + ePackage); |
| EClass eClass = (EClass) ePackage.getEClassifier("Clase1"); |
| EStructuralFeature eStructuralFeature = eClass.getEStructuralFeature("name"); |
| EFactory eFactory = ePackage.getEFactoryInstance(); |
| // |
| EObject eObject = eFactory.create(eClass); |
| ocl.assertQueryTrue(eObject, "name = null"); |
| ocl.assertQueryTrue(eObject, "complement(true) = false"); |
| eObject.eSet(eStructuralFeature, "testing"); |
| ocl.assertQueryFalse(eObject, "name = null"); |
| ocl.assertQueryTrue(eObject, "name = 'testing'"); |
| ocl.assertQueryEquals(eObject, "XtestingY", "self.myPrefixedName('X', 'Y')"); |
| ocl.assertQueryEquals(eObject, eObject, "self.me()"); |
| } |
| ocl.dispose(); |
| } |
| |
| public void testEcoreTypes412736() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug412736"; |
| String testProjectName = "bug412736"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = "import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" |
| + "package bug412736 : bug412736 = 'http://bug412736'\n" |
| + "{\n" |
| + " datatype ENumber : 'java.lang.Number' { serializable };\n" |
| + " class EcoreDataTypes\n" |
| + " {\n" |
| + " attribute eBigDecimal : ecore::EBigDecimal { derived readonly volatile } { derivation: negEBigDecimal(1); }\n" |
| + " attribute eBigInteger : ecore::EBigInteger { derived readonly volatile } { derivation: negEBigInteger(1); }\n" |
| + " attribute eBooleanObject : ecore::EBooleanObject { derived readonly volatile } { derivation: notEBooleanObject(true); }\n" |
| + " attribute eBoolean : ecore::EBoolean { derived readonly volatile } { derivation: notEBoolean(true); }\n" |
| + " attribute eCharacterObject : ecore::ECharacterObject { derived readonly volatile } { derivation: negECharacterObject(1); }\n" |
| + " attribute eChar : ecore::EChar { derived readonly volatile } { derivation: negEChar(1); }\n" |
| + " attribute eDoubleObject : ecore::EDoubleObject { derived readonly volatile } { derivation: negEDoubleObject(1); }\n" |
| + " attribute eDouble : ecore::EDouble { derived readonly volatile } { derivation: negEDouble(1); }\n" |
| + " attribute eFloatObject : ecore::EFloatObject { derived readonly volatile } { derivation: negEFloatObject(1); }\n" |
| + " attribute eFloat : ecore::EFloat { derived readonly volatile } { derivation: negEFloat(1); }\n" |
| + " attribute eIntegerObject : ecore::EIntegerObject { derived readonly volatile } { derivation: negEIntegerObject(1); }\n" |
| + " attribute eInt : ecore::EInt { derived readonly volatile } { derivation: negEInt(1); }\n" |
| + " attribute eLongObject : ecore::ELongObject { derived readonly volatile } { derivation: negELongObject(1); }\n" |
| + " attribute eLong : ecore::ELong { derived readonly volatile } { derivation: negELong(1); }\n" |
| // + " attribute eNumber : ENumber { derived readonly volatile } { derivation: negENumber(ENumber{'1'}); }\n" |
| + " attribute eShortObject : ecore::EShortObject { derived readonly volatile } { derivation: negEShortObject(1); }\n" |
| + " attribute eShort : ecore::EShort { derived readonly volatile } { derivation: negEShort(1); }\n" |
| + " attribute eString : ecore::EString { derived readonly volatile } { derivation: upCase('abc'); }\n" |
| + " operation negEBigDecimal(b : ecore::EBigDecimal) : ecore::EBigDecimal { body: -b; }\n" |
| + " operation negEBigInteger(b : ecore::EBigInteger) : ecore::EBigInteger { body: -b; }\n" |
| + " operation negEChar(b : ecore::EChar) : ecore::EChar { body: -b; }\n" |
| + " operation negECharacterObject(b : ecore::ECharacterObject) : ecore::ECharacterObject { body: -b; }\n" |
| + " operation negEDouble(b : ecore::EDouble) : ecore::EDouble { body: -b; }\n" |
| + " operation negEDoubleObject(b : ecore::EDoubleObject) : ecore::EDoubleObject { body: -b; }\n" |
| + " operation negEFloat(b : ecore::EFloat) : ecore::EFloat { body: -b; }\n" |
| + " operation negEFloatObject(b : ecore::EFloatObject) : ecore::EFloatObject { body: -b; }\n" |
| + " operation negEInt(b : ecore::EInt) : ecore::EInt { body: -b; }\n" |
| + " operation negEIntegerObject(b : ecore::EIntegerObject) : ecore::EIntegerObject { body: -b; }\n" |
| + " operation negELong(b : ecore::ELong) : ecore::ELong { body: -b; }\n" |
| + " operation negELongObject(b : ecore::ELongObject) : ecore::ELongObject { body: -b; }\n" |
| // + " operation negENumber(b : ENumber) : ENumber { body: (-(b.oclAsType(Integer))).oclAsType(ENumber); }\n" |
| + " operation negEShort(b : ecore::EShort) : ecore::EShort { body: -b; }\n" |
| + " operation negEShortObject(b : ecore::EShortObject) : ecore::EShortObject { body: -b; }\n" |
| + " operation notEBoolean(b : ecore::EBoolean) : ecore::EBoolean { body: not b; }\n" |
| + " operation notEBooleanObject(b : ecore::EBooleanObject) : ecore::EBooleanObject { body: not b; }\n" |
| + " operation upCase(b : ecore::EString) : ecore::EString { body: b.toUpper(); }\n" |
| + " }\n" + "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, "Bug412736", null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| String qualifiedPackageName = testProjectName + "." + testFileStem + "Package"; |
| EPackage ePackage = doLoadPackage(qualifiedPackageName); |
| EClass eClass = (EClass) ePackage.getEClassifier("EcoreDataTypes"); |
| EFactory eFactory = ePackage.getEFactoryInstance(); |
| // |
| EObject eObject = eFactory.create(eClass); |
| ocl.assertQueryTrue(eObject, "eBigInteger = eBigDecimal"); |
| ocl.assertQueryTrue(eObject, "eChar = eCharacterObject"); |
| ocl.assertQueryTrue(eObject, "eBoolean = eBooleanObject"); |
| ocl.assertQueryTrue(eObject, "eDouble = eDoubleObject"); |
| ocl.assertQueryTrue(eObject, "eFloat = eFloatObject"); |
| ocl.assertQueryTrue(eObject, "eInt = eIntegerObject"); |
| ocl.assertQueryTrue(eObject, "eLong = eLongObject"); |
| // ocl.assertQueryTrue(eObject, "eNumber = eFloat"); -- waiting for BUG 370087 |
| ocl.assertQueryTrue(eObject, "eShort = eShortObject"); |
| ocl.assertQueryTrue(eObject, "eString = 'ABC'"); |
| } |
| ocl.dispose(); |
| } |
| |
| public void testEnumTypes412685() throws Exception { |
| TestOCL ocl = createOCL(); |
| // FIXME next line compensates an uninstall overenthusiasm |
| EPackage.Registry.INSTANCE.put(OCLstdlibPackage.eNS_URI, OCLstdlibPackage.eINSTANCE); |
| String testFileStem = "Bug412685"; |
| String testProjectName = "bug412685"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = "import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" |
| + "package bug412685 : bug412685 = 'http://bug412685'\n" |
| + "{\n" |
| + " enum Color { serializable } {\n" |
| + " literal BLACK;\n" |
| + " literal WHITE;\n" |
| + " }\n" |
| + " class EnumTypes\n" |
| + " {\n" |
| + " attribute eBlack : Color = 'BLACK' { readonly };\n" |
| + " attribute eWhite : Color = 'WHITE' { readonly };\n" |
| + " attribute eColor : Color { derived readonly volatile } { derivation: otherColor(Color::BLACK); }\n" |
| + " operation opaqueColor(eColor : Color) : OclAny { body: eColor; }\n" |
| + " operation otherColor(eColor : Color) : Color { body: if eColor = Color::BLACK then Color::WHITE else Color::BLACK endif; }\n" |
| + " }\n" |
| + "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectName, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| String qualifiedPackageName = testProjectName + "." + testFileStem + "Package"; |
| EPackage ePackage = doLoadPackage(qualifiedPackageName); |
| EClass eClass = (EClass) ePackage.getEClassifier("EnumTypes"); |
| EFactory eFactory = ePackage.getEFactoryInstance(); |
| // |
| EObject eObject = eFactory.create(eClass); |
| ocl.assertQueryTrue(eObject, "let aWhite : OclAny = opaqueColor(eWhite) in eColor = aWhite"); |
| ocl.assertQueryTrue(eObject, "let aWhite : OclAny = eWhite.oclAsType(OclAny) in eColor = aWhite"); |
| ocl.assertQueryTrue(eObject, "eColor = eWhite"); |
| ocl.assertQueryTrue(eObject, "eColor = Color::WHITE"); |
| } |
| ocl.dispose(); |
| } |
| |
| public void testTemplateTypes471201() throws Exception { |
| TestOCL ocl = createOCL(); |
| // FIXME next line compensates an uninstall overenthusiasm |
| EPackage.Registry.INSTANCE.put(OCLstdlibPackage.eNS_URI, OCLstdlibPackage.eINSTANCE); |
| String testFileStem = "Bug471201"; |
| String testProjectName = "bug471201"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = "import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" |
| + "package bug471201 : bug471201 = 'http://bug471201'\n" |
| + "{\n" |
| + " class NamedElement {}\n" |
| + " class LookupEnvironment\n" |
| + " {\n" |
| + " operation(NE extends NamedElement) addElements(elements : NE[*] { ordered }) : LookupEnvironment[1]\n" |
| +" {\n" |
| + " body: if elements->notEmpty() then addElements(OrderedSet(NamedElement){}) else self endif;\n" |
| + " }\n" |
| + " }\n" |
| + "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectName, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| ocl.dispose(); |
| } |
| |
| public void testCSE() throws Exception { |
| TestOCL ocl = createOCL(); |
| // CommonSubexpressionEliminator.CSE_PLACES.setState(true); |
| // CommonSubexpressionEliminator.CSE_PRUNE.setState(true); |
| // CommonSubexpressionEliminator.CSE_PULL_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_PUSH_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_REWRITE.setState(true); |
| String testFileStem = "CSEs"; |
| String testProjectName = "cses"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = "import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" |
| + "package cses : cses = 'http://cses'\n" |
| + "{\n" |
| + " class CSEs\n" |
| + " {\n" |
| // + " attribute a : ecore::EInt = '3' { readonly };\n" |
| + " operation test(a : ecore::EInt, b : ecore::EInt, c : ecore::EInt) : ecore::EInt { body: if a + b + c > 0 then a + b + c else a + b endif; }\n" |
| + " }\n" |
| + "}\n"; |
| Map <@NonNull String, @Nullable String> genOptions = new HashMap<>(); |
| genOptions.put("interfacePackageSuffix", "coreI"); |
| genOptions.put("metaDataPackageSuffix", "coreM"); |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, genOptions); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| doCompile(testProjectName); |
| String qualifiedPackageName = testProjectName + ".coreM." + testFileStem + "Package"; |
| EPackage ePackage = doLoadPackage(qualifiedPackageName); |
| EClass eClass = (EClass) ePackage.getEClassifier("CSEs"); |
| EFactory eFactory = ePackage.getEFactoryInstance(); |
| // |
| EObject eObject = eFactory.create(eClass); |
| // OCLHelper helper = getHelper(); |
| // org.eclipse.ocl.pivot.Class contextType = helper.getOCL().getMetamodelManager().getType(idResolver.getStaticTypeOf(eObject)); |
| // helper.setContext(contextType); |
| // ExpressionInOCL query = helper.createQuery("test(3, 2, 1)"); |
| // ocl.assertCallCount(query, null, 2); |
| // ocl.assertCallCount(query, NumericPlusOperation.INSTANCE, 2); |
| ocl.assertQueryEquals(eObject, 6, "test(3, 2, 1)"); |
| ocl.assertQueryEquals(eObject, -5, "test(3, -8, 1)"); |
| } |
| ocl.dispose(); |
| } |
| |
| /* private void assertCallCount(ExpressionInOCL query, @Nullable LibraryOperation calledOperation, int expectedCount) { |
| List<CGOperationCallExp> calls = new ArrayList<CGOperationCallExp>(); |
| for (TreeIterator<EObject> tit = query.getBodyExpression().eAllContents(); tit.hasNext(); ) { |
| EObject eObject = tit.next(); |
| if (eObject instanceof CGOperationCallExp) { |
| CGOperationCallExp callExp = (CGOperationCallExp)eObject; |
| if (calledOperation == null) { |
| calls.add(callExp); |
| } else if (callExp.getReferredOperation().getImplementation() == calledOperation) { |
| calls.add(callExp); |
| } |
| } |
| } |
| if (calledOperation == null) { |
| assertEquals("Mismatching call count", expectedCount, calls.size()); |
| } |
| else { |
| assertEquals("Mismatching call count of " + calledOperation, expectedCount, calls.size()); |
| } |
| } */ |
| public void testEvaluators() throws Exception { |
| TestOCL ocl = createOCL(); |
| // CommonSubexpressionEliminator.CSE_BUILD.setState(true); |
| // CommonSubexpressionEliminator.CSE_PLACES.setState(true); |
| // CommonSubexpressionEliminator.CSE_PRUNE.setState(true); |
| // CommonSubexpressionEliminator.CSE_PULL_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_PUSH_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_REWRITE.setState(true); |
| String testFileStem = "Evaluators"; |
| String testProjectName = "evaluators"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = "import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" |
| + "package evaluators : evaluators = 'http://evaluators'\n" |
| + "{\n" |
| + " class Evaluators\n" |
| + " {\n" |
| + " attribute name : String[?];\n" |
| + " operation test() : String { body: \n" |
| + " let severity : String[1] = 'testString'.replaceFirst('xx', 'yy') \n" |
| + " in if severity = '' \n" |
| + " then '' \n" |
| + " else \n" |
| + " 'testString'.replaceAll('z1','z2') \n" |
| + " endif; }\n" |
| + " }\n" |
| + "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| doCompile(testProjectName); |
| String qualifiedPackageName = testProjectName + "." + testFileStem + "Package"; |
| EPackage ePackage = doLoadPackage(qualifiedPackageName); |
| EClass eClass = (EClass) ePackage.getEClassifier("Evaluators"); |
| EFactory eFactory = ePackage.getEFactoryInstance(); |
| // |
| EObject eObject = eFactory.create(eClass); |
| ocl.assertQueryEquals(eObject, "testString", "test()"); |
| } |
| ocl.dispose(); |
| } |
| |
| public void testSysML_QUDV() throws Exception { |
| TestOCL ocl = createOCL(); |
| try { |
| // CommonSubexpressionEliminator.CSE_BUILD.setState(true); |
| // CommonSubexpressionEliminator.CSE_PLACES.setState(true); |
| // CommonSubexpressionEliminator.CSE_PRUNE.setState(true); |
| // CommonSubexpressionEliminator.CSE_PULL_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_PUSH_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_REWRITE.setState(true); |
| String testProjectName = "SysML_ValueTypes_QUDV"; |
| String testProjectPath = /*EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName :*/ ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| doDelete(ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS); |
| @NonNull URI ecoreURI = URI.createPlatformPluginURI("/" + ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS + "/model/SysML_ValueTypes_QUDV.ecore", true); |
| @NonNull URI genModelURI = URI.createPlatformPluginURI("/" + ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS + "/model/SysML_ValueTypes_QUDV.genmodel", true); |
| IProject project = TestUtil.createJavaProject(ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS); |
| TestUtil.createClassPath(project, new @NonNull String @NonNull []{"src-gen"}); |
| TestUtil.createManifest(project, testProjectPath, |
| new @NonNull String @NonNull []{"org.eclipse.osgi", "org.eclipse.emf.ecore", "org.eclipse.jdt.annotation", "org.eclipse.ocl.pivot"}, |
| null, |
| new @NonNull String @NonNull []{"SysML_ValueTypes_QUDV", "SysML_ValueTypes_QUDV.PrimitiveValueTypes", "SysML_ValueTypes_QUDV.QUDV", "SysML_ValueTypes_QUDV.UnitAndQuantityKind"}); |
| TestUtil.copyIFile(ocl, genModelURI, project, "model/SysML_ValueTypes_QUDV.genmodel"); |
| TestUtil.copyIFile(ocl, ecoreURI, project, "model/SysML_ValueTypes_QUDV.ecore"); |
| } |
| else { |
| doDelete(testProjectName); |
| } |
| @NonNull URI genModelURI = URI.createPlatformResourceURI("/" + ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS + "/model/SysML_ValueTypes_QUDV.genmodel", true); |
| if (!ocl.getResourceSet().getURIConverter().exists(genModelURI, null)) { |
| return; |
| } |
| doGenModel(testProjectPath, genModelURI); |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| doCompile(testProjectName); |
| String qualifiedPackageName = testProjectName + ".QUDV.QUDVPackage"; |
| EPackage ePackage = doLoadPackage(qualifiedPackageName); |
| EClass eClass = (EClass) ePackage.getEClassifier("DerivedQuantityKind"); |
| EFactory eFactory = ePackage.getEFactoryInstance(); |
| // |
| EObject eObject = eFactory.create(eClass); |
| ocl.assertQueryTrue(eObject, "dependsOnQuantityKinds() <> null"); |
| } |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| String qualifiedPackageName = testProjectName + ".PrimitiveValueTypes.PrimitiveValueTypesPackage"; |
| EPackage ePackage = doLoadPackage(qualifiedPackageName); |
| EClass eClass = (EClass) ePackage.getEClassifier("Complex"); |
| EFactory eFactory = ePackage.getEFactoryInstance(); |
| // |
| EObject eObject = eFactory.create(eClass); |
| ocl.assertQueryTrue(eObject, "imaginaryPart = realPart"); |
| ocl.assertQueryTrue(eObject, "oclType() <> null"); |
| ocl.assertQueryTrue(eObject, "oclType().oclIsKindOf(OclAny)"); |
| } |
| } |
| finally { |
| ocl.dispose(); |
| } |
| } |
| |
| public void testCodegenCompany() throws Exception { |
| TestOCL ocl = createOCL(); |
| try { |
| // CommonSubexpressionEliminator.CSE_BUILD.setState(true); |
| // CommonSubexpressionEliminator.CSE_PLACES.setState(true); |
| // CommonSubexpressionEliminator.CSE_PRUNE.setState(true); |
| // CommonSubexpressionEliminator.CSE_PULL_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_PUSH_UP.setState(true); |
| // CommonSubexpressionEliminator.CSE_REWRITE.setState(true); |
| String testProjectName = "codegen/company"; |
| String testProjectPath = /*EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName :*/ ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| doDelete(ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS); |
| @NonNull URI ecoreURI = URI.createPlatformPluginURI("/" + ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS + "/model/Company.ecore", true); |
| @NonNull URI genModelURI = URI.createPlatformPluginURI("/" + ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS + "/model/CodeGenCompany.genmodel", true); |
| IProject project = TestUtil.createJavaProject(ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS); |
| TestUtil.createClassPath(project, new @NonNull String @NonNull []{"src-gen"}); |
| TestUtil.createManifest(project, testProjectPath, |
| new @NonNull String @NonNull []{"org.eclipse.osgi", "org.eclipse.emf.ecore", "org.eclipse.jdt.annotation", "org.eclipse.ocl.pivot"}, |
| null, |
| new @NonNull String @NonNull []{"company"}); |
| TestUtil.copyIFile(ocl, genModelURI, project, "model/CodeGenCompany.genmodel"); |
| TestUtil.copyIFile(ocl, ecoreURI, project, "model/Company.ecore"); |
| } |
| else { |
| doDelete(testProjectName); |
| } |
| @NonNull URI genModelURI = URI.createPlatformResourceURI("/" + ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS + "/model/CodeGenCompany.genmodel", true); |
| if (!ocl.getResourceSet().getURIConverter().exists(genModelURI, null)) { |
| return; |
| } |
| doGenModel(testProjectPath, genModelURI); |
| if (!EMFPlugin.IS_ECLIPSE_RUNNING) { // FIXME find out how to get dynamic project onto classpath |
| doCompile(testProjectName); |
| } |
| } |
| finally { |
| ocl.dispose(); |
| } |
| } |
| |
| protected EPackage doLoadPackage(@NonNull String qualifiedModelPackageName) throws Exception { |
| Class<?> testClass = Class.forName(qualifiedModelPackageName); |
| // System.out.println("Loaded " + testClass.getName()); |
| Object eInstance = testClass.getDeclaredField("eINSTANCE").get(null); |
| return (EPackage) eInstance; |
| } |
| |
| public void testInitStatics() { |
| assertTrue(ValueUtil.initAllStatics()); |
| assertFalse(ValueUtil.initAllStatics()); |
| } |
| |
| /** |
| * Verify that the Pivot metamodel can be loaded and validated as a *.oclas file by the |
| * Sample Reflective Ecore Editor. |
| */ |
| public void testOpen_Pivot_oclas() throws Exception { |
| TestOCL ocl = createOCL(); |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| TestCaseAppender.INSTANCE.uninstall(); |
| TestUIUtil.suppressGitPrefixPopUp(); |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| IIntroManager introManager = workbench.getIntroManager(); |
| introManager.closeIntro(introManager.getIntro()); |
| TestUIUtil.flushEvents(); |
| |
| String testProjectName = "Open_Pivot"; |
| ResourceSet resourceSet1 = new ResourceSetImpl(); |
| Resource resource = resourceSet1.getResource(URI.createURI(PivotPackage.eNS_URI, true), true); |
| ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| resource.setURI(URI.createPlatformResourceURI(testProjectName + "/" + "Pivot.oclas", true)); |
| resource.save(outputStream, null); |
| |
| IWorkspace workspace = ResourcesPlugin.getWorkspace(); |
| IProject project = workspace.getRoot().getProject(testProjectName); |
| if (!project.exists()) { |
| project.create(null); |
| } |
| project.open(null); |
| IFile file = project.getFile("Pivot.oclas"); |
| file.create(new ByteArrayInputStream(outputStream.toByteArray()), true, null); |
| |
| // Bundle bundle = Platform.getBundle("org.eclipse.ocl.pivot"); |
| // String location = bundle.getLocation() + "/model-gen/Pivot.oclas"; |
| // java.net.URI uri = new java.net.URI(location.substring(location.indexOf("file:"))); |
| IWorkbenchPage activePage = workbench.getActiveWorkbenchWindow().getActivePage(); |
| EcoreEditor openEditor = (EcoreEditor) IDE.openEditor(activePage, file, "org.eclipse.emf.ecore.presentation.ReflectiveEditorID", true); |
| TestUIUtil.flushEvents(); |
| ResourceSet resourceSet = openEditor.getEditingDomain().getResourceSet(); |
| EList<Resource> resources = resourceSet.getResources(); |
| assertEquals(1, resources.size()); |
| Resource resource2 = ClassUtil.nonNullState(resources.get(0)); |
| assertNoResourceErrors("Load", resource2); |
| assertNoValidationErrors("Validate", resource2); |
| // for (int i = 0; i < 1000; i++){ |
| // flushEvents(); |
| // Thread.sleep(100); |
| // } |
| openEditor.dispose(); |
| } |
| ocl.dispose(); |
| } |
| |
| /** |
| * Verify that the Bug469251.uml model can be loaded and validated as a *.uml file by the |
| * UML MOdel Ecore Editor. |
| */ |
| public void testOpen_Bug469251_uml() throws Exception { |
| TestOCL ocl = createOCL(); |
| if (EMFPlugin.IS_ECLIPSE_RUNNING) { |
| TestCaseAppender.INSTANCE.uninstall(); |
| TestUIUtil.suppressGitPrefixPopUp(); |
| IWorkbench workbench = PlatformUI.getWorkbench(); |
| IIntroManager introManager = workbench.getIntroManager(); |
| introManager.closeIntro(introManager.getIntro()); |
| TestUIUtil.flushEvents(); |
| |
| String testProjectName = "Open_Bug469251_uml"; |
| /* ResourceSet resourceSet1 = new ResourceSetImpl(); |
| getProjectFile().("Bug469251.uml"); |
| Resource resource = resourceSet1.getResource(URI.createURI(PivotPackage.eNS_URI, true), true); |
| ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
| resource.setURI(URI.createPlatformResourceURI(testProjectName + "/" + "Bug469251.uml", true)); |
| resource.save(outputStream, null); */ |
| |
| IProject iProject = TestUIUtil.createIProject(testProjectName); |
| @SuppressWarnings("unused")IFile profileFile = TestUIUtil.copyIFile(iProject.getFile("Bug469251.profile.uml"), getProjectFileURI("Bug469251.profile.uml"), null); |
| IFile modelFile = TestUIUtil.copyIFile(iProject.getFile("Bug469251.uml"), getProjectFileURI("Bug469251.uml"), null); |
| |
| // Bundle bundle = Platform.getBundle("org.eclipse.ocl.pivot"); |
| // String location = bundle.getLocation() + "/model-gen/Pivot.oclas"; |
| // java.net.URI uri = new java.net.URI(location.substring(location.indexOf("file:"))); |
| IWorkbenchPage activePage = workbench.getActiveWorkbenchWindow().getActivePage(); |
| UMLEditor umlEditor = (UMLEditor) IDE.openEditor(activePage, modelFile, "org.eclipse.uml2.uml.editor.presentation.UMLEditorID", true); |
| TestUIUtil.flushEvents(); |
| /** |
| * This progresses the dialog but there is no clue as to what it did. |
| * |
| String validateName = EMFEditUIPlugin.INSTANCE.getString("_UI_Validate_menu_item"); |
| IMenuManager menuManager = umlEditor.getActionBars().getMenuManager(); |
| IContributionManager validateItem1 = (IContributionManager) menuManager.findUsingPath("org.eclipse.uml2.umlMenuID"); |
| for (IContributionItem item : validateItem1.getItems()) { |
| if (item instanceof ActionContributionItem){ |
| IAction action = ((ActionContributionItem)item).getAction(); |
| if (action.getText().equals(validateName)) { |
| final Display display = Display.getCurrent(); |
| display.timerExec(5000, new Runnable() |
| { |
| public void run() { |
| Event event = new Event(); |
| event.type = SWT.KeyDown; |
| event.character = '\r'; |
| display.post(event); |
| } |
| }); |
| action.run(); |
| break; |
| } |
| } |
| } */ |
| ResourceSet resourceSet = umlEditor.getEditingDomain().getResourceSet(); |
| EList<Resource> resources = resourceSet.getResources(); |
| assertEquals(2, resources.size()); |
| Resource umlResource = ClassUtil.nonNullState(resources.get(0)); |
| Model model = (Model) umlResource.getContents().get(0); |
| org.eclipse.uml2.uml.Type xx = model.getOwnedType("Class1"); |
| assertNoResourceErrors("Load", umlResource); |
| assertValidationDiagnostics("Validate", umlResource, |
| EcorePlugin.INSTANCE.getString("_UI_GenericInvariant_diagnostic", new Object[]{"Constraint1", "«Stereotype1»" + LabelUtil.getLabel(xx)})); |
| umlEditor.dispose(); |
| } |
| ocl.dispose(); |
| } |
| |
| public void testPivotMetamodelImport414855() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug414855"; |
| String testProjectName = "bug414855"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = |
| "import pivot : 'http://www.eclipse.org/ocl/2015/Pivot#/';\n" |
| + "package bug414855 : bug414855 = 'http://bug414855'\n" |
| + "{\n" |
| + " datatype MyString : 'java.lang.String' { serializable };\n" |
| + " class ClassExtension extends pivot::Class {}\n" |
| + "}\n"; |
| Map <@NonNull String, @Nullable String> genOptions = new HashMap<>(); |
| genOptions.put("usedGenPackages", "platform:/plugin/org.eclipse.ocl.pivot/model/Pivot.genmodel#//pivot"); |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, genOptions); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| ocl.dispose(); |
| } |
| |
| public void testBug415782() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug415782"; |
| String testProjectName = "bug415782"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = |
| "import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/';\n" |
| + "package bug415782 : bug415782 = 'http://bug415782'\n" |
| + "{\n" |
| + " class MyClass\n" |
| + " {\n" |
| + " attribute manyDates : ecore::EDate[*] { ordered };\n" |
| + " attribute aBool : Boolean;\n" |
| + " operation anOp() : MyClass {" |
| + " body : MyClass {" |
| + " manyDates = OrderedSet{},\n" |
| + " aBool = manyDates->isEmpty()\n" |
| + " };" |
| + " }\n" |
| + " }\n" |
| + "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| ocl.dispose(); |
| } |
| |
| public void testBug416421() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStemA = "Bug416421A"; |
| String testProjectNameA = "bug416421A"; |
| String testProjectPathA = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectNameA : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFileA = |
| "package bug416421A : bug416421A = 'example.org/bug416421A'\n" |
| + "{\n" |
| + " class ClassA\n" |
| + " {\n" |
| + " operation getFalse() : Boolean\n" |
| + " {\n" |
| + " body: false;\n" |
| + " }\n" |
| + " }\n" |
| + "}\n"; |
| String genmodelFileA = createGenModelContent(testProjectPathA, testFileStemA, null); |
| String testFileStemB = "Bug416421B"; |
| String testProjectNameB = "bug416421B"; |
| String testProjectPathB = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectNameB : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFileB = |
| "import bug416421A : 'Bug416421A.ecore#/';\n" |
| + "package bug416421B : bug416421B = 'example.org/bug416421B'\n" |
| + "{\n" |
| + " class ClassB extends bug416421A::ClassA\n" |
| + " {\n" |
| + " operation getTrue() : Boolean\n" |
| + " {\n" |
| + " body: true;\n" |
| + " }\n" |
| + " }\n" |
| + "}\n"; |
| Map <@NonNull String, @Nullable String> genOptions = new HashMap<>(); |
| genOptions.put("usedGenPackages", "Bug416421A.genmodel#//bug416421A"); |
| String genmodelFileB = createGenModelContent(testProjectPathB, testFileStemB, genOptions); |
| doDelete(testProjectNameA); |
| doDelete(testProjectNameB); |
| URI genModelURIA = createModels(testProjectPathA, testFileStemA, oclinecoreFileA, genmodelFileA); |
| URI genModelURIB = createModels(testProjectPathB, testFileStemB, oclinecoreFileB, genmodelFileB); |
| // B first demonstrates the demand load of Bug416421A to fix Bug 416421 |
| doGenModel(testProjectPathB, genModelURIB); |
| doGenModel(testProjectPathA, genModelURIA); |
| doCompile(testProjectNameA); |
| doCompile(testProjectNameB, testProjectNameA); |
| ocl.dispose(); |
| } |
| |
| public void testBug458722() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug458722"; |
| String testProjectName = "bug458722"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = |
| "import ecore : 'http://www.eclipse.org/emf/2002/Ecore';\n" + |
| "\n" + |
| "package bug458722 : bug458722 = 'http://www.example.com/bug458722/rootPackage/2.0'\n" + |
| "{\n" + |
| " package subPackage : subPackage = 'http://www.example.com/bug458722/subPackage/2.0'\n" + |
| " {\n" + |
| " class SubElement\n" + |
| " {\n" + |
| " operation op(tokens : String[*] { ordered !unique }) : Boolean\n" + |
| " {\n" + |
| " body: \n" + |
| " \n" + |
| " if tokens->at(1) = '1'\n" + |
| " then\n" + |
| " op2(tokens)\n" + |
| " else\n" + |
| " true\n" + |
| " endif;\n" + |
| " }\n" + |
| " operation op2(tokens : String[*] { ordered !unique }) : Boolean\n" + |
| " {\n" + |
| " body: \n" + |
| " true;\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " abstract class Element\n" + |
| " {\n" + |
| " attribute name : String = '';\n" + |
| " }\n" + |
| "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| ocl.dispose(); |
| } |
| |
| public void testBug458723() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug458723"; |
| String testProjectName = "bug458723"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = |
| "import ecore : 'http://www.eclipse.org/emf/2002/Ecore';\n" + |
| "\n" + |
| "package bug458723 : bug458723 = 'http://www.example.com/bug458723/rootPackage/1.0'\n" + |
| "{\n" + |
| " package subPackage : subPackage = 'http://www.example.com/bug458723/subPackage/1.0'\n" + |
| " {\n" + |
| " class Element extends bug458723::Element\n" + |
| " {\n" + |
| "\n" + |
| " /*\n" + |
| " * Error also occurs with Bag(OclAny) in signature without\n" + |
| "{!unique}\n" + |
| " */\n" + |
| " operation op() : ocl::OclAny[*] { !unique }\n" + |
| " {\n" + |
| " body: \n" + |
| " Bag{};\n" + |
| " }\n" + |
| " }\n" + |
| " }\n" + |
| " abstract class Element\n" + |
| " {\n" + |
| " attribute name : String = '';\n" + |
| " }\n" + |
| "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| ocl.dispose(); |
| } |
| |
| public void testBug458724() throws Exception { |
| TestOCL ocl = createOCL(); |
| String testFileStem = "Bug458724"; |
| String testProjectName = "bug458724"; |
| String testProjectPath = EMFPlugin.IS_ECLIPSE_RUNNING ? testProjectName : ORG_ECLIPSE_OCL_EXAMPLES_XTEXT_TESTRESULTS; |
| String oclinecoreFile = |
| "import ecore : 'http://www.eclipse.org/emf/2002/Ecore';\n" + |
| "\n" + |
| "package bug458724 : bug458724 = 'http://www.example.com/bug458724/rootPackage/2.0'\n" + |
| "{\n" + |
| " class Element\n" + |
| " {\n" + |
| " attribute name : String = '';\n" + |
| " invariant\n" + |
| " elementNameNotReservedWord: \n" + |
| " let name: String = self.name.toLower() in\n" + |
| " name <> 'reserved_1' and\n" + |
| " name <> 'reserved_2' and\n" + |
| " name <> 'reserved_3' and\n" + |
| " name <> 'reserved_4' and\n" + |
| " name <> 'reserved_5' and\n" + |
| " name <> 'reserved_6' and\n" + |
| " name <> 'reserved_7' and\n" + |
| " name <> 'reserved_8' and\n" + |
| " name <> 'reserved_9' and\n" + |
| " name <> 'reserved_10' and\n" + |
| " name <> 'reserved_11' and\n" + |
| " name <> 'reserved_12' and\n" + |
| " name <> 'reserved_13' and\n" + |
| " name <> 'reserved_14' and\n" + |
| " name <> 'reserved_15' and\n" + |
| " name <> 'reserved_16' and\n" + |
| " name <> 'reserved_17' and\n" + |
| " name <> 'reserved_18' and\n" + |
| " name <> 'reserved_19';\n" + |
| " }\n" + |
| "}\n"; |
| String genmodelFile = createGenModelContent(testProjectPath, testFileStem, null); |
| doDelete(testProjectName); |
| URI genModelURI = createModels(testProjectPath, testFileStem, oclinecoreFile, genmodelFile); |
| doGenModel(testProjectPath, genModelURI); |
| doCompile(testProjectName); |
| ocl.dispose(); |
| } |
| } |