From 6ab72400e3deff26883755e5641c91ad3f91e797 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:06:16 +0200 Subject: [PATCH 01/87] Create new plug-in for initialisers --- .../cipm.consistency.initialisers/.classpath | 7 ++++ .../cipm.consistency.initialisers/.project | 28 +++++++++++++++ .../.settings/org.eclipse.jdt.core.prefs | 9 +++++ .../META-INF/MANIFEST.MF | 35 +++++++++++++++++++ .../build.properties | 4 +++ 5 files changed, 83 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/.classpath create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/.project create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/.settings/org.eclipse.jdt.core.prefs create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/build.properties diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/.classpath b/commit-based-cipm/initialisers/cipm.consistency.initialisers/.classpath new file mode 100644 index 0000000000..e801ebfb46 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/.project b/commit-based-cipm/initialisers/cipm.consistency.initialisers/.project new file mode 100644 index 0000000000..7bd4543292 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/.project @@ -0,0 +1,28 @@ + + + cipm.consistency.initialisers + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/.settings/org.eclipse.jdt.core.prefs b/commit-based-cipm/initialisers/cipm.consistency.initialisers/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..c9545f06a4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.compliance=11 +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=11 diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF b/commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..217185e3c3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF @@ -0,0 +1,35 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: cipm.consistency.initialisers +Bundle-SymbolicName: cipm.consistency.initialisers +Bundle-Version: 1.0.0.qualifier +Automatic-Module-Name: cipm.consistency.initialisers +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit, + org.junit.jupiter.api, + org.apache.log4j, + org.eclipse.emf.ecore, + org.emftext.language.java +Export-Package: cipm.consistency.initialisers, + cipm.consistency.initialisers.eobject, + cipm.consistency.initialisers.jamopp, + cipm.consistency.initialisers.jamopp.annotations, + cipm.consistency.initialisers.jamopp.arrays, + cipm.consistency.initialisers.jamopp.classifiers, + cipm.consistency.initialisers.jamopp.commons, + cipm.consistency.initialisers.jamopp.containers, + cipm.consistency.initialisers.jamopp.expressions, + cipm.consistency.initialisers.jamopp.generics, + cipm.consistency.initialisers.jamopp.imports, + cipm.consistency.initialisers.jamopp.initadapters, + cipm.consistency.initialisers.jamopp.instantiations, + cipm.consistency.initialisers.jamopp.literals, + cipm.consistency.initialisers.jamopp.members, + cipm.consistency.initialisers.jamopp.modifiers, + cipm.consistency.initialisers.jamopp.modules, + cipm.consistency.initialisers.jamopp.operators, + cipm.consistency.initialisers.jamopp.parameters, + cipm.consistency.initialisers.jamopp.references, + cipm.consistency.initialisers.jamopp.statements, + cipm.consistency.initialisers.jamopp.types, + cipm.consistency.initialisers.jamopp.variables diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/build.properties b/commit-based-cipm/initialisers/cipm.consistency.initialisers/build.properties new file mode 100644 index 0000000000..34d2e4d2da --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . From b621f05e43d239956ac53e3fcdc2ab0e88b372ec Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:11:58 +0200 Subject: [PATCH 02/87] Implement interfaces for (adaptable) initialisers --- .../initialisers/IInitialiser.java | 244 ++++++++++++++++++ .../IInitialiserAdapterStrategy.java | 29 +++ .../initialisers/IInitialiserBase.java | 97 +++++++ 3 files changed, 370 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java new file mode 100644 index 0000000000..59f67ad167 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java @@ -0,0 +1,244 @@ +package cipm.consistency.initialisers; + +import java.util.function.BiFunction; + +/** + * An interface to be implemented by initialisers. Initialisers are interfaces + * or classes, which are meant to instantiate objects (designated objects) via + * {@link #instantiate()}. For intuition, their names can be used to denote what + * they instantiate.
+ *
+ * Initialisers can also implement (default) methods that modify their + * designated objects. It is suggested to have such modification methods return + * something that indicates whether they ran as expected. In general, + * modification methods DO NOT check, if the object that is being modified + * (modification target) is null. Attempting to use null as modification target + * will result in EXCEPTIONS. The reason behind this is the importance of + * knowing if the modification target is null, as this could hint towards faulty + * code.
+ *
+ * addSomething(...) methods have null checks for the passed parameters other + * than the modification target (i.e. modification parameters), which are used + * to perform modifications. By default, it is assumed that no null elements can + * be added to modification targets via addSomething(...). If modification + * parameters are null, no modification will be performed and the method will be + * assumed to have run as expected, since no modification was performed and + * failed. setSomething(...) methods, on the other hand, allow setting + * attributes of the modification target to null.
+ *
+ * It is recommended to separate instantiation and initialisation (modification) + * methods, as doing so will allow using the individual methods in sub-types. + * Implementing initialisers similar to their designated objects, in terms of + * type hierarchy and what modifications they allow from outside, may make + * initialisers more flexible and ease implementing them.
+ *
+ * A further suggestion is to not declare attributes in the concrete + * implementors, so that all functionality is present in form of methods. This + * alleviates having to declare unnecessary attributes in sub-types and makes + * overriding behaviour easier, since default methods can be overridden in + * interfaces. If initialisation of the designated objects is complex, consider + * realising it in form of initialiser adaptation strategies (see the links + * below).
+ *
+ * This interface also contains some static utility methods. + * + * @author Alp Torac Genc + * @see {@link IInitialiserBase} + * @see {@link IInitialiserAdapterStrategy} + */ +public interface IInitialiser { + /** + * Can be used to create a (deep) copy of this. + * + * @return A fresh instance of this initialiser's class. + */ + public IInitialiser newInitialiser(); + + /** + * Attempts to instantiate the class this {@link IInitialiser} is designated + * for. Depending on the returned object, additional initialisation may be + * necessary. + */ + public Object instantiate(); + + /** + * Attempts to initialise obj, so that it is "valid".
+ *
+ * It is recommended to only use this method where necessary, as it may + * introduce additional modifications that are not obvious from outside. + * + * @param obj The object that will be made valid + */ + public boolean initialise(Object obj); + + /** + * Checks whether a given {@link IInitialiser} type directly declares any + * methods that modify given object instances. Returns false, if + * {@code initCls == null}. + */ + public static boolean declaresModificationMethods(Class initCls) { + if (initCls == null) { + return false; + } + + var methods = initCls.getDeclaredMethods(); + + /* + * Instead of using a naming convention for modification methods, use the fact + * that modification methods take an object instance obj as a parameter, where + * initCls is capable of instantiating obj. + */ + for (var met : methods) { + + // A modification method must at least take obj as a parameter to modify it + if (met.getParameterCount() <= 0) + continue; + + // One of the parameters has to have the exact type of obj + // initCls should thus be able to instantiate the type obj + for (var p : met.getParameters()) { + var pType = p.getType(); + if (isInitialiserFor(initCls, pType)) { + return true; + } + } + } + + return false; + } + + /** + * A variant of {@link #declaresModificationMethods(Class)} for + * {@link IInitialiser} instances.
+ *
+ * Uses the type of the given parameter init. + */ + public static boolean declaresModificationMethods(IInitialiser init) { + return init != null && declaresModificationMethods(init.getClass()); + } + + /** + * An initialiser class is assumed to be able to instantiate the class objClass, + * if it has a method (instantiation method), whose return type is objClass and + * which has no parameters. Methods inherited by initCls will also be + * inspected.
+ *
+ * For the result to be true, initCls has to be able to instantiate + * exactly objClass, i.e. the return type of the instantiation + * method has to be exactly objClass.
+ *
+ * Methods that are generated internally by Java (synthetic methods and bridge + * methods) are excluded. + * + * @return True, if initCls is an initialiser type, which is meant to + * instantiate objects of class objClass (sub-types of objClass do not + * count). + */ + public static boolean isInitialiserFor(Class initCls, Class objClass) { + if (initCls == null || objClass == null) { + return false; + } + + /* + * Count inherited methods as well, in order to allow initialisers to be + * extended without having to explicitly declare/override their instantiation + * method. + */ + var methods = initCls.getMethods(); + + for (var m : methods) { + /* + * Instead of using name checks or annotations, use the fact that the + * instantiation method should have the return type objClass and that it should + * take no parameters. + * + * Also, make sure that the inspected methods are not generated internally by + * Java. + */ + if (!m.isBridge() && !m.isSynthetic() && m.getReturnType().equals(objClass) + && m.getParameters().length == 0) { + return true; + } + } + + return false; + } + + /** + * A variant of {@link #isInitialiserFor(Class, Class)}, where initCls is + * extracted from init. Returns false, if any parameter is null. + */ + public static boolean isInitialiserFor(IInitialiser init, Class objClass) { + return init != null && objClass != null && isInitialiserFor(init.getClass(), objClass); + } + + /** + * The dynamic variant of {@link #declaresModificationMethods(Class)}.
+ *
+ * Uses the class of this instance. + */ + public default boolean declaresModificationMethods() { + return declaresModificationMethods(this.getClass()); + } + + /** + * The dynamic variant of {@link #isInitialiserFor(IInitialiser, Class)}.
+ *
+ * Uses this initialiser as the initialiser parameter. + */ + public default boolean isInitialiserFor(Class objClass) { + return objClass != null && isInitialiserFor(this, objClass); + } + + /** + * A helper method for implementors, which provides them with a template for + * versions of their modification methods, which take arrays of parameters + * rather than singular ones, and perform multiple modifications. The purpose of + * this method is to help keep consistency across the said versions of the + * modification methods.
+ *
+ * If modificationFunction returns false for an element x of xs, the method + * will FAIL EARLY and return false. This means, modificationFunction WILL + * NOT be called for the remaining xs once it fails. Because of this, it is + * important to perform modifications one by one, if performing the said + * modifications is expected to fail for some x.
+ *
+ * This method is not intended to be used directly from outside. + * + * @param The type of the object being modified + * @param The parameter passed to the modification function + * (modificationFunction) + * @param obj The object being modified. {@code obj == null} + * will cause null pointer exceptions, if xs has at + * least one element. + * @param xs Array of parameters that will be passed to + * modificationFunction + * @param modificationFunction The modification function that will be run on + * obj, using xs as parameters (one + * modificationFunction call each x in xs) + * + * @return + *
    + *
  • True, if either: + *
      + *
    • xs is null (because no modifications were performed and nothing + * can fail) + *
    • All modification method calls returned true (i.e. all + * modifications were successfully performed) + *
    + *
  • Otherwise false, i.e. if {@code xs != null} and a modification + * method call returned false. + *
+ */ + public default boolean doMultipleModifications(T obj, X[] xs, + BiFunction modificationFunction) { + if (xs != null) { + for (var x : xs) { + if (!modificationFunction.apply(obj, x)) + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java new file mode 100644 index 0000000000..480e88777c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java @@ -0,0 +1,29 @@ +package cipm.consistency.initialisers; + +/** + * An interface for classes and interfaces to implement, which encapsulate + * initialisation logic for complex objects instantiated by + * {@link IInitialiserBase} implementors.
+ *
+ * Although it is ultimately {@link IInitialiser}'s responsibility to + * instantiate and initialise objects, this interface allows extracting parts of + * it, especially the parts that revolve around other {@link IInitialiser}s. By + * extracting that logic from {@link IInitialiser} implementors, dependencies to + * other {@link IInitialiser}s can be spared. + * + * @author Alp Torac Genc + */ +public interface IInitialiserAdapterStrategy { + /** + * Applies the initialisation logic contained in this instance to the given + * object. + * + * @return Whether the method did what it was supposed to do. + */ + public boolean apply(IInitialiser init, Object obj); + + /** + * @return Creates a deep clone of this instance. + */ + public IInitialiserAdapterStrategy newStrategy(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java new file mode 100644 index 0000000000..d7629d4ac5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java @@ -0,0 +1,97 @@ +package cipm.consistency.initialisers; + +import java.util.Collection; + +/** + * An interface meant to be implemented by {@link IInitialiser} implementors, + * which are supposed to be adaptable by {@link IInitialiserAdapterStrategy} + * instances. + * + * @author Alp Torac Genc + */ +public interface IInitialiserBase extends IInitialiser { + /** + * Adds the given {@link IInitialiserAdapterStrategy} to this instance. Does not + * add null, if {@code strat == null}. + */ + public void addAdaptingStrategy(IInitialiserAdapterStrategy strat); + + /** + * Removes the given {@link IInitialiserAdapterStrategy} from this instance. + * Does nothing, if {@code strat == null}. + */ + public void removeAdaptingStrategy(IInitialiserAdapterStrategy strat); + + /** + * Removes all stored {@link IInitialiserAdapterStrategy} instances from this. + */ + public void cleanAdaptingStrategy(); + + /** + * @return All {@link IInitialiserAdapterStrategy} instances added to this. + * Returns an empty collection if there are none. Modifying the elements + * of the collection will modify the adaptation strategies adapting + * this. Modifying the returned collection itself will have no effect on + * this. + */ + public Collection getAdaptingStrategies(); + + /** + * The variant of {@link #addAdaptingStrategy(IInitialiserAdapterStrategy)} for + * arrays. Does nothing if {@code strats == null}. + */ + public default void addAdaptingStrategies(IInitialiserAdapterStrategy[] strats) { + if (strats != null) { + for (var i : strats) { + this.addAdaptingStrategy(i); + } + } + } + + /** + * @return Number of {@link IInitialiserAdapterStrategy} instances that are + * currently adapting this. + */ + public default int getAdaptingStrategyCount() { + return this.getAdaptingStrategies().size(); + } + + /** + * @return Whether any {@link IInitialiserAdapterStrategy} instances are + * currently adapting this. + */ + public default boolean isAdapted() { + return !this.getAdaptingStrategies().isEmpty(); + } + + /** + * For the sake of clarity, only use this method, if adaptation strategies + * are meant to be used.
+ *
+ * {@inheritDoc} + */ + @Override + public default boolean initialise(Object obj) { + boolean result = true; + + for (var strat : this.getAdaptingStrategies()) { + result = result && strat.apply(this, obj); + } + + return result; + } + + /** + * @return A new instance of this {@link IInitialiserBase} along with clones of + * adaptation strategies currently adapting it. + */ + public default IInitialiserBase newInitialiserWithStrategies() { + var newInit = (IInitialiserBase) this.newInitialiser(); + + // Create a new strategy for the new initialiser, so that neither the original + // strategy nor its copy are modified by the other one. + this.getAdaptingStrategies().forEach((s) -> newInit.addAdaptingStrategy(s.newStrategy())); + + return newInit; + } +} \ No newline at end of file From c381689a1d527306132779f0bd36c55dccab2398 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:13:23 +0200 Subject: [PATCH 03/87] Implement abstract class for adaptable initialisers The abstract class encapsulates the logic behind storing adaptation strategies for initialisers --- .../initialisers/AbstractInitialiserBase.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/AbstractInitialiserBase.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/AbstractInitialiserBase.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/AbstractInitialiserBase.java new file mode 100644 index 0000000000..c631057bc5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/AbstractInitialiserBase.java @@ -0,0 +1,69 @@ +package cipm.consistency.initialisers; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * An abstract class for {@link IInitialiserBase} implementors, which extends + * them with infrastructure and concrete methods for + * {@link IInitialiserAdapterStrategy}. + * + * @author Alp Torac Genc + */ +public abstract class AbstractInitialiserBase implements IInitialiserBase { + /** + * Stores the added {@link IInitialiserAdapterStrategy} instances. + */ + private Collection adaptingStrats; + + /** + * A variant of {@link #AbstractInitialiserBase(IInitialiserAdapterStrategy[])} + * that takes no {@link IInitialiserAdapterStrategy} instances. + */ + public AbstractInitialiserBase() { + this(null); + } + + /** + * Constructs an instance, which is adapted by the passed + * {@link IInitialiserAdapterStrategy} array. + */ + public AbstractInitialiserBase(IInitialiserAdapterStrategy[] adaptingStrats) { + this.adaptingStrats = this.createAdaptingStrategyCol(); + this.addAdaptingStrategies(adaptingStrats); + } + + /** + * @return A collection to store the added {@link IInitialiserAdapterStrategy} + * instances. Only creates and returns a collection instance, it still + * has to be assigned to relevant attributes and undergo additional + * setup steps (if any). + */ + protected Collection createAdaptingStrategyCol() { + return new ArrayList(); + } + + @Override + public void addAdaptingStrategy(IInitialiserAdapterStrategy strat) { + if (strat != null) + this.adaptingStrats.add(strat); + } + + @Override + public void removeAdaptingStrategy(IInitialiserAdapterStrategy strat) { + if (strat != null) + this.adaptingStrats.remove(strat); + } + + @Override + public void cleanAdaptingStrategy() { + this.adaptingStrats.clear(); + } + + @Override + public Collection getAdaptingStrategies() { + var res = this.createAdaptingStrategyCol(); + res.addAll(this.adaptingStrats); + return res; + } +} From a78aa9134b64b7871e8d30e11ab17f9d8c85c6ae Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:17:57 +0200 Subject: [PATCH 04/87] Implement an interface for initialiser discovery Initialiser packages (IInitialiserPackage implementors) can be used to grant centralised access to related groups of initialisers. They mimic org.emftext.language.java.JavaPackage and allow package-based access to initialisers. The content of initialiser packages is to be defined by overriding certain methods (refer to the documentation within the IInitialiserPackage interface). --- .../initialisers/IInitialiserPackage.java | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java new file mode 100644 index 0000000000..9d1d64c5fd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java @@ -0,0 +1,168 @@ +package cipm.consistency.initialisers; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * An interface meant to be implemented by classes that provide access to groups + * of instances, classes and interfaces that implement {@link IInitialiser}. Can + * be used to discover which initialisers are present and to allow centralised + * access to initialisers.
+ *
+ * Override {@link #getInitialiserInstances()}, + * {@link #getInitialiserInterfaceTypes()} and {@link #getSubPackages()} to + * change what the implementors encompass. The default implementations of the + * methods only return an empty collection of their respective return type. + * + * @author Alp Torac Genc + */ +public interface IInitialiserPackage { + /** + * @return {@link IInitialiser} instances that are contained in this instance. + * + * @see {@link #getAllInitialiserInstances()} for all such initialisers that are + * accessible from this. + */ + public default Collection getInitialiserInstances() { + return this.initCol(); + } + + /** + * @return Class objects of {@link IInitialiser} types that are contained in + * this instance. + * + * @see {@link #getAllInitialiserInterfaceTypes()} for all such initialiser + * types that are accessible from this. + */ + public default Collection> getInitialiserInterfaceTypes() { + return this.initCol(); + } + + /** + * @return All {@link IInitialiserPackage} instances nested in this. + */ + public default Collection getSubPackages() { + return this.initCol(); + } + + /** + * @return An empty collection that will be used to store objects of type T. + */ + public default Collection initCol() { + return new ArrayList(); + } + + /** + * A variant of {@link #initCol()} that also adds the given elems to the created + * collection. + * + * @return A collection containing elems. + */ + public default Collection initCol(T[] elems) { + Collection res = this.initCol(); + + for (var e : elems) { + res.add(e); + } + + return res; + } + + /** + * Recursively discovers all nested {@link IInitialiserPackage} instances + * reachable from this instance. + * + * @return All {@link IInitialiserPackage} instances accessible from this. + * + * @see {@link #getSubPackages()} for initialiser packages that are contained in + * this. + */ + public default Collection getAllSubPackages() { + var result = this.getSubPackages(); + + for (var pac : this.getSubPackages()) { + result.addAll(pac.getSubPackages()); + } + + return result; + } + + /** + * Recursively discovers all nested {@link IInitialiserPackage} instances + * reachable from this instance. + * + * @return All {@link IInitialiser} instances accessible from this. + * + * @see {@link #getInitialiserInstances()} for initialiser instances that are + * contained in this. + */ + public default Collection getAllInitialiserInstances() { + var result = this.getInitialiserInstances(); + + for (var pac : this.getAllSubPackages()) { + result.addAll(pac.getInitialiserInstances()); + } + + return result; + } + + /** + * Recursively discovers all nested {@link IInitialiserPackage} instances + * reachable from this instance. + * + * @return All initialiser types that are accessible from this. + * + * @see {@link #getInitialiserInterfaceTypes()} for initialiser types that are + * contained in this. + */ + public default Collection> getAllInitialiserInterfaceTypes() { + var result = this.getInitialiserInterfaceTypes(); + + for (var pac : this.getAllSubPackages()) { + result.addAll(pac.getInitialiserInterfaceTypes()); + } + + return result; + } + + /** + * Recursively looks through all nested {@link IInitialiserPackage} instances + * for an {@link IInitialiser} type, which is capable of instantiating the given + * cls. + * + * @return The class object of the {@link IInitialiser} type meant to + * instantiate the given cls. Null, if there is no such + * {@link IInitialiser} reachable from this. + */ + public default Class getInitialiserInterfaceTypeFor(Class cls) { + var initClss = this.getAllInitialiserInterfaceTypes(); + + for (var initCls : initClss) { + if (IInitialiser.isInitialiserFor(initCls, cls)) { + return initCls; + } + } + + return null; + } + + /** + * Recursively looks for an {@link IInitialiser} instance, which is capable of + * instantiating the given cls. + * + * @return An instance of the {@link IInitialiser} that is meant to instantiate + * cls. Null, if there is no such {@link IInitialiser} reachable from + * this. + */ + public default IInitialiser getInitialiserInstanceFor(Class cls) { + var init = this.getAllInitialiserInstances(); + + for (var i : init) { + if (i.isInitialiserFor(cls)) { + return i; + } + } + + return null; + } +} From ddce2482c74f9ca531c9e6afed9bfeee2bcaed4b Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:18:40 +0200 Subject: [PATCH 05/87] Add package commentary for top-level interfaces --- .../initialisers/package-info.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java new file mode 100644 index 0000000000..5dadf2e394 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java @@ -0,0 +1,31 @@ +/** + * Contains interfaces for initialiser implementations (such as + * {@link cipm.consistency.initialisers.IInitialiser} as well as for classes + * that can be used to adapt them. Also has an interface + * {@link cipm.consistency.initialisers.IInitialiserPackage}, which can be + * implemented to access initialiser types and instances easier.
+ *
+ * Initialisers are classes/interfaces, whose purpose is to instantiate, + * initialise and modify certain objects. Implementing initialisers similar to + * their designated objects, may help making the initialisers more flexible and + * can ease adding further initialisers later on. It is strongly recommended to + * define atomic modification methods in initialisers and re-using them, rather + * than defining complex modification methods.
+ *
+ * In order to make parameterised tests using initialisers as parameters + * possible, one can use + * {@link cipm.consistency.initialisers.IInitialiserAdapterStrategy} to adapt + * certain initialisers. This way, they can be used in such tests without + * throwing exceptions and without the need of type checking. The most common + * cause of such exceptions is initialisers not setting the required attributes + * while instantiating objects. In such cases, the said adapters can be used to + * have them set those attributes, so that using the instances in tests do not + * throw exceptions, due to their essential attributes not being set.
+ *
+ * {@link cipm.consistency.initialisers.IInitialiserPackage} defines a nestable + * structure that enables finding the proper initialisers as well as certain + * groups of initialisers. It is recommended to implement that interface for + * each package containing initialisers and to add all initialisers to that + * implementation. + */ +package cipm.consistency.initialisers; \ No newline at end of file From 850a5088b805e6abe0405cc9f036ac0b12839bd2 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:21:47 +0200 Subject: [PATCH 06/87] Implement an interface to extend IInitialiser for EObject --- .../eobject/IEObjectInitialiser.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java new file mode 100644 index 0000000000..50bfb2c59c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java @@ -0,0 +1,29 @@ +package cipm.consistency.initialisers.eobject; + +import org.eclipse.emf.ecore.EObject; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; + +/** + * An interface for {@link IInitialiser} sub-types, whose purpose is to create + * and modify {@link EObject} instances. + * + * @author Alp Torac Genc + */ +public interface IEObjectInitialiser extends IInitialiser { + /** + * {@inheritDoc}
+ *
+ * Note: The created instance may not be "valid" due to certain attributes + * not being set. Using proper {@link IInitialiserAdapter} instances on + * implementors can circumvent potential issues. + * + * @see {@link IInitialiserAdapter}, {@link IInitialiserAdapterStrategy} + */ + @Override + public EObject instantiate(); + + @Override + public IEObjectInitialiser newInitialiser(); +} From ff64132693fa1c5d059154dd935ea231f0daf536 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:26:27 +0200 Subject: [PATCH 07/87] Add package commentary --- .../cipm/consistency/initialisers/eobject/package-info.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/package-info.java new file mode 100644 index 0000000000..fff1daa7f3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains the means to extend {@link IInitialiser} for {@link EObject} + * implementors. + */ +package cipm.consistency.initialisers.eobject; \ No newline at end of file From 2b8042d0afd376d1b0330724d1661503d9b85382 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:30:29 +0200 Subject: [PATCH 08/87] Implement an interface to adapt IEObjectInitialiser for Java-related classes (all of them extend EObject) used by JaMoPP. The main purpose of this interface is to make it easier to declare methods for the said classes. This interface can also be used to filter JaMoPP-related initialisers from EObject initialisers, if initialisers for other EObject utilising techologies are implemented in the future. --- .../jamopp/IJaMoPPEObjectInitialiser.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPEObjectInitialiser.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPEObjectInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPEObjectInitialiser.java new file mode 100644 index 0000000000..567d02c076 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPEObjectInitialiser.java @@ -0,0 +1,15 @@ +package cipm.consistency.initialisers.jamopp; + +import cipm.consistency.initialisers.eobject.IEObjectInitialiser; + +/** + * An interface meant to be implemented by {@link IEObjectInitialiser} + * sub-types, whose purpose is to create {@link EObject} implementors within + * JaMoPP. + * + * @author Alp Torac Genc + */ +public interface IJaMoPPEObjectInitialiser extends IEObjectInitialiser { + @Override + public IJaMoPPEObjectInitialiser newInitialiser(); +} From daaeca5a06e92108fc32c264304e760ec64408b3 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:33:23 +0200 Subject: [PATCH 09/87] Implement initialiser package for org.emftext.language.java.commons --- .../commons/CommonsInitialiserPackage.java | 15 ++++++ .../commons/ICommentableInitialiser.java | 11 +++++ .../commons/INamedElementInitialiser.java | 49 +++++++++++++++++++ .../INamespaceAwareElementInitialiser.java | 20 ++++++++ .../jamopp/commons/package-info.java | 5 ++ 5 files changed, 100 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/CommonsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/ICommentableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamedElementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamespaceAwareElementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/CommonsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/CommonsInitialiserPackage.java new file mode 100644 index 0000000000..f8c470efe3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/CommonsInitialiserPackage.java @@ -0,0 +1,15 @@ +package cipm.consistency.initialisers.jamopp.commons; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class CommonsInitialiserPackage implements IInitialiserPackage { + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { ICommentableInitialiser.class, INamedElementInitialiser.class, + INamespaceAwareElementInitialiser.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/ICommentableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/ICommentableInitialiser.java new file mode 100644 index 0000000000..4a7aabc787 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/ICommentableInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.commons; + +import org.emftext.language.java.commons.Commentable; + +import cipm.consistency.initialisers.jamopp.IJaMoPPEObjectInitialiser; + +public interface ICommentableInitialiser extends IJaMoPPEObjectInitialiser { + @Override + public Commentable instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamedElementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamedElementInitialiser.java new file mode 100644 index 0000000000..ea1de18495 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamedElementInitialiser.java @@ -0,0 +1,49 @@ +package cipm.consistency.initialisers.jamopp.commons; + +import org.emftext.language.java.commons.NamedElement; + +/** + * An interface meant to be implemented by initialisers, which are meant to + * create {@link NamedElement} instances.
+ *
+ * Since some {@link NamedElement} implementations' name attribute cannot be + * modified as expected, {@link #canSetName(NamedElement)} can be used to + * determine the modifiability of the name attribute in implementors. + * + * @author Alp Torac Genc + */ +public interface INamedElementInitialiser extends ICommentableInitialiser { + @Override + public NamedElement instantiate(); + + /** + * Sets the name attribute of the given element to the given name, if its name + * can be set.
+ *
+ * Note: If {@code name == null}, the return value will be true, regardless of + * the name attribute being modifiable. + * + * @see {@link #canSetName(NamedElement)} + */ + public default boolean setName(NamedElement ne, String name) { + if (!this.canSetName(ne)) { + return false; + } + ne.setName(name); + return (name == null && ne.getName() == null) || ne.getName().equals(name); + } + + /** + * Extracted from {@link #setName(NamedElement, String)} because there are + * implementors, whose name cannot be modified via + * {@link #setName(NamedElement, String)}. This way, such implementors can + * override this method to indicate, whether their name attribute can be + * modified. + * + * @return Whether {@link #setName(NamedElement, String)} can be used to modify + * the given {@link NamedElement} instance ne. + */ + public default boolean canSetName(NamedElement ne) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamespaceAwareElementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamespaceAwareElementInitialiser.java new file mode 100644 index 0000000000..bb739cddf0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/INamespaceAwareElementInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.commons; + +import org.emftext.language.java.commons.NamespaceAwareElement; + +public interface INamespaceAwareElementInitialiser extends ICommentableInitialiser { + @Override + public NamespaceAwareElement instantiate(); + + public default boolean addNamespaces(NamespaceAwareElement nae, String[] namespaces) { + return this.doMultipleModifications(nae, namespaces, this::addNamespace); + } + + public default boolean addNamespace(NamespaceAwareElement nae, String namespace) { + if (namespace != null) { + nae.getNamespaces().add(namespace); + return nae.getNamespaces().contains(namespace); + } + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/package-info.java new file mode 100644 index 0000000000..18bb567649 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/commons/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.commons}. + */ +package cipm.consistency.initialisers.jamopp.commons; \ No newline at end of file From 47f8f8f4f1ca3f2e5d6adf96d85ca2ecf3765093 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:36:26 +0200 Subject: [PATCH 10/87] Implement initialiser package for org.emftext.language.java.annotations --- ...AnnotationAttributeSettingInitialiser.java | 19 +++++++++++++++ .../AnnotationInstanceInitialiser.java | 20 ++++++++++++++++ .../AnnotationParameterListInitialiser.java | 20 ++++++++++++++++ .../AnnotationsInitialiserPackage.java | 24 +++++++++++++++++++ .../annotations/IAnnotableInitialiser.java | 24 +++++++++++++++++++ ...AnnotationAttributeSettingInitialiser.java | 22 +++++++++++++++++ .../IAnnotationInstanceInitialiser.java | 22 +++++++++++++++++ .../IAnnotationParameterInitialiser.java | 11 +++++++++ .../IAnnotationParameterListInitialiser.java | 21 ++++++++++++++++ .../IAnnotationValueInitialiser.java | 11 +++++++++ ...ISingleAnnotationParameterInitialiser.java | 14 +++++++++++ .../SingleAnnotationParameterInitialiser.java | 19 +++++++++++++++ .../jamopp/annotations/package-info.java | 5 ++++ 13 files changed, 232 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationAttributeSettingInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationInstanceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationParameterListInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationAttributeSettingInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationInstanceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterListInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationValueInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/ISingleAnnotationParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/SingleAnnotationParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationAttributeSettingInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationAttributeSettingInitialiser.java new file mode 100644 index 0000000000..25793b9fb5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationAttributeSettingInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationAttributeSetting; +import org.emftext.language.java.annotations.AnnotationsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AnnotationAttributeSettingInitialiser extends AbstractInitialiserBase + implements IAnnotationAttributeSettingInitialiser { + @Override + public IAnnotationAttributeSettingInitialiser newInitialiser() { + return new AnnotationAttributeSettingInitialiser(); + } + + @Override + public AnnotationAttributeSetting instantiate() { + return AnnotationsFactory.eINSTANCE.createAnnotationAttributeSetting(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationInstanceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationInstanceInitialiser.java new file mode 100644 index 0000000000..1aa1eca795 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationInstanceInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.annotations.AnnotationInstance; + +public class AnnotationInstanceInitialiser extends AbstractInitialiserBase implements IAnnotationInstanceInitialiser { + @Override + public AnnotationInstance instantiate() { + var fac = AnnotationsFactory.eINSTANCE; + return fac.createAnnotationInstance(); + } + + @Override + public IAnnotationInstanceInitialiser newInitialiser() { + return new AnnotationInstanceInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationParameterListInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationParameterListInitialiser.java new file mode 100644 index 0000000000..0c5197ef9a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationParameterListInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.annotations.AnnotationParameterList; + +public class AnnotationParameterListInitialiser extends AbstractInitialiserBase + implements IAnnotationParameterListInitialiser { + @Override + public IAnnotationParameterListInitialiser newInitialiser() { + return new AnnotationParameterListInitialiser(); + } + + @Override + public AnnotationParameterList instantiate() { + return AnnotationsFactory.eINSTANCE.createAnnotationParameterList(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationsInitialiserPackage.java new file mode 100644 index 0000000000..52d37e8eb2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/AnnotationsInitialiserPackage.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class AnnotationsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol( + new IInitialiser[] { new AnnotationAttributeSettingInitialiser(), new AnnotationInstanceInitialiser(), + new AnnotationParameterListInitialiser(), new SingleAnnotationParameterInitialiser() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAnnotableInitialiser.class, IAnnotationAttributeSettingInitialiser.class, + IAnnotationInstanceInitialiser.class, IAnnotationParameterInitialiser.class, + IAnnotationParameterListInitialiser.class, IAnnotationValueInitialiser.class, + ISingleAnnotationParameterInitialiser.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotableInitialiser.java new file mode 100644 index 0000000000..8aa528e96d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotableInitialiser.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.Annotable; +import org.emftext.language.java.annotations.AnnotationInstance; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IAnnotableInitialiser extends ICommentableInitialiser { + @Override + public Annotable instantiate(); + + public default boolean addAnnotation(Annotable aObj, AnnotationInstance anno) { + if (anno != null) { + aObj.getAnnotations().add(anno); + return aObj.getAnnotations().contains(anno); + } + + return true; + } + + public default boolean addAnnotations(Annotable aObj, AnnotationInstance[] annos) { + return this.doMultipleModifications(aObj, annos, this::addAnnotation); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationAttributeSettingInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationAttributeSettingInitialiser.java new file mode 100644 index 0000000000..9d44645a05 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationAttributeSettingInitialiser.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationAttributeSetting; +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.members.InterfaceMethod; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IAnnotationAttributeSettingInitialiser extends ICommentableInitialiser { + @Override + public AnnotationAttributeSetting instantiate(); + + public default boolean setAttribute(AnnotationAttributeSetting aas, InterfaceMethod attr) { + aas.setAttribute(attr); + return (attr == null && aas.getAttribute() == null) || aas.getAttribute().equals(attr); + } + + public default boolean setValue(AnnotationAttributeSetting aas, AnnotationValue val) { + aas.setValue(val); + return (val == null && aas.getValue() == null) || aas.getValue().equals(val); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationInstanceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationInstanceInitialiser.java new file mode 100644 index 0000000000..bcd71e1e69 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationInstanceInitialiser.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationInstance; +import org.emftext.language.java.annotations.AnnotationParameter; +import org.emftext.language.java.classifiers.Classifier; + +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; + +public interface IAnnotationInstanceInitialiser extends INamespaceAwareElementInitialiser { + @Override + public AnnotationInstance instantiate(); + + public default boolean setAnnotation(AnnotationInstance ai, Classifier anno) { + ai.setAnnotation(anno); + return (anno == null && ai.getAnnotation() == null) || ai.getAnnotation().equals(anno); + } + + public default boolean setParameter(AnnotationInstance ai, AnnotationParameter param) { + ai.setParameter(param); + return (param == null && ai.getParameter() == null) || ai.getParameter().equals(param); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterInitialiser.java new file mode 100644 index 0000000000..fcc8df3021 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationParameter; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IAnnotationParameterInitialiser extends ICommentableInitialiser { + @Override + public AnnotationParameter instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterListInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterListInitialiser.java new file mode 100644 index 0000000000..98f57efb0d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationParameterListInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationAttributeSetting; +import org.emftext.language.java.annotations.AnnotationParameterList; + +public interface IAnnotationParameterListInitialiser extends IAnnotationParameterInitialiser { + @Override + public AnnotationParameterList instantiate(); + + public default boolean addSetting(AnnotationParameterList apl, AnnotationAttributeSetting setting) { + if (setting != null) { + apl.getSettings().add(setting); + return apl.getSettings().contains(setting); + } + return true; + } + + public default boolean addSettings(AnnotationParameterList apl, AnnotationAttributeSetting[] settings) { + return this.doMultipleModifications(apl, settings, this::addSetting); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationValueInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationValueInitialiser.java new file mode 100644 index 0000000000..a7816d9346 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/IAnnotationValueInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationValue; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IAnnotationValueInitialiser extends ICommentableInitialiser { + @Override + public AnnotationValue instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/ISingleAnnotationParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/ISingleAnnotationParameterInitialiser.java new file mode 100644 index 0000000000..6c2ddf03e2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/ISingleAnnotationParameterInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.annotations.SingleAnnotationParameter; + +public interface ISingleAnnotationParameterInitialiser extends IAnnotationParameterInitialiser { + @Override + public SingleAnnotationParameter instantiate(); + + public default boolean setValue(SingleAnnotationParameter sap, AnnotationValue val) { + sap.setValue(val); + return (val == null && sap.getValue() == null) || sap.getValue().equals(val); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/SingleAnnotationParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/SingleAnnotationParameterInitialiser.java new file mode 100644 index 0000000000..185f00118a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/SingleAnnotationParameterInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.annotations; + +import org.emftext.language.java.annotations.AnnotationsFactory; +import org.emftext.language.java.annotations.SingleAnnotationParameter; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SingleAnnotationParameterInitialiser extends AbstractInitialiserBase + implements ISingleAnnotationParameterInitialiser { + @Override + public ISingleAnnotationParameterInitialiser newInitialiser() { + return new SingleAnnotationParameterInitialiser(); + } + + @Override + public SingleAnnotationParameter instantiate() { + return AnnotationsFactory.eINSTANCE.createSingleAnnotationParameter(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/package-info.java new file mode 100644 index 0000000000..5796ca11e9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/annotations/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.annotations}. + */ +package cipm.consistency.initialisers.jamopp.annotations; \ No newline at end of file From a1d7836bcd56b3d55848adf7d780b8549111e034 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:45:41 +0200 Subject: [PATCH 11/87] Implement initialiser package for org.emftext.language.java.imports --- .../imports/ClassifierImportInitialiser.java | 18 +++++++++++++++ .../imports/IClassifierImportInitialiser.java | 9 ++++++++ .../jamopp/imports/IImportInitialiser.java | 16 +++++++++++++ .../imports/IImportingElementInitialiser.java | 23 +++++++++++++++++++ .../imports/IPackageImportInitialiser.java | 9 ++++++++ .../IStaticClassifierImportInitialiser.java | 8 +++++++ .../imports/IStaticImportInitialiser.java | 14 +++++++++++ .../IStaticMemberImportInitialiser.java | 21 +++++++++++++++++ .../imports/ImportsInitialiserPackage.java | 22 ++++++++++++++++++ .../imports/PackageImportInitialiser.java | 18 +++++++++++++++ .../StaticClassifierImportInitialiser.java | 19 +++++++++++++++ .../StaticMemberImportInitialiser.java | 18 +++++++++++++++ .../jamopp/imports/package-info.java | 5 ++++ 13 files changed, 200 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ClassifierImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IClassifierImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportingElementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IPackageImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticClassifierImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticMemberImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ImportsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/PackageImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticClassifierImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticMemberImportInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ClassifierImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ClassifierImportInitialiser.java new file mode 100644 index 0000000000..b50a83041b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ClassifierImportInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.ClassifierImport; +import org.emftext.language.java.imports.ImportsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ClassifierImportInitialiser extends AbstractInitialiserBase implements IClassifierImportInitialiser { + @Override + public IClassifierImportInitialiser newInitialiser() { + return new ClassifierImportInitialiser(); + } + + @Override + public ClassifierImport instantiate() { + return ImportsFactory.eINSTANCE.createClassifierImport(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IClassifierImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IClassifierImportInitialiser.java new file mode 100644 index 0000000000..d340c1d59e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IClassifierImportInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.ClassifierImport; + +public interface IClassifierImportInitialiser extends IImportInitialiser { + @Override + public ClassifierImport instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportInitialiser.java new file mode 100644 index 0000000000..96599398cb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.imports.Import; + +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; + +public interface IImportInitialiser extends INamespaceAwareElementInitialiser { + @Override + public Import instantiate(); + + public default boolean setClassifier(Import imp, ConcreteClassifier cls) { + imp.setClassifier(cls); + return (cls == null && imp.getClassifier() == null) || imp.getClassifier().equals(cls); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportingElementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportingElementInitialiser.java new file mode 100644 index 0000000000..d697652b01 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IImportingElementInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.Import; +import org.emftext.language.java.imports.ImportingElement; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IImportingElementInitialiser extends ICommentableInitialiser { + @Override + public ImportingElement instantiate(); + + public default boolean addImport(ImportingElement ie, Import imp) { + if (imp != null) { + ie.getImports().add(imp); + return ie.getImports().contains(imp); + } + return true; + } + + public default boolean addImports(ImportingElement ie, Import[] imps) { + return this.doMultipleModifications(ie, imps, this::addImport); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IPackageImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IPackageImportInitialiser.java new file mode 100644 index 0000000000..fe4e5b6a4f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IPackageImportInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.PackageImport; + +public interface IPackageImportInitialiser extends IImportInitialiser { + @Override + public PackageImport instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticClassifierImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticClassifierImportInitialiser.java new file mode 100644 index 0000000000..c5a95ed255 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticClassifierImportInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.StaticClassifierImport; + +public interface IStaticClassifierImportInitialiser extends IStaticImportInitialiser { + @Override + public StaticClassifierImport instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticImportInitialiser.java new file mode 100644 index 0000000000..23db2c82d7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticImportInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.StaticImport; +import org.emftext.language.java.modifiers.Static; + +public interface IStaticImportInitialiser extends IImportInitialiser { + @Override + public StaticImport instantiate(); + + public default boolean setStatic(StaticImport sImp, Static st) { + sImp.setStatic(st); + return (st == null && sImp.getStatic() == null) || sImp.getStatic().equals(st); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticMemberImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticMemberImportInitialiser.java new file mode 100644 index 0000000000..79c1552ecc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/IStaticMemberImportInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.StaticMemberImport; +import org.emftext.language.java.references.ReferenceableElement; + +public interface IStaticMemberImportInitialiser extends IStaticImportInitialiser { + @Override + public StaticMemberImport instantiate(); + + public default boolean addStaticMember(StaticMemberImport smi, ReferenceableElement staticMem) { + if (staticMem != null) { + smi.getStaticMembers().add(staticMem); + return smi.getStaticMembers().contains(staticMem); + } + return true; + } + + public default boolean addStaticMembers(StaticMemberImport smi, ReferenceableElement[] staticMems) { + return this.doMultipleModifications(smi, staticMems, this::addStaticMember); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ImportsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ImportsInitialiserPackage.java new file mode 100644 index 0000000000..c40c859db8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/ImportsInitialiserPackage.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ImportsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new ClassifierImportInitialiser(), new PackageImportInitialiser(), + new StaticClassifierImportInitialiser(), new StaticMemberImportInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IClassifierImportInitialiser.class, IImportingElementInitialiser.class, + IImportInitialiser.class, IPackageImportInitialiser.class, IStaticClassifierImportInitialiser.class, + IStaticImportInitialiser.class, IStaticMemberImportInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/PackageImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/PackageImportInitialiser.java new file mode 100644 index 0000000000..7ede42f682 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/PackageImportInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.ImportsFactory; +import org.emftext.language.java.imports.PackageImport; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PackageImportInitialiser extends AbstractInitialiserBase implements IPackageImportInitialiser { + @Override + public IPackageImportInitialiser newInitialiser() { + return new PackageImportInitialiser(); + } + + @Override + public PackageImport instantiate() { + return ImportsFactory.eINSTANCE.createPackageImport(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticClassifierImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticClassifierImportInitialiser.java new file mode 100644 index 0000000000..f6fde342c4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticClassifierImportInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.ImportsFactory; +import org.emftext.language.java.imports.StaticClassifierImport; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class StaticClassifierImportInitialiser extends AbstractInitialiserBase + implements IStaticClassifierImportInitialiser { + @Override + public IStaticClassifierImportInitialiser newInitialiser() { + return new StaticClassifierImportInitialiser(); + } + + @Override + public StaticClassifierImport instantiate() { + return ImportsFactory.eINSTANCE.createStaticClassifierImport(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticMemberImportInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticMemberImportInitialiser.java new file mode 100644 index 0000000000..4fb7c7ef7a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/StaticMemberImportInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.imports; + +import org.emftext.language.java.imports.ImportsFactory; +import org.emftext.language.java.imports.StaticMemberImport; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class StaticMemberImportInitialiser extends AbstractInitialiserBase implements IStaticMemberImportInitialiser { + @Override + public IStaticMemberImportInitialiser newInitialiser() { + return new StaticMemberImportInitialiser(); + } + + @Override + public StaticMemberImport instantiate() { + return ImportsFactory.eINSTANCE.createStaticMemberImport(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/package-info.java new file mode 100644 index 0000000000..d8e4cf29c0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/imports/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.imports}. + */ +package cipm.consistency.initialisers.jamopp.imports; \ No newline at end of file From f40ad6d8ffeedcea981735f026694bb897c33a9e Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:49:38 +0200 Subject: [PATCH 12/87] Implement initialiser package for org.emftext.language.java.modifiers --- .../jamopp/modifiers/AbstractInitialiser.java | 18 +++++++ .../jamopp/modifiers/DefaultInitialiser.java | 18 +++++++ .../jamopp/modifiers/FinalInitialiser.java | 18 +++++++ .../modifiers/IAbstractInitialiser.java | 9 ++++ .../IAnnotableAndModifiableInitialiser.java | 53 +++++++++++++++++++ ...notationInstanceOrModifierInitialiser.java | 11 ++++ .../jamopp/modifiers/IDefaultInitialiser.java | 9 ++++ .../jamopp/modifiers/IFinalInitialiser.java | 9 ++++ .../modifiers/IModifiableInitialiser.java | 23 ++++++++ .../modifiers/IModifierInitialiser.java | 9 ++++ .../IModuleRequiresModifierInitialiser.java | 11 ++++ .../jamopp/modifiers/INativeInitialiser.java | 9 ++++ .../jamopp/modifiers/IOpenInitialiser.java | 11 ++++ .../jamopp/modifiers/IPrivateInitialiser.java | 9 ++++ .../modifiers/IProtectedInitialiser.java | 9 ++++ .../jamopp/modifiers/IPublicInitialiser.java | 9 ++++ .../jamopp/modifiers/IStaticInitialiser.java | 8 +++ .../modifiers/IStrictfpInitialiser.java | 9 ++++ .../modifiers/ISynchronizedInitialiser.java | 9 ++++ .../modifiers/ITransientInitialiser.java | 9 ++++ .../modifiers/ITransitiveInitialiser.java | 9 ++++ .../modifiers/IVolatileInitialiser.java | 9 ++++ .../ModifiersInitialiserPackage.java | 29 ++++++++++ .../jamopp/modifiers/NativeInitialiser.java | 18 +++++++ .../jamopp/modifiers/OpenInitialiser.java | 18 +++++++ .../jamopp/modifiers/PrivateInitialiser.java | 18 +++++++ .../modifiers/ProtectedInitialiser.java | 18 +++++++ .../jamopp/modifiers/PublicInitialiser.java | 18 +++++++ .../jamopp/modifiers/StaticInitialiser.java | 18 +++++++ .../jamopp/modifiers/StrictfpInitialiser.java | 18 +++++++ .../modifiers/SynchronizedInitialiser.java | 18 +++++++ .../modifiers/TransientInitialiser.java | 18 +++++++ .../modifiers/TransitiveInitialiser.java | 18 +++++++ .../jamopp/modifiers/VolatileInitialiser.java | 18 +++++++ .../jamopp/modifiers/package-info.java | 5 ++ 35 files changed, 520 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/AbstractInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/DefaultInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/FinalInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAbstractInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotableAndModifiableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotationInstanceOrModifierInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IDefaultInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IFinalInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifiableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifierInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModuleRequiresModifierInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/INativeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IOpenInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPrivateInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IProtectedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPublicInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStaticInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStrictfpInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ISynchronizedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransientInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransitiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IVolatileInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ModifiersInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/NativeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/OpenInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PrivateInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ProtectedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PublicInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StaticInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StrictfpInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/SynchronizedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransientInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransitiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/VolatileInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/AbstractInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/AbstractInitialiser.java new file mode 100644 index 0000000000..a6f4ecab5b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/AbstractInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Abstract; +import org.emftext.language.java.modifiers.ModifiersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AbstractInitialiser extends AbstractInitialiserBase implements IAbstractInitialiser { + @Override + public IAbstractInitialiser newInitialiser() { + return new AbstractInitialiser(); + } + + @Override + public Abstract instantiate() { + return ModifiersFactory.eINSTANCE.createAbstract(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/DefaultInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/DefaultInitialiser.java new file mode 100644 index 0000000000..66df255205 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/DefaultInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Default; +import org.emftext.language.java.modifiers.ModifiersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DefaultInitialiser extends AbstractInitialiserBase implements IDefaultInitialiser { + @Override + public IDefaultInitialiser newInitialiser() { + return new DefaultInitialiser(); + } + + @Override + public Default instantiate() { + return ModifiersFactory.eINSTANCE.createDefault(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/FinalInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/FinalInitialiser.java new file mode 100644 index 0000000000..3a383d5d44 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/FinalInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Final; +import org.emftext.language.java.modifiers.ModifiersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class FinalInitialiser extends AbstractInitialiserBase implements IFinalInitialiser { + @Override + public IFinalInitialiser newInitialiser() { + return new FinalInitialiser(); + } + + @Override + public Final instantiate() { + return ModifiersFactory.eINSTANCE.createFinal(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAbstractInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAbstractInitialiser.java new file mode 100644 index 0000000000..09877b9896 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAbstractInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Abstract; + +public interface IAbstractInitialiser extends IModifierInitialiser { + @Override + public Abstract instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotableAndModifiableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotableAndModifiableInitialiser.java new file mode 100644 index 0000000000..e9fee2ccbc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotableAndModifiableInitialiser.java @@ -0,0 +1,53 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.annotations.AnnotationInstance; +import org.emftext.language.java.modifiers.AnnotableAndModifiable; +import org.emftext.language.java.modifiers.Modifier; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IAnnotableAndModifiableInitialiser extends ICommentableInitialiser { + @Override + public AnnotableAndModifiable instantiate(); + + public default boolean addModifier(AnnotableAndModifiable aam, Modifier modif) { + if (modif != null) { + aam.addModifier(modif); + return aam.getAnnotationsAndModifiers().contains(modif) && aam.hasModifier(modif.getClass()) + && aam.getModifiers().contains(modif); + } + return true; + } + + public default boolean addModifiers(AnnotableAndModifiable aam, Modifier[] modifs) { + return this.doMultipleModifications(aam, modifs, this::addModifier); + } + + public default boolean addAnnotationInstance(AnnotableAndModifiable aam, AnnotationInstance annoAndModif) { + if (aam != null) { + aam.getAnnotationsAndModifiers().add(annoAndModif); + return aam.getAnnotationsAndModifiers().contains(annoAndModif) + && aam.getAnnotationInstances().contains(annoAndModif); + } + return true; + } + + public default boolean addAnnotationInstances(AnnotableAndModifiable aam, AnnotationInstance[] annoAndModifArr) { + return this.doMultipleModifications(aam, annoAndModifArr, this::addAnnotationInstance); + } + + public default boolean makePrivate(AnnotableAndModifiable aam) { + aam.makePrivate(); + return aam.isPrivate(); + } + + public default boolean makeProtected(AnnotableAndModifiable aam) { + aam.makeProtected(); + return aam.isProtected(); + } + + public default boolean makePublic(AnnotableAndModifiable aam) { + aam.makePublic(); + return aam.isPublic(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotationInstanceOrModifierInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotationInstanceOrModifierInitialiser.java new file mode 100644 index 0000000000..465882b611 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IAnnotationInstanceOrModifierInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.AnnotationInstanceOrModifier; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IAnnotationInstanceOrModifierInitialiser extends ICommentableInitialiser { + @Override + public AnnotationInstanceOrModifier instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IDefaultInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IDefaultInitialiser.java new file mode 100644 index 0000000000..03a7ec9693 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IDefaultInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Default; + +public interface IDefaultInitialiser extends IModifierInitialiser { + @Override + public Default instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IFinalInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IFinalInitialiser.java new file mode 100644 index 0000000000..ef4990dda1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IFinalInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Final; + +public interface IFinalInitialiser extends IModifierInitialiser { + @Override + public Final instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifiableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifiableInitialiser.java new file mode 100644 index 0000000000..661c72291d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifiableInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Modifiable; +import org.emftext.language.java.modifiers.Modifier; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IModifiableInitialiser extends ICommentableInitialiser { + @Override + public Modifiable instantiate(); + + public default boolean addModifier(Modifiable modifiable, Modifier modifier) { + if (modifier != null) { + modifiable.getModifiers().add(modifier); + return modifiable.getModifiers().contains(modifier); + } + return true; + } + + public default boolean addModifiers(Modifiable modifiable, Modifier[] modifiers) { + return this.doMultipleModifications(modifiable, modifiers, this::addModifier); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifierInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifierInitialiser.java new file mode 100644 index 0000000000..27c5c5fa2e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModifierInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Modifier; + +public interface IModifierInitialiser extends IAnnotationInstanceOrModifierInitialiser { + @Override + public Modifier instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModuleRequiresModifierInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModuleRequiresModifierInitialiser.java new file mode 100644 index 0000000000..2aaffbf9ab --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IModuleRequiresModifierInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModuleRequiresModifier; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IModuleRequiresModifierInitialiser extends ICommentableInitialiser { + @Override + public ModuleRequiresModifier instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/INativeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/INativeInitialiser.java new file mode 100644 index 0000000000..46cc6644c7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/INativeInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Native; + +public interface INativeInitialiser extends IModifierInitialiser { + @Override + public Native instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IOpenInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IOpenInitialiser.java new file mode 100644 index 0000000000..7e7bf42537 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IOpenInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Open; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IOpenInitialiser extends ICommentableInitialiser { + @Override + public Open instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPrivateInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPrivateInitialiser.java new file mode 100644 index 0000000000..fd5e02c8ac --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPrivateInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Private; + +public interface IPrivateInitialiser extends IModifierInitialiser { + @Override + public Private instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IProtectedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IProtectedInitialiser.java new file mode 100644 index 0000000000..b065700663 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IProtectedInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Protected; + +public interface IProtectedInitialiser extends IModifierInitialiser { + @Override + public Protected instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPublicInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPublicInitialiser.java new file mode 100644 index 0000000000..167a7c7d0e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IPublicInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Public; + +public interface IPublicInitialiser extends IModifierInitialiser { + @Override + public Public instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStaticInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStaticInitialiser.java new file mode 100644 index 0000000000..717eb299cd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStaticInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Static; + +public interface IStaticInitialiser extends IModifierInitialiser, IModuleRequiresModifierInitialiser { + @Override + public Static instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStrictfpInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStrictfpInitialiser.java new file mode 100644 index 0000000000..6358b945b7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IStrictfpInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Strictfp; + +public interface IStrictfpInitialiser extends IModifierInitialiser { + @Override + public Strictfp instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ISynchronizedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ISynchronizedInitialiser.java new file mode 100644 index 0000000000..756db7b74f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ISynchronizedInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Synchronized; + +public interface ISynchronizedInitialiser extends IModifierInitialiser { + @Override + public Synchronized instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransientInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransientInitialiser.java new file mode 100644 index 0000000000..79bebacc23 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransientInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Transient; + +public interface ITransientInitialiser extends IModifierInitialiser { + @Override + public Transient instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransitiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransitiveInitialiser.java new file mode 100644 index 0000000000..26fd343e6f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ITransitiveInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Transitive; + +public interface ITransitiveInitialiser extends IModuleRequiresModifierInitialiser { + @Override + public Transitive instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IVolatileInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IVolatileInitialiser.java new file mode 100644 index 0000000000..f3e15c56c1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/IVolatileInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.Volatile; + +public interface IVolatileInitialiser extends IModifierInitialiser { + @Override + public Volatile instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ModifiersInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ModifiersInitialiserPackage.java new file mode 100644 index 0000000000..9c9ceec4c6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ModifiersInitialiserPackage.java @@ -0,0 +1,29 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ModifiersInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new AbstractInitialiser(), new DefaultInitialiser(), + new FinalInitialiser(), new NativeInitialiser(), new OpenInitialiser(), new PrivateInitialiser(), + new ProtectedInitialiser(), new PublicInitialiser(), new StaticInitialiser(), new StrictfpInitialiser(), + new SynchronizedInitialiser(), new TransientInitialiser(), new TransitiveInitialiser(), + new VolatileInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAbstractInitialiser.class, IAnnotableAndModifiableInitialiser.class, + IAnnotationInstanceOrModifierInitialiser.class, IDefaultInitialiser.class, IFinalInitialiser.class, + IModifiableInitialiser.class, IModifierInitialiser.class, IModuleRequiresModifierInitialiser.class, + INativeInitialiser.class, IOpenInitialiser.class, IPrivateInitialiser.class, + IProtectedInitialiser.class, IPublicInitialiser.class, IStaticInitialiser.class, + IStrictfpInitialiser.class, ISynchronizedInitialiser.class, ITransientInitialiser.class, + ITransitiveInitialiser.class, IVolatileInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/NativeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/NativeInitialiser.java new file mode 100644 index 0000000000..fe50335de2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/NativeInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Native; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NativeInitialiser extends AbstractInitialiserBase implements INativeInitialiser { + @Override + public INativeInitialiser newInitialiser() { + return new NativeInitialiser(); + } + + @Override + public Native instantiate() { + return ModifiersFactory.eINSTANCE.createNative(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/OpenInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/OpenInitialiser.java new file mode 100644 index 0000000000..3f6a736753 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/OpenInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Open; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class OpenInitialiser extends AbstractInitialiserBase implements IOpenInitialiser { + @Override + public IOpenInitialiser newInitialiser() { + return new OpenInitialiser(); + } + + @Override + public Open instantiate() { + return ModifiersFactory.eINSTANCE.createOpen(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PrivateInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PrivateInitialiser.java new file mode 100644 index 0000000000..30d2eacd08 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PrivateInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Private; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PrivateInitialiser extends AbstractInitialiserBase implements IPrivateInitialiser { + @Override + public IPrivateInitialiser newInitialiser() { + return new PrivateInitialiser(); + } + + @Override + public Private instantiate() { + return ModifiersFactory.eINSTANCE.createPrivate(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ProtectedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ProtectedInitialiser.java new file mode 100644 index 0000000000..04d43fb70b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/ProtectedInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Protected; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ProtectedInitialiser extends AbstractInitialiserBase implements IProtectedInitialiser { + @Override + public IProtectedInitialiser newInitialiser() { + return new ProtectedInitialiser(); + } + + @Override + public Protected instantiate() { + return ModifiersFactory.eINSTANCE.createProtected(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PublicInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PublicInitialiser.java new file mode 100644 index 0000000000..359133dc9f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/PublicInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Public; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PublicInitialiser extends AbstractInitialiserBase implements IPublicInitialiser { + @Override + public IPublicInitialiser newInitialiser() { + return new PublicInitialiser(); + } + + @Override + public Public instantiate() { + return ModifiersFactory.eINSTANCE.createPublic(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StaticInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StaticInitialiser.java new file mode 100644 index 0000000000..a0e7a1c774 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StaticInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Static; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class StaticInitialiser extends AbstractInitialiserBase implements IStaticInitialiser { + @Override + public IStaticInitialiser newInitialiser() { + return new StaticInitialiser(); + } + + @Override + public Static instantiate() { + return ModifiersFactory.eINSTANCE.createStatic(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StrictfpInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StrictfpInitialiser.java new file mode 100644 index 0000000000..959fb50843 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/StrictfpInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Strictfp; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class StrictfpInitialiser extends AbstractInitialiserBase implements IStrictfpInitialiser { + @Override + public IStrictfpInitialiser newInitialiser() { + return new StrictfpInitialiser(); + } + + @Override + public Strictfp instantiate() { + return ModifiersFactory.eINSTANCE.createStrictfp(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/SynchronizedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/SynchronizedInitialiser.java new file mode 100644 index 0000000000..c34e647443 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/SynchronizedInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Synchronized; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SynchronizedInitialiser extends AbstractInitialiserBase implements ISynchronizedInitialiser { + @Override + public ISynchronizedInitialiser newInitialiser() { + return new SynchronizedInitialiser(); + } + + @Override + public Synchronized instantiate() { + return ModifiersFactory.eINSTANCE.createSynchronized(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransientInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransientInitialiser.java new file mode 100644 index 0000000000..6306cb488c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransientInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Transient; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class TransientInitialiser extends AbstractInitialiserBase implements ITransientInitialiser { + @Override + public ITransientInitialiser newInitialiser() { + return new TransientInitialiser(); + } + + @Override + public Transient instantiate() { + return ModifiersFactory.eINSTANCE.createTransient(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransitiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransitiveInitialiser.java new file mode 100644 index 0000000000..e26b3311ff --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/TransitiveInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Transitive; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class TransitiveInitialiser extends AbstractInitialiserBase implements ITransitiveInitialiser { + @Override + public ITransitiveInitialiser newInitialiser() { + return new TransitiveInitialiser(); + } + + @Override + public Transitive instantiate() { + return ModifiersFactory.eINSTANCE.createTransitive(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/VolatileInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/VolatileInitialiser.java new file mode 100644 index 0000000000..3083085f00 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/VolatileInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modifiers; + +import org.emftext.language.java.modifiers.ModifiersFactory; +import org.emftext.language.java.modifiers.Volatile; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class VolatileInitialiser extends AbstractInitialiserBase implements IVolatileInitialiser { + @Override + public IVolatileInitialiser newInitialiser() { + return new VolatileInitialiser(); + } + + @Override + public Volatile instantiate() { + return ModifiersFactory.eINSTANCE.createVolatile(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/package-info.java new file mode 100644 index 0000000000..cb720cbcf9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modifiers/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.modifiers}. + */ +package cipm.consistency.initialisers.jamopp.modifiers; \ No newline at end of file From ac840ae753cfe2fb9fea60569e382a10a4b81dac Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 16:52:24 +0200 Subject: [PATCH 13/87] Implement initialiser package for org.emftext.language.java.operators --- .../jamopp/operators/AdditionInitialiser.java | 18 ++++++++ .../operators/AssignmentAndInitialiser.java | 18 ++++++++ .../AssignmentDivisionInitialiser.java | 18 ++++++++ .../AssignmentExclusiveOrInitialiser.java | 19 ++++++++ .../operators/AssignmentInitialiser.java | 18 ++++++++ .../AssignmentLeftShiftInitialiser.java | 18 ++++++++ .../operators/AssignmentMinusInitialiser.java | 18 ++++++++ .../AssignmentModuloInitialiser.java | 18 ++++++++ .../AssignmentMultiplicationInitialiser.java | 19 ++++++++ .../operators/AssignmentOrInitialiser.java | 18 ++++++++ .../operators/AssignmentPlusInitialiser.java | 18 ++++++++ .../AssignmentRightShiftInitialiser.java | 19 ++++++++ ...signmentUnsignedRightShiftInitialiser.java | 19 ++++++++ .../operators/ComplementInitialiser.java | 18 ++++++++ .../jamopp/operators/DivisionInitialiser.java | 18 ++++++++ .../jamopp/operators/EqualInitialiser.java | 18 ++++++++ .../operators/GreaterThanInitialiser.java | 18 ++++++++ .../GreaterThanOrEqualInitialiser.java | 18 ++++++++ .../operators/IAdditionInitialiser.java | 9 ++++ .../IAdditiveOperatorInitialiser.java | 9 ++++ .../operators/IAssignmentAndInitialiser.java | 9 ++++ .../IAssignmentDivisionInitialiser.java | 9 ++++ .../IAssignmentExclusiveOrInitialiser.java | 9 ++++ .../operators/IAssignmentInitialiser.java | 9 ++++ .../IAssignmentLeftShiftInitialiser.java | 9 ++++ .../IAssignmentMinusInitialiser.java | 9 ++++ .../IAssignmentModuloInitialiser.java | 9 ++++ .../IAssignmentMultiplicationInitialiser.java | 9 ++++ .../IAssignmentOperatorInitialiser.java | 9 ++++ .../operators/IAssignmentOrInitialiser.java | 9 ++++ .../operators/IAssignmentPlusInitialiser.java | 9 ++++ .../IAssignmentRightShiftInitialiser.java | 9 ++++ ...signmentUnsignedRightShiftInitialiser.java | 9 ++++ .../operators/IComplementInitialiser.java | 9 ++++ .../operators/IDivisionInitialiser.java | 9 ++++ .../jamopp/operators/IEqualInitialiser.java | 9 ++++ .../IEqualityOperatorInitialiser.java | 9 ++++ .../operators/IGreaterThanInitialiser.java | 9 ++++ .../IGreaterThanOrEqualInitialiser.java | 9 ++++ .../operators/ILeftShiftInitialiser.java | 9 ++++ .../operators/ILessThanInitialiser.java | 9 ++++ .../ILessThanOrEqualInitialiser.java | 9 ++++ .../operators/IMinusMinusInitialiser.java | 9 ++++ .../operators/IMultiplicationInitialiser.java | 9 ++++ .../IMultiplicativeOperatorInitialiser.java | 9 ++++ .../jamopp/operators/INegateInitialiser.java | 9 ++++ .../operators/INotEqualInitialiser.java | 9 ++++ .../operators/IOperatorInitialiser.java | 11 +++++ .../operators/IPlusPlusInitialiser.java | 9 ++++ .../IRelationOperatorInitialiser.java | 9 ++++ .../operators/IRemainderInitialiser.java | 9 ++++ .../operators/IRightShiftInitialiser.java | 9 ++++ .../operators/IShiftOperatorInitialiser.java | 9 ++++ .../operators/ISubtractionInitialiser.java | 9 ++++ ...IUnaryModificationOperatorInitialiser.java | 9 ++++ .../operators/IUnaryOperatorInitialiser.java | 9 ++++ .../IUnsignedRightShiftInitialiser.java | 9 ++++ .../operators/LeftShiftInitialiser.java | 18 ++++++++ .../jamopp/operators/LessThanInitialiser.java | 18 ++++++++ .../operators/LessThanOrEqualInitialiser.java | 18 ++++++++ .../operators/MinusMinusInitialiser.java | 18 ++++++++ .../operators/MultiplicationInitialiser.java | 18 ++++++++ .../jamopp/operators/NegateInitialiser.java | 18 ++++++++ .../jamopp/operators/NotEqualInitialiser.java | 18 ++++++++ .../OperatorsInitialiserPackage.java | 44 +++++++++++++++++++ .../jamopp/operators/PlusPlusInitialiser.java | 18 ++++++++ .../operators/RemainderInitialiser.java | 18 ++++++++ .../operators/RightShiftInitialiser.java | 18 ++++++++ .../operators/SubtractionInitialiser.java | 18 ++++++++ .../UnsignedRightShiftInitialiser.java | 18 ++++++++ .../jamopp/operators/package-info.java | 5 +++ 71 files changed, 946 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AdditionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentAndInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentDivisionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentExclusiveOrInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentLeftShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMinusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentModuloInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMultiplicationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentOrInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentPlusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentRightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentUnsignedRightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ComplementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/DivisionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/EqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanOrEqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditiveOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentAndInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentDivisionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentExclusiveOrInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentLeftShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMinusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentModuloInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMultiplicationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOrInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentPlusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentRightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentUnsignedRightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IComplementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IDivisionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualityOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanOrEqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILeftShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanOrEqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMinusMinusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicativeOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INegateInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INotEqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IPlusPlusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRelationOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRemainderInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IShiftOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ISubtractionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryModificationOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryOperatorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnsignedRightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LeftShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanOrEqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MinusMinusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MultiplicationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NegateInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NotEqualInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/OperatorsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/PlusPlusInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RemainderInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/SubtractionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/UnsignedRightShiftInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AdditionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AdditionInitialiser.java new file mode 100644 index 0000000000..4d471b6c58 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AdditionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Addition; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AdditionInitialiser extends AbstractInitialiserBase implements IAdditionInitialiser { + @Override + public IAdditionInitialiser newInitialiser() { + return new AdditionInitialiser(); + } + + @Override + public Addition instantiate() { + return OperatorsFactory.eINSTANCE.createAddition(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentAndInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentAndInitialiser.java new file mode 100644 index 0000000000..6bf41b5fb2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentAndInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentAnd; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentAndInitialiser extends AbstractInitialiserBase implements IAssignmentAndInitialiser { + @Override + public IAssignmentAndInitialiser newInitialiser() { + return new AssignmentAndInitialiser(); + } + + @Override + public AssignmentAnd instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentAnd(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentDivisionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentDivisionInitialiser.java new file mode 100644 index 0000000000..87603fab53 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentDivisionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentDivision; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentDivisionInitialiser extends AbstractInitialiserBase implements IAssignmentDivisionInitialiser { + @Override + public IAssignmentDivisionInitialiser newInitialiser() { + return new AssignmentDivisionInitialiser(); + } + + @Override + public AssignmentDivision instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentDivision(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentExclusiveOrInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentExclusiveOrInitialiser.java new file mode 100644 index 0000000000..87aa83cb5b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentExclusiveOrInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentExclusiveOr; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentExclusiveOrInitialiser extends AbstractInitialiserBase + implements IAssignmentExclusiveOrInitialiser { + @Override + public IAssignmentExclusiveOrInitialiser newInitialiser() { + return new AssignmentExclusiveOrInitialiser(); + } + + @Override + public AssignmentExclusiveOr instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentExclusiveOr(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentInitialiser.java new file mode 100644 index 0000000000..de14f68b75 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Assignment; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentInitialiser extends AbstractInitialiserBase implements IAssignmentInitialiser { + @Override + public IAssignmentInitialiser newInitialiser() { + return new AssignmentInitialiser(); + } + + @Override + public Assignment instantiate() { + return OperatorsFactory.eINSTANCE.createAssignment(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentLeftShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentLeftShiftInitialiser.java new file mode 100644 index 0000000000..cbeed302e5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentLeftShiftInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentLeftShift; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentLeftShiftInitialiser extends AbstractInitialiserBase implements IAssignmentLeftShiftInitialiser { + @Override + public IAssignmentLeftShiftInitialiser newInitialiser() { + return new AssignmentLeftShiftInitialiser(); + } + + @Override + public AssignmentLeftShift instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentLeftShift(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMinusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMinusInitialiser.java new file mode 100644 index 0000000000..0ccbe2d899 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMinusInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentMinus; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentMinusInitialiser extends AbstractInitialiserBase implements IAssignmentMinusInitialiser { + @Override + public IAssignmentMinusInitialiser newInitialiser() { + return new AssignmentMinusInitialiser(); + } + + @Override + public AssignmentMinus instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentMinus(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentModuloInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentModuloInitialiser.java new file mode 100644 index 0000000000..9e14caa456 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentModuloInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentModulo; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentModuloInitialiser extends AbstractInitialiserBase implements IAssignmentModuloInitialiser { + @Override + public IAssignmentModuloInitialiser newInitialiser() { + return new AssignmentModuloInitialiser(); + } + + @Override + public AssignmentModulo instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentModulo(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMultiplicationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMultiplicationInitialiser.java new file mode 100644 index 0000000000..758a4e6235 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentMultiplicationInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentMultiplication; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentMultiplicationInitialiser extends AbstractInitialiserBase + implements IAssignmentMultiplicationInitialiser { + @Override + public IAssignmentMultiplicationInitialiser newInitialiser() { + return new AssignmentMultiplicationInitialiser(); + } + + @Override + public AssignmentMultiplication instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentMultiplication(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentOrInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentOrInitialiser.java new file mode 100644 index 0000000000..48b44e3c6a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentOrInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentOr; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentOrInitialiser extends AbstractInitialiserBase implements IAssignmentOrInitialiser { + @Override + public IAssignmentOrInitialiser newInitialiser() { + return new AssignmentOrInitialiser(); + } + + @Override + public AssignmentOr instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentOr(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentPlusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentPlusInitialiser.java new file mode 100644 index 0000000000..9c2cf0ad20 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentPlusInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentPlus; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentPlusInitialiser extends AbstractInitialiserBase implements IAssignmentPlusInitialiser { + @Override + public IAssignmentPlusInitialiser newInitialiser() { + return new AssignmentPlusInitialiser(); + } + + @Override + public AssignmentPlus instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentPlus(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentRightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentRightShiftInitialiser.java new file mode 100644 index 0000000000..8ed66a0d9c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentRightShiftInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentRightShift; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentRightShiftInitialiser extends AbstractInitialiserBase + implements IAssignmentRightShiftInitialiser { + @Override + public IAssignmentRightShiftInitialiser newInitialiser() { + return new AssignmentRightShiftInitialiser(); + } + + @Override + public AssignmentRightShift instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentRightShift(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentUnsignedRightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentUnsignedRightShiftInitialiser.java new file mode 100644 index 0000000000..ce7ac8df1b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/AssignmentUnsignedRightShiftInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentUnsignedRightShift; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AssignmentUnsignedRightShiftInitialiser extends AbstractInitialiserBase + implements IAssignmentUnsignedRightShiftInitialiser { + @Override + public IAssignmentUnsignedRightShiftInitialiser newInitialiser() { + return new AssignmentUnsignedRightShiftInitialiser(); + } + + @Override + public AssignmentUnsignedRightShift instantiate() { + return OperatorsFactory.eINSTANCE.createAssignmentUnsignedRightShift(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ComplementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ComplementInitialiser.java new file mode 100644 index 0000000000..15e3705d12 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ComplementInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Complement; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ComplementInitialiser extends AbstractInitialiserBase implements IComplementInitialiser { + @Override + public IComplementInitialiser newInitialiser() { + return new ComplementInitialiser(); + } + + @Override + public Complement instantiate() { + return OperatorsFactory.eINSTANCE.createComplement(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/DivisionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/DivisionInitialiser.java new file mode 100644 index 0000000000..57d18cd051 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/DivisionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Division; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DivisionInitialiser extends AbstractInitialiserBase implements IDivisionInitialiser { + @Override + public IDivisionInitialiser newInitialiser() { + return new DivisionInitialiser(); + } + + @Override + public Division instantiate() { + return OperatorsFactory.eINSTANCE.createDivision(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/EqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/EqualInitialiser.java new file mode 100644 index 0000000000..b21d2851c3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/EqualInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Equal; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class EqualInitialiser extends AbstractInitialiserBase implements IEqualInitialiser { + @Override + public IEqualInitialiser newInitialiser() { + return new EqualInitialiser(); + } + + @Override + public Equal instantiate() { + return OperatorsFactory.eINSTANCE.createEqual(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanInitialiser.java new file mode 100644 index 0000000000..27524974c5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.GreaterThan; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class GreaterThanInitialiser extends AbstractInitialiserBase implements IGreaterThanInitialiser { + @Override + public IGreaterThanInitialiser newInitialiser() { + return new GreaterThanInitialiser(); + } + + @Override + public GreaterThan instantiate() { + return OperatorsFactory.eINSTANCE.createGreaterThan(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanOrEqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanOrEqualInitialiser.java new file mode 100644 index 0000000000..bc864b1fa5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/GreaterThanOrEqualInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.GreaterThanOrEqual; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class GreaterThanOrEqualInitialiser extends AbstractInitialiserBase implements IGreaterThanOrEqualInitialiser { + @Override + public IGreaterThanOrEqualInitialiser newInitialiser() { + return new GreaterThanOrEqualInitialiser(); + } + + @Override + public GreaterThanOrEqual instantiate() { + return OperatorsFactory.eINSTANCE.createGreaterThanOrEqual(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditionInitialiser.java new file mode 100644 index 0000000000..5e63e082d3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Addition; + +public interface IAdditionInitialiser extends IAdditiveOperatorInitialiser { + @Override + public Addition instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditiveOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditiveOperatorInitialiser.java new file mode 100644 index 0000000000..d48d8334d5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAdditiveOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AdditiveOperator; + +public interface IAdditiveOperatorInitialiser extends IOperatorInitialiser { + @Override + public AdditiveOperator instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentAndInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentAndInitialiser.java new file mode 100644 index 0000000000..405817a773 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentAndInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentAnd; + +public interface IAssignmentAndInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentAnd instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentDivisionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentDivisionInitialiser.java new file mode 100644 index 0000000000..52686c2d48 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentDivisionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentDivision; + +public interface IAssignmentDivisionInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentDivision instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentExclusiveOrInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentExclusiveOrInitialiser.java new file mode 100644 index 0000000000..54501a8ce5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentExclusiveOrInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentExclusiveOr; + +public interface IAssignmentExclusiveOrInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentExclusiveOr instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentInitialiser.java new file mode 100644 index 0000000000..f893c2c8e8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Assignment; + +public interface IAssignmentInitialiser extends IAssignmentOperatorInitialiser { + @Override + public Assignment instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentLeftShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentLeftShiftInitialiser.java new file mode 100644 index 0000000000..45101827f7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentLeftShiftInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentLeftShift; + +public interface IAssignmentLeftShiftInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentLeftShift instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMinusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMinusInitialiser.java new file mode 100644 index 0000000000..dbefdf1ee5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMinusInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentMinus; + +public interface IAssignmentMinusInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentMinus instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentModuloInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentModuloInitialiser.java new file mode 100644 index 0000000000..4a62118c8d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentModuloInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentModulo; + +public interface IAssignmentModuloInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentModulo instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMultiplicationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMultiplicationInitialiser.java new file mode 100644 index 0000000000..d594065636 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentMultiplicationInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentMultiplication; + +public interface IAssignmentMultiplicationInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentMultiplication instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOperatorInitialiser.java new file mode 100644 index 0000000000..1a8e008305 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentOperator; + +public interface IAssignmentOperatorInitialiser extends IOperatorInitialiser { + @Override + public AssignmentOperator instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOrInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOrInitialiser.java new file mode 100644 index 0000000000..3512ef3531 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentOrInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentOr; + +public interface IAssignmentOrInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentOr instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentPlusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentPlusInitialiser.java new file mode 100644 index 0000000000..b8b0125c7c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentPlusInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentPlus; + +public interface IAssignmentPlusInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentPlus instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentRightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentRightShiftInitialiser.java new file mode 100644 index 0000000000..1328e71eab --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentRightShiftInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentRightShift; + +public interface IAssignmentRightShiftInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentRightShift instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentUnsignedRightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentUnsignedRightShiftInitialiser.java new file mode 100644 index 0000000000..a119eaeb6f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IAssignmentUnsignedRightShiftInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.AssignmentUnsignedRightShift; + +public interface IAssignmentUnsignedRightShiftInitialiser extends IAssignmentOperatorInitialiser { + @Override + public AssignmentUnsignedRightShift instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IComplementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IComplementInitialiser.java new file mode 100644 index 0000000000..54956de8d0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IComplementInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Complement; + +public interface IComplementInitialiser extends IUnaryOperatorInitialiser { + @Override + public Complement instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IDivisionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IDivisionInitialiser.java new file mode 100644 index 0000000000..2af6f49a07 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IDivisionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Division; + +public interface IDivisionInitialiser extends IMultiplicativeOperatorInitialiser { + @Override + public Division instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualInitialiser.java new file mode 100644 index 0000000000..2206d5158e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Equal; + +public interface IEqualInitialiser extends IEqualityOperatorInitialiser { + @Override + public Equal instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualityOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualityOperatorInitialiser.java new file mode 100644 index 0000000000..24f7cb4671 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IEqualityOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.EqualityOperator; + +public interface IEqualityOperatorInitialiser extends IOperatorInitialiser { + @Override + public EqualityOperator instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanInitialiser.java new file mode 100644 index 0000000000..06eb70aaa2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.GreaterThan; + +public interface IGreaterThanInitialiser extends IRelationOperatorInitialiser { + @Override + public GreaterThan instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanOrEqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanOrEqualInitialiser.java new file mode 100644 index 0000000000..fe3d7ea663 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IGreaterThanOrEqualInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.GreaterThanOrEqual; + +public interface IGreaterThanOrEqualInitialiser extends IRelationOperatorInitialiser { + @Override + public GreaterThanOrEqual instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILeftShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILeftShiftInitialiser.java new file mode 100644 index 0000000000..a6a98db588 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILeftShiftInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.LeftShift; + +public interface ILeftShiftInitialiser extends IShiftOperatorInitialiser { + @Override + public LeftShift instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanInitialiser.java new file mode 100644 index 0000000000..8fcc9ec1c7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.LessThan; + +public interface ILessThanInitialiser extends IRelationOperatorInitialiser { + @Override + public LessThan instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanOrEqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanOrEqualInitialiser.java new file mode 100644 index 0000000000..81315c9718 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ILessThanOrEqualInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.LessThanOrEqual; + +public interface ILessThanOrEqualInitialiser extends IRelationOperatorInitialiser { + @Override + public LessThanOrEqual instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMinusMinusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMinusMinusInitialiser.java new file mode 100644 index 0000000000..cd93169c27 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMinusMinusInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.MinusMinus; + +public interface IMinusMinusInitialiser extends IUnaryModificationOperatorInitialiser { + @Override + public MinusMinus instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicationInitialiser.java new file mode 100644 index 0000000000..35c57996f7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicationInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Multiplication; + +public interface IMultiplicationInitialiser extends IMultiplicativeOperatorInitialiser { + @Override + public Multiplication instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicativeOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicativeOperatorInitialiser.java new file mode 100644 index 0000000000..e0ae532330 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IMultiplicativeOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.MultiplicativeOperator; + +public interface IMultiplicativeOperatorInitialiser extends IOperatorInitialiser { + @Override + public MultiplicativeOperator instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INegateInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INegateInitialiser.java new file mode 100644 index 0000000000..6de5066283 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INegateInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Negate; + +public interface INegateInitialiser extends IUnaryOperatorInitialiser { + @Override + public Negate instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INotEqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INotEqualInitialiser.java new file mode 100644 index 0000000000..83c5a9696a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/INotEqualInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.NotEqual; + +public interface INotEqualInitialiser extends IEqualityOperatorInitialiser { + @Override + public NotEqual instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IOperatorInitialiser.java new file mode 100644 index 0000000000..c74f5a476a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IOperatorInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Operator; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IOperatorInitialiser extends ICommentableInitialiser { + @Override + public Operator instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IPlusPlusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IPlusPlusInitialiser.java new file mode 100644 index 0000000000..7d28bc4bc4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IPlusPlusInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.PlusPlus; + +public interface IPlusPlusInitialiser extends IUnaryModificationOperatorInitialiser { + @Override + public PlusPlus instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRelationOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRelationOperatorInitialiser.java new file mode 100644 index 0000000000..5f7998fe22 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRelationOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.RelationOperator; + +public interface IRelationOperatorInitialiser extends IOperatorInitialiser { + @Override + public RelationOperator instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRemainderInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRemainderInitialiser.java new file mode 100644 index 0000000000..2c635a05d5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRemainderInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Remainder; + +public interface IRemainderInitialiser extends IMultiplicativeOperatorInitialiser { + @Override + public Remainder instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRightShiftInitialiser.java new file mode 100644 index 0000000000..cd18544d14 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IRightShiftInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.RightShift; + +public interface IRightShiftInitialiser extends IShiftOperatorInitialiser { + @Override + public RightShift instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IShiftOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IShiftOperatorInitialiser.java new file mode 100644 index 0000000000..e18dc95028 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IShiftOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.ShiftOperator; + +public interface IShiftOperatorInitialiser extends IOperatorInitialiser { + @Override + public ShiftOperator instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ISubtractionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ISubtractionInitialiser.java new file mode 100644 index 0000000000..c0776b0995 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/ISubtractionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Subtraction; + +public interface ISubtractionInitialiser extends IAdditiveOperatorInitialiser { + @Override + public Subtraction instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryModificationOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryModificationOperatorInitialiser.java new file mode 100644 index 0000000000..efd06dc63d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryModificationOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.UnaryModificationOperator; + +public interface IUnaryModificationOperatorInitialiser extends IOperatorInitialiser { + @Override + public UnaryModificationOperator instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryOperatorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryOperatorInitialiser.java new file mode 100644 index 0000000000..ef4e219488 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnaryOperatorInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.UnaryOperator; + +public interface IUnaryOperatorInitialiser extends IOperatorInitialiser { + @Override + public UnaryOperator instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnsignedRightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnsignedRightShiftInitialiser.java new file mode 100644 index 0000000000..cada84eed8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/IUnsignedRightShiftInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.UnsignedRightShift; + +public interface IUnsignedRightShiftInitialiser extends IShiftOperatorInitialiser { + @Override + public UnsignedRightShift instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LeftShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LeftShiftInitialiser.java new file mode 100644 index 0000000000..a92d5e138a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LeftShiftInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.LeftShift; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class LeftShiftInitialiser extends AbstractInitialiserBase implements ILeftShiftInitialiser { + @Override + public ILeftShiftInitialiser newInitialiser() { + return new LeftShiftInitialiser(); + } + + @Override + public LeftShift instantiate() { + return OperatorsFactory.eINSTANCE.createLeftShift(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanInitialiser.java new file mode 100644 index 0000000000..e2e5b39add --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.LessThan; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class LessThanInitialiser extends AbstractInitialiserBase implements ILessThanInitialiser { + @Override + public ILessThanInitialiser newInitialiser() { + return new LessThanInitialiser(); + } + + @Override + public LessThan instantiate() { + return OperatorsFactory.eINSTANCE.createLessThan(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanOrEqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanOrEqualInitialiser.java new file mode 100644 index 0000000000..aa0519d3ca --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/LessThanOrEqualInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.LessThanOrEqual; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class LessThanOrEqualInitialiser extends AbstractInitialiserBase implements ILessThanOrEqualInitialiser { + @Override + public ILessThanOrEqualInitialiser newInitialiser() { + return new LessThanOrEqualInitialiser(); + } + + @Override + public LessThanOrEqual instantiate() { + return OperatorsFactory.eINSTANCE.createLessThanOrEqual(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MinusMinusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MinusMinusInitialiser.java new file mode 100644 index 0000000000..eb22f66029 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MinusMinusInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.MinusMinus; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class MinusMinusInitialiser extends AbstractInitialiserBase implements IMinusMinusInitialiser { + @Override + public IMinusMinusInitialiser newInitialiser() { + return new MinusMinusInitialiser(); + } + + @Override + public MinusMinus instantiate() { + return OperatorsFactory.eINSTANCE.createMinusMinus(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MultiplicationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MultiplicationInitialiser.java new file mode 100644 index 0000000000..559e213443 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/MultiplicationInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Multiplication; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class MultiplicationInitialiser extends AbstractInitialiserBase implements IMultiplicationInitialiser { + @Override + public IMultiplicationInitialiser newInitialiser() { + return new MultiplicationInitialiser(); + } + + @Override + public Multiplication instantiate() { + return OperatorsFactory.eINSTANCE.createMultiplication(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NegateInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NegateInitialiser.java new file mode 100644 index 0000000000..25386a661c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NegateInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.Negate; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NegateInitialiser extends AbstractInitialiserBase implements INegateInitialiser { + @Override + public INegateInitialiser newInitialiser() { + return new NegateInitialiser(); + } + + @Override + public Negate instantiate() { + return OperatorsFactory.eINSTANCE.createNegate(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NotEqualInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NotEqualInitialiser.java new file mode 100644 index 0000000000..93cc16b45b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/NotEqualInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.NotEqual; +import org.emftext.language.java.operators.OperatorsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NotEqualInitialiser extends AbstractInitialiserBase implements INotEqualInitialiser { + @Override + public INotEqualInitialiser newInitialiser() { + return new NotEqualInitialiser(); + } + + @Override + public NotEqual instantiate() { + return OperatorsFactory.eINSTANCE.createNotEqual(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/OperatorsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/OperatorsInitialiserPackage.java new file mode 100644 index 0000000000..f84c06fddb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/OperatorsInitialiserPackage.java @@ -0,0 +1,44 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class OperatorsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new AdditionInitialiser(), new AssignmentAndInitialiser(), + new AssignmentDivisionInitialiser(), new AssignmentExclusiveOrInitialiser(), + new AssignmentInitialiser(), new AssignmentLeftShiftInitialiser(), new AssignmentMinusInitialiser(), + new AssignmentModuloInitialiser(), new AssignmentMultiplicationInitialiser(), + new AssignmentOrInitialiser(), new AssignmentPlusInitialiser(), new AssignmentRightShiftInitialiser(), + new AssignmentUnsignedRightShiftInitialiser(), new ComplementInitialiser(), new DivisionInitialiser(), + new EqualInitialiser(), new GreaterThanInitialiser(), new GreaterThanOrEqualInitialiser(), + new LeftShiftInitialiser(), new LessThanInitialiser(), new LessThanOrEqualInitialiser(), + new MinusMinusInitialiser(), new MultiplicationInitialiser(), new NegateInitialiser(), + new NotEqualInitialiser(), new PlusPlusInitialiser(), new RemainderInitialiser(), + new RightShiftInitialiser(), new SubtractionInitialiser(), new UnsignedRightShiftInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAdditionInitialiser.class, IAdditiveOperatorInitialiser.class, + IAssignmentAndInitialiser.class, IAssignmentDivisionInitialiser.class, + IAssignmentExclusiveOrInitialiser.class, IAssignmentInitialiser.class, + IAssignmentLeftShiftInitialiser.class, IAssignmentMinusInitialiser.class, + IAssignmentModuloInitialiser.class, IAssignmentMultiplicationInitialiser.class, + IAssignmentOperatorInitialiser.class, IAssignmentOrInitialiser.class, IAssignmentPlusInitialiser.class, + IAssignmentRightShiftInitialiser.class, IAssignmentUnsignedRightShiftInitialiser.class, + IComplementInitialiser.class, IDivisionInitialiser.class, IEqualInitialiser.class, + IEqualityOperatorInitialiser.class, IGreaterThanInitialiser.class, IGreaterThanOrEqualInitialiser.class, + ILeftShiftInitialiser.class, ILessThanInitialiser.class, ILessThanOrEqualInitialiser.class, + IMinusMinusInitialiser.class, IMultiplicationInitialiser.class, + IMultiplicativeOperatorInitialiser.class, INegateInitialiser.class, INotEqualInitialiser.class, + IOperatorInitialiser.class, IPlusPlusInitialiser.class, IRelationOperatorInitialiser.class, + IRemainderInitialiser.class, IRightShiftInitialiser.class, IShiftOperatorInitialiser.class, + ISubtractionInitialiser.class, IUnaryModificationOperatorInitialiser.class, + IUnaryOperatorInitialiser.class, IUnsignedRightShiftInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/PlusPlusInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/PlusPlusInitialiser.java new file mode 100644 index 0000000000..520890cb30 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/PlusPlusInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.OperatorsFactory; +import org.emftext.language.java.operators.PlusPlus; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PlusPlusInitialiser extends AbstractInitialiserBase implements IPlusPlusInitialiser { + @Override + public IPlusPlusInitialiser newInitialiser() { + return new PlusPlusInitialiser(); + } + + @Override + public PlusPlus instantiate() { + return OperatorsFactory.eINSTANCE.createPlusPlus(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RemainderInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RemainderInitialiser.java new file mode 100644 index 0000000000..4445daa0d9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RemainderInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.OperatorsFactory; +import org.emftext.language.java.operators.Remainder; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class RemainderInitialiser extends AbstractInitialiserBase implements IRemainderInitialiser { + @Override + public IRemainderInitialiser newInitialiser() { + return new RemainderInitialiser(); + } + + @Override + public Remainder instantiate() { + return OperatorsFactory.eINSTANCE.createRemainder(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RightShiftInitialiser.java new file mode 100644 index 0000000000..b5f2ca2e96 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/RightShiftInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.OperatorsFactory; +import org.emftext.language.java.operators.RightShift; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class RightShiftInitialiser extends AbstractInitialiserBase implements IRightShiftInitialiser { + @Override + public IRightShiftInitialiser newInitialiser() { + return new RightShiftInitialiser(); + } + + @Override + public RightShift instantiate() { + return OperatorsFactory.eINSTANCE.createRightShift(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/SubtractionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/SubtractionInitialiser.java new file mode 100644 index 0000000000..d50fb0e26b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/SubtractionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.OperatorsFactory; +import org.emftext.language.java.operators.Subtraction; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SubtractionInitialiser extends AbstractInitialiserBase implements ISubtractionInitialiser { + @Override + public ISubtractionInitialiser newInitialiser() { + return new SubtractionInitialiser(); + } + + @Override + public Subtraction instantiate() { + return OperatorsFactory.eINSTANCE.createSubtraction(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/UnsignedRightShiftInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/UnsignedRightShiftInitialiser.java new file mode 100644 index 0000000000..74cf34179c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/UnsignedRightShiftInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.operators; + +import org.emftext.language.java.operators.OperatorsFactory; +import org.emftext.language.java.operators.UnsignedRightShift; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class UnsignedRightShiftInitialiser extends AbstractInitialiserBase implements IUnsignedRightShiftInitialiser { + @Override + public IUnsignedRightShiftInitialiser newInitialiser() { + return new UnsignedRightShiftInitialiser(); + } + + @Override + public UnsignedRightShift instantiate() { + return OperatorsFactory.eINSTANCE.createUnsignedRightShift(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/package-info.java new file mode 100644 index 0000000000..cf32b47e60 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/operators/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.operators}. + */ +package cipm.consistency.initialisers.jamopp.operators; \ No newline at end of file From dd7089a2ad1b5307d1bc5f70c4b399f237e41b7f Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:34:43 +0200 Subject: [PATCH 14/87] (WIP) Implement initialiser package for org.emftext.language.java.arrays --- .../arrays/ArrayDimensionInitialiser.java | 19 ++++++++++ .../arrays/ArrayInitializerInitialiser.java | 19 ++++++++++ .../ArrayInstantiationBySizeInitialiser.java | 19 ++++++++++ ...InstantiationByValuesTypedInitialiser.java | 19 ++++++++++ ...stantiationByValuesUntypedInitialiser.java | 19 ++++++++++ .../arrays/ArraySelectorInitialiser.java | 18 ++++++++++ .../arrays/ArraysInitialiserPackage.java | 25 +++++++++++++ .../arrays/IArrayDimensionInitialiser.java | 11 ++++++ .../IArrayInitializationValueInitialiser.java | 11 ++++++ .../arrays/IArrayInitializerInitialiser.java | 24 +++++++++++++ .../IArrayInstantiationBySizeInitialiser.java | 24 +++++++++++++ ...ArrayInstantiationByValuesInitialiser.java | 16 +++++++++ ...InstantiationByValuesTypedInitialiser.java | 11 ++++++ ...stantiationByValuesUntypedInitialiser.java | 8 +++++ .../IArrayInstantiationInitialiser.java | 10 ++++++ .../arrays/IArraySelectorInitialiser.java | 17 +++++++++ .../arrays/IArrayTypeableInitialiser.java | 35 +++++++++++++++++++ .../jamopp/arrays/package-info.java | 5 +++ 18 files changed, 310 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayDimensionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInitializerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationBySizeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesTypedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesUntypedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraySelectorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraysInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayDimensionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializationValueInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationBySizeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesTypedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesUntypedInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArraySelectorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayTypeableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayDimensionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayDimensionInitialiser.java new file mode 100644 index 0000000000..858fb0c149 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayDimensionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArraysFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.arrays.ArrayDimension; + +public class ArrayDimensionInitialiser extends AbstractInitialiserBase implements IArrayDimensionInitialiser { + @Override + public IArrayDimensionInitialiser newInitialiser() { + return new ArrayDimensionInitialiser(); + } + + @Override + public ArrayDimension instantiate() { + return ArraysFactory.eINSTANCE.createArrayDimension(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInitializerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInitializerInitialiser.java new file mode 100644 index 0000000000..91a244f67c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInitializerInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArraysFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.arrays.ArrayInitializer; + +public class ArrayInitializerInitialiser extends AbstractInitialiserBase implements IArrayInitializerInitialiser { + @Override + public IArrayInitializerInitialiser newInitialiser() { + return new ArrayInitializerInitialiser(); + } + + @Override + public ArrayInitializer instantiate() { + return ArraysFactory.eINSTANCE.createArrayInitializer(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationBySizeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationBySizeInitialiser.java new file mode 100644 index 0000000000..cc199d7aac --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationBySizeInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInstantiationBySize; +import org.emftext.language.java.arrays.ArraysFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ArrayInstantiationBySizeInitialiser extends AbstractInitialiserBase + implements IArrayInstantiationBySizeInitialiser { + @Override + public IArrayInstantiationBySizeInitialiser newInitialiser() { + return new ArrayInstantiationBySizeInitialiser(); + } + + @Override + public ArrayInstantiationBySize instantiate() { + return ArraysFactory.eINSTANCE.createArrayInstantiationBySize(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesTypedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesTypedInitialiser.java new file mode 100644 index 0000000000..d6d53022e2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesTypedInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInstantiationByValuesTyped; +import org.emftext.language.java.arrays.ArraysFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ArrayInstantiationByValuesTypedInitialiser extends AbstractInitialiserBase + implements IArrayInstantiationByValuesTypedInitialiser { + @Override + public IArrayInstantiationByValuesTypedInitialiser newInitialiser() { + return new ArrayInstantiationByValuesTypedInitialiser(); + } + + @Override + public ArrayInstantiationByValuesTyped instantiate() { + return ArraysFactory.eINSTANCE.createArrayInstantiationByValuesTyped(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesUntypedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesUntypedInitialiser.java new file mode 100644 index 0000000000..ba8ee9e7e9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArrayInstantiationByValuesUntypedInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInstantiationByValuesUntyped; +import org.emftext.language.java.arrays.ArraysFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ArrayInstantiationByValuesUntypedInitialiser extends AbstractInitialiserBase + implements IArrayInstantiationByValuesUntypedInitialiser { + @Override + public IArrayInstantiationByValuesUntypedInitialiser newInitialiser() { + return new ArrayInstantiationByValuesUntypedInitialiser(); + } + + @Override + public ArrayInstantiationByValuesUntyped instantiate() { + return ArraysFactory.eINSTANCE.createArrayInstantiationByValuesUntyped(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraySelectorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraySelectorInitialiser.java new file mode 100644 index 0000000000..8433c8ca8b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraySelectorInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.arrays.ArraysFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ArraySelectorInitialiser extends AbstractInitialiserBase implements IArraySelectorInitialiser { + @Override + public IArraySelectorInitialiser newInitialiser() { + return new ArraySelectorInitialiser(); + } + + @Override + public ArraySelector instantiate() { + return ArraysFactory.eINSTANCE.createArraySelector(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraysInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraysInitialiserPackage.java new file mode 100644 index 0000000000..0af267885e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/ArraysInitialiserPackage.java @@ -0,0 +1,25 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ArraysInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new ArrayDimensionInitialiser(), new ArrayInitializerInitialiser(), + new ArrayInstantiationBySizeInitialiser(), new ArrayInstantiationByValuesTypedInitialiser(), + new ArrayInstantiationByValuesUntypedInitialiser(), new ArraySelectorInitialiser() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IArrayDimensionInitialiser.class, IArrayInitializationValueInitialiser.class, + IArrayInitializerInitialiser.class, IArrayInstantiationBySizeInitialiser.class, + IArrayInstantiationByValuesInitialiser.class, IArrayInstantiationByValuesTypedInitialiser.class, + IArrayInstantiationByValuesUntypedInitialiser.class, IArrayInstantiationInitialiser.class, + IArraySelectorInitialiser.class, IArrayTypeableInitialiser.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayDimensionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayDimensionInitialiser.java new file mode 100644 index 0000000000..806493e3b2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayDimensionInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayDimension; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IArrayDimensionInitialiser extends IAnnotableInitialiser, ICommentableInitialiser { + @Override + public ArrayDimension instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializationValueInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializationValueInitialiser.java new file mode 100644 index 0000000000..4bf9ec4414 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializationValueInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInitializationValue; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IArrayInitializationValueInitialiser extends ICommentableInitialiser { + @Override + public ArrayInitializationValue instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializerInitialiser.java new file mode 100644 index 0000000000..c7ea435d5e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInitializerInitialiser.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInitializationValue; +import org.emftext.language.java.arrays.ArrayInitializer; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotationValueInitialiser; + +public interface IArrayInitializerInitialiser + extends IAnnotationValueInitialiser, IArrayInitializationValueInitialiser { + @Override + public ArrayInitializer instantiate(); + + public default boolean addInitialValue(ArrayInitializer ai, ArrayInitializationValue initVal) { + if (initVal != null) { + ai.getInitialValues().add(initVal); + return ai.getInitialValues().contains(initVal); + } + return true; + } + + public default boolean addInitialValues(ArrayInitializer ai, ArrayInitializationValue[] initVals) { + return this.doMultipleModifications(ai, initVals, this::addInitialValue); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationBySizeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationBySizeInitialiser.java new file mode 100644 index 0000000000..38df6b44a1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationBySizeInitialiser.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInstantiationBySize; +import org.emftext.language.java.expressions.Expression; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IArrayInstantiationBySizeInitialiser extends IArrayInstantiationInitialiser, ITypedElementInitialiser { + + @Override + public ArrayInstantiationBySize instantiate(); + + public default boolean addSize(ArrayInstantiationBySize arrIns, Expression size) { + if (size != null) { + arrIns.getSizes().add(size); + return arrIns.getSizes().contains(size); + } + return true; + } + + public default boolean addSizes(ArrayInstantiationBySize arrIns, Expression[] sizes) { + return this.doMultipleModifications(arrIns, sizes, this::addSize); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesInitialiser.java new file mode 100644 index 0000000000..128f2fd41c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInitializer; +import org.emftext.language.java.arrays.ArrayInstantiationByValues; + +public interface IArrayInstantiationByValuesInitialiser extends IArrayInstantiationInitialiser { + + @Override + public ArrayInstantiationByValues instantiate(); + + public default boolean setArrayInitializer(ArrayInstantiationByValues arrIns, ArrayInitializer arrInit) { + arrIns.setArrayInitializer(arrInit); + return (arrInit == null && arrIns.getArrayInitializer() == null) + || arrIns.getArrayInitializer().equals(arrInit); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesTypedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesTypedInitialiser.java new file mode 100644 index 0000000000..62dde8bfed --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesTypedInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInstantiationByValuesTyped; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IArrayInstantiationByValuesTypedInitialiser + extends IArrayInstantiationByValuesInitialiser, ITypedElementInitialiser { + @Override + public ArrayInstantiationByValuesTyped instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesUntypedInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesUntypedInitialiser.java new file mode 100644 index 0000000000..e9a6d68b5a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationByValuesUntypedInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInstantiationByValuesUntyped; + +public interface IArrayInstantiationByValuesUntypedInitialiser extends IArrayInstantiationByValuesInitialiser { + @Override + public ArrayInstantiationByValuesUntyped instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationInitialiser.java new file mode 100644 index 0000000000..4af666ff1c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayInstantiationInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayInstantiation; + +import cipm.consistency.initialisers.jamopp.references.IReferenceInitialiser; + +public interface IArrayInstantiationInitialiser extends IReferenceInitialiser { + @Override + public ArrayInstantiation instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArraySelectorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArraySelectorInitialiser.java new file mode 100644 index 0000000000..de628f49ca --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArraySelectorInitialiser.java @@ -0,0 +1,17 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.expressions.Expression; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IArraySelectorInitialiser extends IAnnotableInitialiser, ICommentableInitialiser { + @Override + public ArraySelector instantiate(); + + public default boolean setPosition(ArraySelector as, Expression pos) { + as.setPosition(pos); + return (pos == null && as.getPosition() == null) || as.getPosition().equals(pos); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayTypeableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayTypeableInitialiser.java new file mode 100644 index 0000000000..4456f650f2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/IArrayTypeableInitialiser.java @@ -0,0 +1,35 @@ +package cipm.consistency.initialisers.jamopp.arrays; + +import org.emftext.language.java.arrays.ArrayDimension; +import org.emftext.language.java.arrays.ArrayTypeable; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IArrayTypeableInitialiser extends ICommentableInitialiser { + @Override + public ArrayTypeable instantiate(); + + public default boolean addArrayDimensionAfter(ArrayTypeable at, ArrayDimension arrDimAfter) { + if (arrDimAfter != null) { + at.getArrayDimensionsAfter().add(arrDimAfter); + return at.getArrayDimensionsAfter().contains(arrDimAfter); + } + return true; + } + + public default boolean addArrayDimensionBefore(ArrayTypeable at, ArrayDimension arrDimBefore) { + if (arrDimBefore != null) { + at.getArrayDimensionsBefore().add(arrDimBefore); + return at.getArrayDimensionsBefore().contains(arrDimBefore); + } + return true; + } + + public default boolean addArrayDimensionsAfter(ArrayTypeable at, ArrayDimension[] arrDimsAfter) { + return this.doMultipleModifications(at, arrDimsAfter, this::addArrayDimensionAfter); + } + + public default boolean addArrayDimensionsBefore(ArrayTypeable at, ArrayDimension[] arrDimsBefore) { + return this.doMultipleModifications(at, arrDimsBefore, this::addArrayDimensionBefore); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/package-info.java new file mode 100644 index 0000000000..81b6e0ef3b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/arrays/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.arrays}. + */ +package cipm.consistency.initialisers.jamopp.arrays; \ No newline at end of file From 70aa32d4317f5e5e65e9b68a2b7a46248858501b Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:35:24 +0200 Subject: [PATCH 15/87] (WIP) Implement initialiser package for org.emftext.language.java.classifiers --- .../classifiers/AnnotationInitialiser.java | 20 ++++ .../AnonymousClassInitialiser.java | 19 ++++ .../jamopp/classifiers/ClassInitialiser.java | 20 ++++ .../ClassifierInitialiserPackage.java | 22 +++++ .../classifiers/EnumerationInitialiser.java | 19 ++++ .../classifiers/IAnnotationInitialiser.java | 8 ++ .../IAnonymousClassInitialiser.java | 11 +++ .../jamopp/classifiers/IClassInitialiser.java | 19 ++++ .../classifiers/IClassifierInitialiser.java | 93 +++++++++++++++++++ .../IConcreteClassifierInitialiser.java | 39 ++++++++ .../classifiers/IEnumerationInitialiser.java | 21 +++++ .../classifiers/IImplementorInitialiser.java | 23 +++++ .../classifiers/IInterfaceInitialiser.java | 33 +++++++ .../classifiers/InterfaceInitialiser.java | 19 ++++ .../jamopp/classifiers/package-info.java | 5 + 15 files changed, 371 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnnotationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnonymousClassInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassifierInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/EnumerationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnnotationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnonymousClassInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassifierInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IConcreteClassifierInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IEnumerationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IImplementorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IInterfaceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/InterfaceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnnotationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnnotationInitialiser.java new file mode 100644 index 0000000000..d9d9282819 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnnotationInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.Annotation; +import org.emftext.language.java.classifiers.ClassifiersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AnnotationInitialiser extends AbstractInitialiserBase implements IAnnotationInitialiser { + @Override + public Annotation instantiate() { + var fac = ClassifiersFactory.eINSTANCE; + return fac.createAnnotation(); + } + + @Override + public AnnotationInitialiser newInitialiser() { + return new AnnotationInitialiser(); + } + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnonymousClassInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnonymousClassInitialiser.java new file mode 100644 index 0000000000..8423d31510 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/AnonymousClassInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.ClassifiersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.classifiers.AnonymousClass; + +public class AnonymousClassInitialiser extends AbstractInitialiserBase implements IAnonymousClassInitialiser { + @Override + public IAnonymousClassInitialiser newInitialiser() { + return new AnonymousClassInitialiser(); + } + + @Override + public AnonymousClass instantiate() { + return ClassifiersFactory.eINSTANCE.createAnonymousClass(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassInitialiser.java new file mode 100644 index 0000000000..419c6de41b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.ClassifiersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.classifiers.Class; + +public class ClassInitialiser extends AbstractInitialiserBase implements IClassInitialiser { + @Override + public Class instantiate() { + var fac = ClassifiersFactory.eINSTANCE; + return fac.createClass(); + } + + @Override + public ClassInitialiser newInitialiser() { + return new ClassInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassifierInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassifierInitialiserPackage.java new file mode 100644 index 0000000000..80a09e1155 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/ClassifierInitialiserPackage.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ClassifierInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new AnnotationInitialiser(), new AnonymousClassInitialiser(), + new ClassInitialiser(), new EnumerationInitialiser(), new InterfaceInitialiser() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAnnotationInitialiser.class, IAnonymousClassInitialiser.class, + IClassifierInitialiser.class, IClassInitialiser.class, IConcreteClassifierInitialiser.class, + IEnumerationInitialiser.class, IImplementorInitialiser.class, IInterfaceInitialiser.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/EnumerationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/EnumerationInitialiser.java new file mode 100644 index 0000000000..c177fa3b87 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/EnumerationInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.ClassifiersFactory; +import org.emftext.language.java.classifiers.Enumeration; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class EnumerationInitialiser extends AbstractInitialiserBase implements IEnumerationInitialiser { + @Override + public Enumeration instantiate() { + var fac = ClassifiersFactory.eINSTANCE; + return fac.createEnumeration(); + } + + @Override + public EnumerationInitialiser newInitialiser() { + return new EnumerationInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnnotationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnnotationInitialiser.java new file mode 100644 index 0000000000..e93400b262 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnnotationInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.Annotation; + +public interface IAnnotationInitialiser extends IConcreteClassifierInitialiser { + @Override + public Annotation instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnonymousClassInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnonymousClassInitialiser.java new file mode 100644 index 0000000000..8e15726db6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IAnonymousClassInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.AnonymousClass; + +import cipm.consistency.initialisers.jamopp.members.IMemberContainerInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypeInitialiser; + +public interface IAnonymousClassInitialiser extends IMemberContainerInitialiser, ITypeInitialiser { + @Override + public AnonymousClass instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassInitialiser.java new file mode 100644 index 0000000000..7f73eb9305 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.Class; +import org.emftext.language.java.types.TypeReference; + +public interface IClassInitialiser extends IConcreteClassifierInitialiser, IImplementorInitialiser { + @Override + public Class instantiate(); + + public default boolean setDefaultExtends(Class cls, TypeReference defExt) { + cls.setDefaultExtends(defExt); + return (defExt == null && cls.getDefaultExtends() == null) || cls.getDefaultExtends().equals(defExt); + } + + public default boolean setExtends(Class cls, TypeReference ext) { + cls.setExtends(ext); + return (ext == null && cls.getExtends() == null) || cls.getExtends().equals(ext); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassifierInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassifierInitialiser.java new file mode 100644 index 0000000000..67ca490b91 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IClassifierInitialiser.java @@ -0,0 +1,93 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.imports.Import; +import org.emftext.language.java.imports.PackageImport; + +import cipm.consistency.initialisers.jamopp.references.IReferenceableElementInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypeInitialiser; + +/** + * An interface meant for {@link IInitialiser} implementors that are supposed to + * create {@link Classifier} instances.
+ *
+ * Note: The methods addImport/addPackageImport of {@link Classifier} add the + * imports to its {@link CompilationUnit}. {@link Classifier} has no attributes + * itself. The same holds for their corresponding methods in this + * initialiser.. Use the methods {@link #canAddImports(Classifier)} and + * {@link #canAddPackageImports(Classifier)} to determine, whether certain + * imports can be added. + * + * @author Alp Torac Genc + */ + +public interface IClassifierInitialiser extends ITypeInitialiser, IReferenceableElementInitialiser { + @Override + public Classifier instantiate(); + + /** + * Adds the given {@link Import} to the {@link CompilationUnit} containing the + * given {@link Classifier}.
+ *
+ * Attempting to add null imports will return true, since there is no + * modification to perform. + * + * @see {@link IClassifierInitialiser} + */ + public default boolean addImport(Classifier cls, Import imp) { + if (imp != null) { + if (!this.canAddImports(cls)) { + return false; + } + var cu = cls.getContainingCompilationUnit(); + cu.getImports().add(imp); + return cu.getImports().stream().anyMatch((i) -> i.equals(imp)); + } + return true; + } + + public default boolean addImports(Classifier cls, Import[] imps) { + return this.doMultipleModifications(cls, imps, this::addImport); + } + + /** + * Whether {@link Import}s can be added via + * {@link #addImport(Classifier, Import)} + */ + public default boolean canAddImports(Classifier cls) { + return cls.getContainingCompilationUnit() != null; + } + + /** + * Whether {@link PackageImport}s can be added via + * {@link #addPackageImport(Classifier, PackageImport)} + */ + public default boolean canAddPackageImports(Classifier cls) { + return cls.getContainingCompilationUnit() != null; + } + + /** + * Adds the given {@link PackageImport} to the {@link CompilationUnit} + * containing the given {@link Classifier}.
+ *
+ * Attempting to add null package imports will return true, since there is no + * modification to perform. + * + * @see {@link IClassifierInitialiser} + */ + public default boolean addPackageImport(Classifier cls, PackageImport imp) { + if (imp != null) { + if (!this.canAddPackageImports(cls)) { + return false; + } + var cu = cls.getContainingCompilationUnit(); + cu.getImports().add(imp); + return cu.getImports().stream().anyMatch((i) -> i.equals(imp)); + } + return true; + } + + public default boolean addPackageImports(Classifier cls, PackageImport[] imps) { + return this.doMultipleModifications(cls, imps, this::addPackageImport); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IConcreteClassifierInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IConcreteClassifierInitialiser.java new file mode 100644 index 0000000000..8026bc4ded --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IConcreteClassifierInitialiser.java @@ -0,0 +1,39 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.containers.Package; + +import cipm.consistency.initialisers.jamopp.generics.ITypeParametrizableInitialiser; +import cipm.consistency.initialisers.jamopp.members.IMemberContainerInitialiser; +import cipm.consistency.initialisers.jamopp.members.IMemberInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.IAnnotableAndModifiableInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IStatementInitialiser; + +/** + * An interface meant for {@link IInitialiser} implementors that are supposed to + * create {@link ConcreteClassifier} instances.
+ *
+ * Note: {@link #setPackage(ConcreteClassifier, Package)} does not add the + * given {@link ConcreteClassifier} to the given {@link Package}. + * + * @author Alp Torac Genc + * + */ +public interface IConcreteClassifierInitialiser extends IAnnotableAndModifiableInitialiser, IMemberContainerInitialiser, + IMemberInitialiser, IStatementInitialiser, IClassifierInitialiser, ITypeParametrizableInitialiser { + + @Override + public ConcreteClassifier instantiate(); + + /** + * Sets the package of cls as pac.
+ *
+ * Note: DOES NOT modify the classifiers contained by pac. + * + * @see {@link IConcreteClassifierInitialiser} + */ + public default boolean setPackage(ConcreteClassifier cls, Package pac) { + cls.setPackage(pac); + return (pac == null && cls.getPackage() == null) || cls.getPackage().equals(pac); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IEnumerationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IEnumerationInitialiser.java new file mode 100644 index 0000000000..3da9091378 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IEnumerationInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.Enumeration; +import org.emftext.language.java.members.EnumConstant; + +public interface IEnumerationInitialiser extends IConcreteClassifierInitialiser, IImplementorInitialiser { + @Override + public Enumeration instantiate(); + + public default boolean addConstant(Enumeration enm, EnumConstant cnst) { + if (cnst != null) { + enm.getConstants().add(cnst); + return enm.getConstants().contains(cnst) && enm.getContainedConstant(cnst.getName()).equals(cnst); + } + return true; + } + + public default boolean addConstants(Enumeration enm, EnumConstant[] cnsts) { + return this.doMultipleModifications(enm, cnsts, this::addConstant); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IImplementorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IImplementorInitialiser.java new file mode 100644 index 0000000000..f0fbdebd03 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IImplementorInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.Implementor; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IImplementorInitialiser extends ICommentableInitialiser { + @Override + public Implementor instantiate(); + + public default boolean addImplements(Implementor implementor, TypeReference impls) { + if (impls != null) { + implementor.getImplements().add(impls); + return implementor.getImplements().contains(impls); + } + return true; + } + + public default boolean addImplements(Implementor implementor, TypeReference[] implsArr) { + return this.doMultipleModifications(implementor, implsArr, this::addImplements); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IInterfaceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IInterfaceInitialiser.java new file mode 100644 index 0000000000..33bafa69ce --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/IInterfaceInitialiser.java @@ -0,0 +1,33 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.Interface; +import org.emftext.language.java.types.TypeReference; + +public interface IInterfaceInitialiser extends IConcreteClassifierInitialiser { + @Override + public Interface instantiate(); + + public default boolean addDefaultExtends(Interface intfc, TypeReference defExt) { + if (defExt != null) { + intfc.getDefaultExtends().add(defExt); + return intfc.getDefaultExtends().contains(defExt); + } + return true; + } + + public default boolean addDefaultExtends(Interface intfc, TypeReference[] defExts) { + return this.doMultipleModifications(intfc, defExts, this::addDefaultExtends); + } + + public default boolean addExtends(Interface intfc, TypeReference ext) { + if (ext != null) { + intfc.getExtends().add(ext); + return intfc.getExtends().contains(ext); + } + return true; + } + + public default boolean addExtends(Interface intfc, TypeReference[] exts) { + return this.doMultipleModifications(intfc, exts, this::addExtends); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/InterfaceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/InterfaceInitialiser.java new file mode 100644 index 0000000000..da4fdb2809 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/InterfaceInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.classifiers; + +import org.emftext.language.java.classifiers.ClassifiersFactory; +import org.emftext.language.java.classifiers.Interface; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class InterfaceInitialiser extends AbstractInitialiserBase implements IInterfaceInitialiser { + @Override + public Interface instantiate() { + var fac = ClassifiersFactory.eINSTANCE; + return fac.createInterface(); + } + + @Override + public InterfaceInitialiser newInitialiser() { + return new InterfaceInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/package-info.java new file mode 100644 index 0000000000..d93f4a1234 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/classifiers/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.classifiers}. + */ +package cipm.consistency.initialisers.jamopp.classifiers; \ No newline at end of file From cffe62385e62b51327d54511617b06d7b3cbad1c Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:35:43 +0200 Subject: [PATCH 16/87] (WIP) Implement initialiser package for org.emftext.language.java.containers --- .../CompilationUnitInitialiser.java | 19 +++++++ .../ContainersInitialiserPackage.java | 21 ++++++++ .../containers/EmptyModelInitialiser.java | 18 +++++++ .../ICompilationUnitInitialiser.java | 22 ++++++++ .../containers/IEmptyModelInitialiser.java | 9 ++++ .../containers/IJavaRootInitialiser.java | 20 +++++++ .../jamopp/containers/IModuleInitialiser.java | 40 ++++++++++++++ .../containers/IPackageInitialiser.java | 54 +++++++++++++++++++ .../jamopp/containers/ModuleInitialiser.java | 19 +++++++ .../jamopp/containers/PackageInitialiser.java | 19 +++++++ .../jamopp/containers/package-info.java | 5 ++ 11 files changed, 246 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/CompilationUnitInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ContainersInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/EmptyModelInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ICompilationUnitInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IEmptyModelInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IJavaRootInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IModuleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IPackageInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ModuleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/PackageInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/CompilationUnitInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/CompilationUnitInitialiser.java new file mode 100644 index 0000000000..74180fcb86 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/CompilationUnitInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.containers.CompilationUnit; +import org.emftext.language.java.containers.ContainersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class CompilationUnitInitialiser extends AbstractInitialiserBase implements ICompilationUnitInitialiser { + @Override + public CompilationUnit instantiate() { + var fac = ContainersFactory.eINSTANCE; + return fac.createCompilationUnit(); + } + + @Override + public ICompilationUnitInitialiser newInitialiser() { + return new CompilationUnitInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ContainersInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ContainersInitialiserPackage.java new file mode 100644 index 0000000000..e4297bcd3a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ContainersInitialiserPackage.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ContainersInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new CompilationUnitInitialiser(), new EmptyModelInitialiser(), + new ModuleInitialiser(), new PackageInitialiser() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { ICompilationUnitInitialiser.class, IEmptyModelInitialiser.class, + IJavaRootInitialiser.class, IModuleInitialiser.class, IPackageInitialiser.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/EmptyModelInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/EmptyModelInitialiser.java new file mode 100644 index 0000000000..1589d25ca9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/EmptyModelInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.containers.ContainersFactory; +import org.emftext.language.java.containers.EmptyModel; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class EmptyModelInitialiser extends AbstractInitialiserBase implements IEmptyModelInitialiser { + @Override + public IEmptyModelInitialiser newInitialiser() { + return new EmptyModelInitialiser(); + } + + @Override + public EmptyModel instantiate() { + return ContainersFactory.eINSTANCE.createEmptyModel(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ICompilationUnitInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ICompilationUnitInitialiser.java new file mode 100644 index 0000000000..67414db54f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ICompilationUnitInitialiser.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.containers.CompilationUnit; + +public interface ICompilationUnitInitialiser extends IJavaRootInitialiser { + @Override + public CompilationUnit instantiate(); + + public default boolean addClassifier(CompilationUnit cu, ConcreteClassifier cls) { + if (cls != null) { + cu.getClassifiers().add(cls); + return cu.getClassifiers().contains(cls) && cu.getContainedClassifier(cls.getQualifiedName()) != null + && cu.getContainedClassifier(cls.getQualifiedName()).equals(cls); + } + return true; + } + + public default boolean addClassifiers(CompilationUnit cu, ConcreteClassifier[] clss) { + return this.doMultipleModifications(cu, clss, this::addClassifier); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IEmptyModelInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IEmptyModelInitialiser.java new file mode 100644 index 0000000000..3f85c41b3f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IEmptyModelInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.containers.EmptyModel; + +public interface IEmptyModelInitialiser extends IJavaRootInitialiser { + @Override + public EmptyModel instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IJavaRootInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IJavaRootInitialiser.java new file mode 100644 index 0000000000..ba6b8d2941 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IJavaRootInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.containers.JavaRoot; +import org.emftext.language.java.containers.Origin; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; +import cipm.consistency.initialisers.jamopp.commons.INamedElementInitialiser; +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; +import cipm.consistency.initialisers.jamopp.imports.IImportingElementInitialiser; + +public interface IJavaRootInitialiser extends INamedElementInitialiser, INamespaceAwareElementInitialiser, + IAnnotableInitialiser, IImportingElementInitialiser { + @Override + public JavaRoot instantiate(); + + public default boolean setOrigin(JavaRoot jr, Origin origin) { + jr.setOrigin(origin); + return (origin == null && jr.getOrigin() == null) || jr.getOrigin().equals(origin); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IModuleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IModuleInitialiser.java new file mode 100644 index 0000000000..2509f04c44 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IModuleInitialiser.java @@ -0,0 +1,40 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.containers.Module; +import org.emftext.language.java.containers.Package; +import org.emftext.language.java.modifiers.Open; +import org.emftext.language.java.modules.ModuleDirective; + +public interface IModuleInitialiser extends IJavaRootInitialiser { + @Override + public Module instantiate(); + + public default boolean setOpen(Module mod, Open open) { + mod.setOpen(open); + return (open == null && mod.getOpen() == null) || mod.getOpen().equals(open); + } + + public default boolean addTarget(Module mod, ModuleDirective target) { + if (target != null) { + mod.getTarget().add(target); + return mod.getTarget().contains(target); + } + return true; + } + + public default boolean addTargets(Module mod, ModuleDirective[] targets) { + return this.doMultipleModifications(mod, targets, this::addTarget); + } + + public default boolean addPackage(Module mod, Package pac) { + if (pac != null) { + mod.getPackages().add(pac); + return mod.getPackages().contains(pac); + } + return true; + } + + public default boolean addPackages(Module mod, Package[] pacs) { + return this.doMultipleModifications(mod, pacs, this::addPackage); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IPackageInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IPackageInitialiser.java new file mode 100644 index 0000000000..a7e605cbf5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/IPackageInitialiser.java @@ -0,0 +1,54 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.commons.NamedElement; +import org.emftext.language.java.containers.Module; +import org.emftext.language.java.containers.Package; + +import cipm.consistency.initialisers.jamopp.references.IReferenceableElementInitialiser; + +/** + * An interface meant to be implemented by {@link IInitialiser} implementors + * that are supposed to create {@link Package} instances.
+ *
+ * Note: Package names {@code package.getName()} is supposed to be left + * empty. Changing it HAS NO EFFECT on the name of the package in similarity + * checking. Package's name consists of the concatenation of its namespaces with + * dots ".". Therefore, use + * {@link #addNamespace(org.emftext.language.java.commons.NamespaceAwareElement, String)} + * to modify its name. + * + * @author Alp Torac Genc + */ +public interface IPackageInitialiser extends IJavaRootInitialiser, IReferenceableElementInitialiser { + @Override + public Package instantiate(); + + /** + * @return False, because the return value of {@code package.getName()} is + * determined by the namespaces of the package instead. + * + * @see {@link IPackageInitialiser} + */ + @Override + public default boolean canSetName(NamedElement ne) { + return false; + } + + public default boolean setModule(Package pac, Module mod) { + pac.setModule(mod); + return (mod == null && pac.getModule() == null) || pac.getModule().equals(mod); + } + + public default boolean addClassifier(Package pac, ConcreteClassifier cls) { + if (cls != null) { + pac.getClassifiers().add(cls); + return pac.getClassifiers().contains(cls); + } + return true; + } + + public default boolean addClassifiers(Package pac, ConcreteClassifier[] clss) { + return this.doMultipleModifications(pac, clss, this::addClassifier); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ModuleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ModuleInitialiser.java new file mode 100644 index 0000000000..b3fae657d8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/ModuleInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.containers.ContainersFactory; +import org.emftext.language.java.containers.Module; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ModuleInitialiser extends AbstractInitialiserBase implements IModuleInitialiser { + @Override + public Module instantiate() { + var fac = ContainersFactory.eINSTANCE; + return fac.createModule(); + } + + @Override + public IModuleInitialiser newInitialiser() { + return new ModuleInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/PackageInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/PackageInitialiser.java new file mode 100644 index 0000000000..d7703c1dc0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/PackageInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.containers; + +import org.emftext.language.java.containers.ContainersFactory; +import org.emftext.language.java.containers.Package; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PackageInitialiser extends AbstractInitialiserBase implements IPackageInitialiser { + @Override + public Package instantiate() { + var fac = ContainersFactory.eINSTANCE; + return fac.createPackage(); + } + + @Override + public IPackageInitialiser newInitialiser() { + return new PackageInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/package-info.java new file mode 100644 index 0000000000..38e5ae774d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/containers/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.containers}. + */ +package cipm.consistency.initialisers.jamopp.containers; \ No newline at end of file From 29b158f9b9a2ae63857b0c622d5eff3b0d3559d0 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:36:01 +0200 Subject: [PATCH 17/87] (WIP) Implement initialiser package for org.emftext.language.java.expressions --- .../AdditiveExpressionInitialiser.java | 19 +++++++ .../expressions/AndExpressionInitialiser.java | 18 +++++++ ...tructorReferenceExpressionInitialiser.java | 19 +++++++ .../AssignmentExpressionInitialiser.java | 20 +++++++ .../CastExpressionInitialiser.java | 18 +++++++ ...tructorReferenceExpressionInitialiser.java | 19 +++++++ .../ConditionalAndExpressionInitialiser.java | 19 +++++++ .../ConditionalExpressionInitialiser.java | 19 +++++++ .../ConditionalOrExpressionInitialiser.java | 19 +++++++ .../EqualityExpressionInitialiser.java | 18 +++++++ .../ExclusiveOrExpressionInitialiser.java | 19 +++++++ ...citlyTypedLambdaParametersInitialiser.java | 19 +++++++ .../ExpressionListInitialiser.java | 18 +++++++ .../ExpressionsInitialiserPackage.java | 54 +++++++++++++++++++ .../IAdditiveExpressionChildInitialiser.java | 9 ++++ .../IAdditiveExpressionInitialiser.java | 34 ++++++++++++ .../IAndExpressionChildInitialiser.java | 9 ++++ .../IAndExpressionInitialiser.java | 21 ++++++++ ...tructorReferenceExpressionInitialiser.java | 11 ++++ ...IAssignmentExpressionChildInitialiser.java | 10 ++++ .../IAssignmentExpressionInitialiser.java | 26 +++++++++ .../ICastExpressionInitialiser.java | 49 +++++++++++++++++ ...tructorReferenceExpressionInitialiser.java | 12 +++++ ...ditionalAndExpressionChildInitialiser.java | 9 ++++ .../IConditionalAndExpressionInitialiser.java | 21 ++++++++ ...ConditionalExpressionChildInitialiser.java | 9 ++++ .../IConditionalExpressionInitialiser.java | 32 +++++++++++ ...nditionalOrExpressionChildInitialiser.java | 9 ++++ .../IConditionalOrExpressionInitialiser.java | 21 ++++++++ .../IEqualityExpressionChildInitialiser.java | 9 ++++ .../IEqualityExpressionInitialiser.java | 34 ++++++++++++ ...ExclusiveOrExpressionChildInitialiser.java | 9 ++++ .../IExclusiveOrExpressionInitialiser.java | 21 ++++++++ ...citlyTypedLambdaParametersInitialiser.java | 8 +++ .../expressions/IExpressionInitialiser.java | 10 ++++ .../IExpressionListInitialiser.java | 23 ++++++++ ...citlyTypedLambdaParametersInitialiser.java | 8 +++ ...InclusiveOrExpressionChildInitialiser.java | 9 ++++ .../IInclusiveOrExpressionInitialiser.java | 21 ++++++++ ...IInstanceOfExpressionChildInitialiser.java | 9 ++++ .../IInstanceOfExpressionInitialiser.java | 17 ++++++ .../expressions/ILambdaBodyInitialiser.java | 11 ++++ .../ILambdaExpressionInitialiser.java | 20 +++++++ .../ILambdaParametersInitialiser.java | 11 ++++ ...odReferenceExpressionChildInitialiser.java | 9 ++++ ...IMethodReferenceExpressionInitialiser.java | 9 ++++ ...tiplicativeExpressionChildInitialiser.java | 9 ++++ .../IMultiplicativeExpressionInitialiser.java | 34 ++++++++++++ .../INestedExpressionInitialiser.java | 16 ++++++ ...naryModificationExpressionInitialiser.java | 9 ++++ .../IPrimaryExpressionInitialiser.java | 9 ++++ ...ressionReferenceExpressionInitialiser.java | 23 ++++++++ .../IRelationExpressionChildInitialiser.java | 9 ++++ .../IRelationExpressionInitialiser.java | 34 ++++++++++++ .../IShiftExpressionChildInitialiser.java | 9 ++++ .../IShiftExpressionInitialiser.java | 34 ++++++++++++ ...gleImplicitLambdaParameterInitialiser.java | 8 +++ ...naryModificationExpressionInitialiser.java | 9 ++++ .../IUnaryExpressionChildInitialiser.java | 9 ++++ .../IUnaryExpressionInitialiser.java | 27 ++++++++++ ...odificationExpressionChildInitialiser.java | 9 ++++ ...naryModificationExpressionInitialiser.java | 20 +++++++ ...citlyTypedLambdaParametersInitialiser.java | 19 +++++++ .../InclusiveOrExpressionInitialiser.java | 19 +++++++ .../InstanceOfExpressionInitialiser.java | 19 +++++++ .../LambdaExpressionInitialiser.java | 20 +++++++ .../MultiplicativeExpressionInitialiser.java | 19 +++++++ .../NestedExpressionInitialiser.java | 18 +++++++ ...naryModificationExpressionInitialiser.java | 19 +++++++ ...ressionReferenceExpressionInitialiser.java | 19 +++++++ .../RelationExpressionInitialiser.java | 18 +++++++ .../ShiftExpressionInitialiser.java | 18 +++++++ ...gleImplicitLambdaParameterInitialiser.java | 19 +++++++ ...naryModificationExpressionInitialiser.java | 19 +++++++ .../UnaryExpressionInitialiser.java | 18 +++++++ .../jamopp/expressions/package-info.java | 5 ++ 76 files changed, 1335 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AdditiveExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AndExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ArrayConstructorReferenceExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AssignmentExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/CastExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ClassTypeConstructorReferenceExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalAndExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalOrExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/EqualityExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExclusiveOrExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExplicitlyTypedLambdaParametersInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionListInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IArrayConstructorReferenceExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ICastExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IClassTypeConstructorReferenceExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExplicitlyTypedLambdaParametersInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionListInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IImplicitlyTypedLambdaParametersInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaBodyInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaParametersInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/INestedExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrefixUnaryModificationExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionReferenceExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISingleImplicitLambdaParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISuffixUnaryModificationExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionChildInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ImplicitlyTypedLambdaParametersInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InclusiveOrExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InstanceOfExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/LambdaExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/MultiplicativeExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/NestedExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrefixUnaryModificationExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrimaryExpressionReferenceExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/RelationExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ShiftExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SingleImplicitLambdaParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SuffixUnaryModificationExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/UnaryExpressionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AdditiveExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AdditiveExpressionInitialiser.java new file mode 100644 index 0000000000..ff852e645e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AdditiveExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.expressions.AdditiveExpression; + +public class AdditiveExpressionInitialiser extends AbstractInitialiserBase implements IAdditiveExpressionInitialiser { + @Override + public IAdditiveExpressionInitialiser newInitialiser() { + return new AdditiveExpressionInitialiser(); + } + + @Override + public AdditiveExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createAdditiveExpression(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AndExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AndExpressionInitialiser.java new file mode 100644 index 0000000000..2aea4bd856 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AndExpressionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AndExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class AndExpressionInitialiser extends AbstractInitialiserBase implements IAndExpressionInitialiser { + @Override + public IAndExpressionInitialiser newInitialiser() { + return new AndExpressionInitialiser(); + } + + @Override + public AndExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createAndExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ArrayConstructorReferenceExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ArrayConstructorReferenceExpressionInitialiser.java new file mode 100644 index 0000000000..d93075cbea --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ArrayConstructorReferenceExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ArrayConstructorReferenceExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ArrayConstructorReferenceExpressionInitialiser extends AbstractInitialiserBase + implements IArrayConstructorReferenceExpressionInitialiser { + @Override + public IArrayConstructorReferenceExpressionInitialiser newInitialiser() { + return new ArrayConstructorReferenceExpressionInitialiser(); + } + + @Override + public ArrayConstructorReferenceExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createArrayConstructorReferenceExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AssignmentExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AssignmentExpressionInitialiser.java new file mode 100644 index 0000000000..128b436f8f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/AssignmentExpressionInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.expressions.AssignmentExpression; + +public class AssignmentExpressionInitialiser extends AbstractInitialiserBase + implements IAssignmentExpressionInitialiser { + @Override + public IAssignmentExpressionInitialiser newInitialiser() { + return new AssignmentExpressionInitialiser(); + } + + @Override + public AssignmentExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createAssignmentExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/CastExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/CastExpressionInitialiser.java new file mode 100644 index 0000000000..d92d254e8a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/CastExpressionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.CastExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class CastExpressionInitialiser extends AbstractInitialiserBase implements ICastExpressionInitialiser { + @Override + public ICastExpressionInitialiser newInitialiser() { + return new CastExpressionInitialiser(); + } + + @Override + public CastExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createCastExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ClassTypeConstructorReferenceExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ClassTypeConstructorReferenceExpressionInitialiser.java new file mode 100644 index 0000000000..79ac600d35 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ClassTypeConstructorReferenceExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ClassTypeConstructorReferenceExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ClassTypeConstructorReferenceExpressionInitialiser extends AbstractInitialiserBase + implements IClassTypeConstructorReferenceExpressionInitialiser { + @Override + public IClassTypeConstructorReferenceExpressionInitialiser newInitialiser() { + return new ClassTypeConstructorReferenceExpressionInitialiser(); + } + + @Override + public ClassTypeConstructorReferenceExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createClassTypeConstructorReferenceExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalAndExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalAndExpressionInitialiser.java new file mode 100644 index 0000000000..00db270c26 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalAndExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalAndExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ConditionalAndExpressionInitialiser extends AbstractInitialiserBase + implements IConditionalAndExpressionInitialiser { + @Override + public IConditionalAndExpressionInitialiser newInitialiser() { + return new ConditionalAndExpressionInitialiser(); + } + + @Override + public ConditionalAndExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createConditionalAndExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalExpressionInitialiser.java new file mode 100644 index 0000000000..4f49051bf7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ConditionalExpressionInitialiser extends AbstractInitialiserBase + implements IConditionalExpressionInitialiser { + @Override + public IConditionalExpressionInitialiser newInitialiser() { + return new ConditionalExpressionInitialiser(); + } + + @Override + public ConditionalExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createConditionalExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalOrExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalOrExpressionInitialiser.java new file mode 100644 index 0000000000..5fd7e9b375 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ConditionalOrExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalOrExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ConditionalOrExpressionInitialiser extends AbstractInitialiserBase + implements IConditionalOrExpressionInitialiser { + @Override + public IConditionalOrExpressionInitialiser newInitialiser() { + return new ConditionalOrExpressionInitialiser(); + } + + @Override + public ConditionalOrExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createConditionalOrExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/EqualityExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/EqualityExpressionInitialiser.java new file mode 100644 index 0000000000..8658bbe0e2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/EqualityExpressionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.EqualityExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class EqualityExpressionInitialiser extends AbstractInitialiserBase implements IEqualityExpressionInitialiser { + @Override + public IEqualityExpressionInitialiser newInitialiser() { + return new EqualityExpressionInitialiser(); + } + + @Override + public EqualityExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createEqualityExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExclusiveOrExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExclusiveOrExpressionInitialiser.java new file mode 100644 index 0000000000..81695281a5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExclusiveOrExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExclusiveOrExpression; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ExclusiveOrExpressionInitialiser extends AbstractInitialiserBase + implements IExclusiveOrExpressionInitialiser { + @Override + public IExclusiveOrExpressionInitialiser newInitialiser() { + return new ExclusiveOrExpressionInitialiser(); + } + + @Override + public ExclusiveOrExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createExclusiveOrExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExplicitlyTypedLambdaParametersInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExplicitlyTypedLambdaParametersInitialiser.java new file mode 100644 index 0000000000..7de0a674fb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExplicitlyTypedLambdaParametersInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExplicitlyTypedLambdaParameters; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ExplicitlyTypedLambdaParametersInitialiser extends AbstractInitialiserBase + implements IExplicitlyTypedLambdaParametersInitialiser { + @Override + public IExplicitlyTypedLambdaParametersInitialiser newInitialiser() { + return new ExplicitlyTypedLambdaParametersInitialiser(); + } + + @Override + public ExplicitlyTypedLambdaParameters instantiate() { + return ExpressionsFactory.eINSTANCE.createExplicitlyTypedLambdaParameters(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionListInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionListInitialiser.java new file mode 100644 index 0000000000..26697a7211 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionListInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionList; +import org.emftext.language.java.expressions.ExpressionsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ExpressionListInitialiser extends AbstractInitialiserBase implements IExpressionListInitialiser { + @Override + public IExpressionListInitialiser newInitialiser() { + return new ExpressionListInitialiser(); + } + + @Override + public ExpressionList instantiate() { + return ExpressionsFactory.eINSTANCE.createExpressionList(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionsInitialiserPackage.java new file mode 100644 index 0000000000..73461eb5aa --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ExpressionsInitialiserPackage.java @@ -0,0 +1,54 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ExpressionsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new AdditiveExpressionInitialiser(), new AndExpressionInitialiser(), + new ArrayConstructorReferenceExpressionInitialiser(), new AssignmentExpressionInitialiser(), + new CastExpressionInitialiser(), new ClassTypeConstructorReferenceExpressionInitialiser(), + new ConditionalAndExpressionInitialiser(), new ConditionalExpressionInitialiser(), + new ConditionalOrExpressionInitialiser(), new EqualityExpressionInitialiser(), + new ExclusiveOrExpressionInitialiser(), new ExplicitlyTypedLambdaParametersInitialiser(), + new ExpressionListInitialiser(), new ImplicitlyTypedLambdaParametersInitialiser(), + new InclusiveOrExpressionInitialiser(), new InstanceOfExpressionInitialiser(), + new LambdaExpressionInitialiser(), new MultiplicativeExpressionInitialiser(), + new NestedExpressionInitialiser(), new PrefixUnaryModificationExpressionInitialiser(), + new PrimaryExpressionReferenceExpressionInitialiser(), new RelationExpressionInitialiser(), + new ShiftExpressionInitialiser(), new SingleImplicitLambdaParameterInitialiser(), + new SuffixUnaryModificationExpressionInitialiser(), new UnaryExpressionInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAdditiveExpressionChildInitialiser.class, + IAdditiveExpressionInitialiser.class, IAndExpressionChildInitialiser.class, + IAndExpressionInitialiser.class, IArrayConstructorReferenceExpressionInitialiser.class, + IAssignmentExpressionChildInitialiser.class, IAssignmentExpressionInitialiser.class, + ICastExpressionInitialiser.class, IClassTypeConstructorReferenceExpressionInitialiser.class, + IConditionalAndExpressionChildInitialiser.class, IConditionalAndExpressionInitialiser.class, + IConditionalExpressionChildInitialiser.class, IConditionalExpressionInitialiser.class, + IConditionalOrExpressionChildInitialiser.class, IConditionalOrExpressionInitialiser.class, + IEqualityExpressionChildInitialiser.class, IEqualityExpressionInitialiser.class, + IExclusiveOrExpressionChildInitialiser.class, IExclusiveOrExpressionInitialiser.class, + IExplicitlyTypedLambdaParametersInitialiser.class, IExpressionInitialiser.class, + IExpressionListInitialiser.class, IImplicitlyTypedLambdaParametersInitialiser.class, + IInclusiveOrExpressionChildInitialiser.class, IInclusiveOrExpressionInitialiser.class, + IInstanceOfExpressionChildInitialiser.class, IInstanceOfExpressionInitialiser.class, + ILambdaBodyInitialiser.class, ILambdaExpressionInitialiser.class, ILambdaParametersInitialiser.class, + IMethodReferenceExpressionChildInitialiser.class, IMethodReferenceExpressionInitialiser.class, + IMultiplicativeExpressionChildInitialiser.class, IMultiplicativeExpressionInitialiser.class, + INestedExpressionInitialiser.class, IPrefixUnaryModificationExpressionInitialiser.class, + IPrimaryExpressionInitialiser.class, IPrimaryExpressionReferenceExpressionInitialiser.class, + IRelationExpressionChildInitialiser.class, IRelationExpressionInitialiser.class, + IShiftExpressionChildInitialiser.class, IShiftExpressionInitialiser.class, + ISingleImplicitLambdaParameterInitialiser.class, ISuffixUnaryModificationExpressionInitialiser.class, + IUnaryExpressionChildInitialiser.class, IUnaryExpressionInitialiser.class, + IUnaryModificationExpressionChildInitialiser.class, IUnaryModificationExpressionInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionChildInitialiser.java new file mode 100644 index 0000000000..979101f307 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AdditiveExpressionChild; + +public interface IAdditiveExpressionChildInitialiser extends IShiftExpressionChildInitialiser { + @Override + public AdditiveExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionInitialiser.java new file mode 100644 index 0000000000..169acc2732 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAdditiveExpressionInitialiser.java @@ -0,0 +1,34 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AdditiveExpression; +import org.emftext.language.java.expressions.AdditiveExpressionChild; +import org.emftext.language.java.operators.AdditiveOperator; + +public interface IAdditiveExpressionInitialiser extends IShiftExpressionChildInitialiser { + @Override + public AdditiveExpression instantiate(); + + public default boolean addAdditiveOperator(AdditiveExpression ae, AdditiveOperator op) { + if (op != null) { + ae.getAdditiveOperators().add(op); + return ae.getAdditiveOperators().contains(op); + } + return true; + } + + public default boolean addAdditiveOperators(AdditiveExpression ae, AdditiveOperator[] ops) { + return this.doMultipleModifications(ae, ops, this::addAdditiveOperator); + } + + public default boolean addChild(AdditiveExpression ae, AdditiveExpressionChild child) { + if (child != null) { + ae.getChildren().add(child); + return ae.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(AdditiveExpression ae, AdditiveExpressionChild[] children) { + return this.doMultipleModifications(ae, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionChildInitialiser.java new file mode 100644 index 0000000000..a7343a1151 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AndExpressionChild; + +public interface IAndExpressionChildInitialiser extends IExclusiveOrExpressionChildInitialiser { + @Override + public AndExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionInitialiser.java new file mode 100644 index 0000000000..2b7f69aa32 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAndExpressionInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AndExpression; +import org.emftext.language.java.expressions.AndExpressionChild; + +public interface IAndExpressionInitialiser extends IExclusiveOrExpressionChildInitialiser { + @Override + public AndExpression instantiate(); + + public default boolean addChild(AndExpression ae, AndExpressionChild child) { + if (child != null) { + ae.getChildren().add(child); + return ae.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(AndExpression ae, AndExpressionChild[] children) { + return this.doMultipleModifications(ae, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IArrayConstructorReferenceExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IArrayConstructorReferenceExpressionInitialiser.java new file mode 100644 index 0000000000..8a6367ab26 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IArrayConstructorReferenceExpressionInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ArrayConstructorReferenceExpression; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IArrayConstructorReferenceExpressionInitialiser + extends IMethodReferenceExpressionInitialiser, ITypedElementInitialiser { + @Override + public ArrayConstructorReferenceExpression instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionChildInitialiser.java new file mode 100644 index 0000000000..1b8e2f5928 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionChildInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AssignmentExpressionChild; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotationValueInitialiser; + +public interface IAssignmentExpressionChildInitialiser extends IAnnotationValueInitialiser, IExpressionInitialiser { + @Override + public AssignmentExpressionChild instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionInitialiser.java new file mode 100644 index 0000000000..89fbd8b5b5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IAssignmentExpressionInitialiser.java @@ -0,0 +1,26 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AssignmentExpression; +import org.emftext.language.java.expressions.AssignmentExpressionChild; +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.operators.AssignmentOperator; + +public interface IAssignmentExpressionInitialiser extends IExpressionInitialiser { + @Override + public AssignmentExpression instantiate(); + + public default boolean setAssignmentOperator(AssignmentExpression ae, AssignmentOperator op) { + ae.setAssignmentOperator(op); + return (op == null && ae.getAssignmentOperator() == null) || ae.getAssignmentOperator().equals(op); + } + + public default boolean setChild(AssignmentExpression ae, AssignmentExpressionChild child) { + ae.setChild(child); + return (child == null && ae.getChild() == null) || ae.getChild().equals(child); + } + + public default boolean setValue(AssignmentExpression ae, Expression val) { + ae.setValue(val); + return (val == null && ae.getValue() == null) || ae.getValue().equals(val); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ICastExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ICastExpressionInitialiser.java new file mode 100644 index 0000000000..c77cfb6296 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ICastExpressionInitialiser.java @@ -0,0 +1,49 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.CastExpression; +import org.emftext.language.java.expressions.MultiplicativeExpressionChild; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +/** + * An interface meant to be implemented by initialisers, which are supposed to + * create {@link CastExpression} instances.
+ *
+ * For a {@link CastExpression} instance ce, {@code ce.getChild()} has the same + * return value as {@code ce.getGeneralChild()}, it merely returns the child + * attribute as {@link Expression} rather than + * {@link MultiplicativeExpressionChild}.
+ *
+ * Similarly, {@code ce.setGeneralChild(...)} is equivalent to + * {@code ce.setChild(...)}, just with a more general parameter type. + * + * @author Alp Torac Genc + */ +public interface ICastExpressionInitialiser + extends ITypedElementInitialiser, IUnaryModificationExpressionChildInitialiser { + @Override + public CastExpression instantiate(); + + public default boolean addAdditionalBound(CastExpression ce, TypeReference additionalBounds) { + if (additionalBounds != null) { + ce.getAdditionalBounds().add(additionalBounds); + return ce.getAdditionalBounds().contains(additionalBounds); + } + return true; + } + + public default boolean addAdditionalBounds(CastExpression ce, TypeReference[] additionalBoundsArr) { + return this.doMultipleModifications(ce, additionalBoundsArr, this::addAdditionalBound); + } + + /** + * Adds the given child to ce. Uses {@code ce.setChild(...)} to do so. + * + * @see {@link ICastExpressionInitialiser} + */ + public default boolean setChild(CastExpression ce, MultiplicativeExpressionChild child) { + ce.setChild(child); + return (child == null && ce.getChild() == null) || ce.getChild().equals(child); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IClassTypeConstructorReferenceExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IClassTypeConstructorReferenceExpressionInitialiser.java new file mode 100644 index 0000000000..9f3c882f1b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IClassTypeConstructorReferenceExpressionInitialiser.java @@ -0,0 +1,12 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ClassTypeConstructorReferenceExpression; + +import cipm.consistency.initialisers.jamopp.generics.ICallTypeArgumentableInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IClassTypeConstructorReferenceExpressionInitialiser + extends ICallTypeArgumentableInitialiser, IMethodReferenceExpressionInitialiser, ITypedElementInitialiser { + @Override + public ClassTypeConstructorReferenceExpression instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionChildInitialiser.java new file mode 100644 index 0000000000..3386c67b3e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalAndExpressionChild; + +public interface IConditionalAndExpressionChildInitialiser extends IConditionalOrExpressionChildInitialiser { + @Override + public ConditionalAndExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionInitialiser.java new file mode 100644 index 0000000000..6cfc77f3b1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalAndExpressionInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalAndExpression; +import org.emftext.language.java.expressions.ConditionalAndExpressionChild; + +public interface IConditionalAndExpressionInitialiser extends IConditionalOrExpressionChildInitialiser { + @Override + public ConditionalAndExpression instantiate(); + + public default boolean addChild(ConditionalAndExpression cae, ConditionalAndExpressionChild child) { + if (child != null) { + cae.getChildren().add(child); + return cae.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(ConditionalAndExpression cae, ConditionalAndExpressionChild[] children) { + return this.doMultipleModifications(cae, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionChildInitialiser.java new file mode 100644 index 0000000000..6ae4d3b1cc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalExpressionChild; + +public interface IConditionalExpressionChildInitialiser extends IAssignmentExpressionChildInitialiser { + @Override + public ConditionalExpressionChild instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionInitialiser.java new file mode 100644 index 0000000000..00f51ddb77 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalExpressionInitialiser.java @@ -0,0 +1,32 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.AssignmentExpressionChild; +import org.emftext.language.java.expressions.ConditionalExpression; +import org.emftext.language.java.expressions.ConditionalExpressionChild; +import org.emftext.language.java.expressions.Expression; + +public interface IConditionalExpressionInitialiser extends IAssignmentExpressionChildInitialiser { + @Override + public ConditionalExpression instantiate(); + + public default boolean setChild(ConditionalExpression ce, ConditionalExpressionChild child) { + ce.setChild(child); + return (child == null && ce.getChild() == null) || ce.getChild().equals(child); + } + + public default boolean setExpressionChild(ConditionalExpression ce, AssignmentExpressionChild exprChild) { + ce.setExpressionChild(exprChild); + return (exprChild == null && ce.getExpressionElse() == null) || ce.getExpressionElse().equals(exprChild); + } + + public default boolean setExpressionIf(ConditionalExpression ce, Expression exprIf) { + ce.setExpressionIf(exprIf); + return (exprIf == null && ce.getExpressionIf() == null) || ce.getExpressionIf().equals(exprIf); + } + + public default boolean setGeneralExpressionElse(ConditionalExpression ce, Expression generalExprElse) { + ce.setGeneralExpressionElse(generalExprElse); + return (generalExprElse == null && ce.getGeneralExpressionElse() == null) + || ce.getGeneralExpressionElse().equals(generalExprElse); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionChildInitialiser.java new file mode 100644 index 0000000000..52c8f44f9d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalOrExpressionChild; + +public interface IConditionalOrExpressionChildInitialiser extends IConditionalExpressionChildInitialiser { + @Override + public ConditionalOrExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionInitialiser.java new file mode 100644 index 0000000000..fd5400d256 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IConditionalOrExpressionInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ConditionalOrExpression; +import org.emftext.language.java.expressions.ConditionalOrExpressionChild; + +public interface IConditionalOrExpressionInitialiser extends IConditionalExpressionChildInitialiser { + @Override + public ConditionalOrExpression instantiate(); + + public default boolean addChild(ConditionalOrExpression coe, ConditionalOrExpressionChild child) { + if (child != null) { + coe.getChildren().add(child); + return coe.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(ConditionalOrExpression coe, ConditionalOrExpressionChild[] children) { + return this.doMultipleModifications(coe, children, this::addChild); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionChildInitialiser.java new file mode 100644 index 0000000000..783d40ebf0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.EqualityExpressionChild; + +public interface IEqualityExpressionChildInitialiser extends IAndExpressionChildInitialiser { + @Override + public EqualityExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionInitialiser.java new file mode 100644 index 0000000000..f71c43da54 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IEqualityExpressionInitialiser.java @@ -0,0 +1,34 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.EqualityExpression; +import org.emftext.language.java.expressions.EqualityExpressionChild; +import org.emftext.language.java.operators.EqualityOperator; + +public interface IEqualityExpressionInitialiser extends IAndExpressionChildInitialiser { + @Override + public EqualityExpression instantiate(); + + public default boolean addEqualityOperator(EqualityExpression eqEx, EqualityOperator op) { + if (op != null) { + eqEx.getEqualityOperators().add(op); + return eqEx.getEqualityOperators().contains(op); + } + return true; + } + + public default boolean addChild(EqualityExpression eqEx, EqualityExpressionChild child) { + if (child != null) { + eqEx.getChildren().add(child); + return eqEx.getChildren().contains(child); + } + return true; + } + + public default boolean addEqualityOperators(EqualityExpression eqEx, EqualityOperator[] ops) { + return this.doMultipleModifications(eqEx, ops, this::addEqualityOperator); + } + + public default boolean addChildren(EqualityExpression eqEx, EqualityExpressionChild[] children) { + return this.doMultipleModifications(eqEx, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionChildInitialiser.java new file mode 100644 index 0000000000..08415382a9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExclusiveOrExpressionChild; + +public interface IExclusiveOrExpressionChildInitialiser extends IInclusiveOrExpressionChildInitialiser { + @Override + public ExclusiveOrExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionInitialiser.java new file mode 100644 index 0000000000..98fde0fdeb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExclusiveOrExpressionInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExclusiveOrExpression; +import org.emftext.language.java.expressions.ExclusiveOrExpressionChild; + +public interface IExclusiveOrExpressionInitialiser extends IInclusiveOrExpressionChildInitialiser { + @Override + public ExclusiveOrExpression instantiate(); + + public default boolean addChild(ExclusiveOrExpression eoe, ExclusiveOrExpressionChild child) { + if (child != null) { + eoe.getChildren().add(child); + return eoe.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(ExclusiveOrExpression eoe, ExclusiveOrExpressionChild[] children) { + return this.doMultipleModifications(eoe, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExplicitlyTypedLambdaParametersInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExplicitlyTypedLambdaParametersInitialiser.java new file mode 100644 index 0000000000..34f21301c2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExplicitlyTypedLambdaParametersInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExplicitlyTypedLambdaParameters; + +public interface IExplicitlyTypedLambdaParametersInitialiser extends ILambdaParametersInitialiser { + @Override + public ExplicitlyTypedLambdaParameters instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionInitialiser.java new file mode 100644 index 0000000000..d9e72faf47 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.Expression; + +import cipm.consistency.initialisers.jamopp.arrays.IArrayInitializationValueInitialiser; + +public interface IExpressionInitialiser extends IArrayInitializationValueInitialiser, ILambdaBodyInitialiser { + @Override + public Expression instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionListInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionListInitialiser.java new file mode 100644 index 0000000000..cc94f34132 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IExpressionListInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.expressions.ExpressionList; + +import cipm.consistency.initialisers.jamopp.statements.IForLoopInitializerInitialiser; + +public interface IExpressionListInitialiser extends IForLoopInitializerInitialiser { + @Override + public ExpressionList instantiate(); + + public default boolean addExpression(ExpressionList exprList, Expression expr) { + if (expr != null) { + exprList.getExpressions().add(expr); + return exprList.getExpressions().contains(expr); + } + return true; + } + + public default boolean addExpressions(ExpressionList exprList, Expression[] exprs) { + return this.doMultipleModifications(exprList, exprs, this::addExpression); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IImplicitlyTypedLambdaParametersInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IImplicitlyTypedLambdaParametersInitialiser.java new file mode 100644 index 0000000000..83f877410a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IImplicitlyTypedLambdaParametersInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ImplicitlyTypedLambdaParameters; + +public interface IImplicitlyTypedLambdaParametersInitialiser extends ILambdaParametersInitialiser { + @Override + public ImplicitlyTypedLambdaParameters instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionChildInitialiser.java new file mode 100644 index 0000000000..934a69644e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.InclusiveOrExpressionChild; + +public interface IInclusiveOrExpressionChildInitialiser extends IConditionalAndExpressionChildInitialiser { + @Override + public InclusiveOrExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionInitialiser.java new file mode 100644 index 0000000000..6158dbd89f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInclusiveOrExpressionInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.InclusiveOrExpression; +import org.emftext.language.java.expressions.InclusiveOrExpressionChild; + +public interface IInclusiveOrExpressionInitialiser extends IConditionalAndExpressionChildInitialiser { + @Override + public InclusiveOrExpression instantiate(); + + public default boolean addChild(InclusiveOrExpression ioe, InclusiveOrExpressionChild child) { + if (child != null) { + ioe.getChildren().add(child); + return ioe.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(InclusiveOrExpression ioe, InclusiveOrExpressionChild[] children) { + return this.doMultipleModifications(ioe, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionChildInitialiser.java new file mode 100644 index 0000000000..dbeb44c250 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.InstanceOfExpressionChild; + +public interface IInstanceOfExpressionChildInitialiser extends IEqualityExpressionChildInitialiser { + @Override + public InstanceOfExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionInitialiser.java new file mode 100644 index 0000000000..d6fd448497 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IInstanceOfExpressionInitialiser.java @@ -0,0 +1,17 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.InstanceOfExpression; +import org.emftext.language.java.expressions.InstanceOfExpressionChild; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IInstanceOfExpressionInitialiser + extends IEqualityExpressionChildInitialiser, ITypedElementInitialiser { + @Override + public InstanceOfExpression instantiate(); + + public default boolean setChild(InstanceOfExpression ioe, InstanceOfExpressionChild child) { + ioe.setChild(child); + return (child == null && ioe.getChild() == null) || ioe.getChild().equals(child); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaBodyInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaBodyInitialiser.java new file mode 100644 index 0000000000..d7498f5c9a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaBodyInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.LambdaBody; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ILambdaBodyInitialiser extends ICommentableInitialiser { + @Override + public LambdaBody instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaExpressionInitialiser.java new file mode 100644 index 0000000000..a055acaef7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaExpressionInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.LambdaBody; +import org.emftext.language.java.expressions.LambdaExpression; +import org.emftext.language.java.expressions.LambdaParameters; + +public interface ILambdaExpressionInitialiser extends IExpressionInitialiser { + @Override + public LambdaExpression instantiate(); + + public default boolean setBody(LambdaExpression le, LambdaBody body) { + le.setBody(body); + return (body == null && le.getBody() == null) || le.getBody().equals(body); + } + + public default boolean setParameters(LambdaExpression le, LambdaParameters param) { + le.setParameters(param); + return (param == null && le.getParameters() == null) || le.getParameters().equals(param); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaParametersInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaParametersInitialiser.java new file mode 100644 index 0000000000..fc78f7336d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ILambdaParametersInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.LambdaParameters; + +import cipm.consistency.initialisers.jamopp.parameters.IParametrizableInitialiser; + +public interface ILambdaParametersInitialiser extends IParametrizableInitialiser { + @Override + public LambdaParameters instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionChildInitialiser.java new file mode 100644 index 0000000000..ebd83fc9a2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.MethodReferenceExpressionChild; + +public interface IMethodReferenceExpressionChildInitialiser extends IUnaryModificationExpressionChildInitialiser { + @Override + public MethodReferenceExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionInitialiser.java new file mode 100644 index 0000000000..73bb7aaca3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMethodReferenceExpressionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.MethodReferenceExpression; + +public interface IMethodReferenceExpressionInitialiser extends IUnaryModificationExpressionChildInitialiser { + @Override + public MethodReferenceExpression instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionChildInitialiser.java new file mode 100644 index 0000000000..1373fe3155 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.MultiplicativeExpressionChild; + +public interface IMultiplicativeExpressionChildInitialiser extends IAdditiveExpressionChildInitialiser { + @Override + public MultiplicativeExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionInitialiser.java new file mode 100644 index 0000000000..c0e1270feb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IMultiplicativeExpressionInitialiser.java @@ -0,0 +1,34 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.MultiplicativeExpression; +import org.emftext.language.java.expressions.MultiplicativeExpressionChild; +import org.emftext.language.java.operators.MultiplicativeOperator; + +public interface IMultiplicativeExpressionInitialiser extends IAdditiveExpressionChildInitialiser { + @Override + public MultiplicativeExpression instantiate(); + + public default boolean addMultiplicativeOperator(MultiplicativeExpression ae, MultiplicativeOperator op) { + if (op != null) { + ae.getMultiplicativeOperators().add(op); + return ae.getMultiplicativeOperators().contains(op); + } + return true; + } + + public default boolean addMultiplicativeOperators(MultiplicativeExpression ae, MultiplicativeOperator[] ops) { + return this.doMultipleModifications(ae, ops, this::addMultiplicativeOperator); + } + + public default boolean addChild(MultiplicativeExpression ae, MultiplicativeExpressionChild child) { + if (child != null) { + ae.getChildren().add(child); + return ae.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(MultiplicativeExpression ae, MultiplicativeExpressionChild[] children) { + return this.doMultipleModifications(ae, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/INestedExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/INestedExpressionInitialiser.java new file mode 100644 index 0000000000..20f759c777 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/INestedExpressionInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.expressions.NestedExpression; + +import cipm.consistency.initialisers.jamopp.references.IReferenceInitialiser; + +public interface INestedExpressionInitialiser extends IReferenceInitialiser { + @Override + public NestedExpression instantiate(); + + public default boolean setExpression(NestedExpression ne, Expression expr) { + ne.setExpression(expr); + return (expr == null && ne.getExpression() == null) || ne.getExpression().equals(expr); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrefixUnaryModificationExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrefixUnaryModificationExpressionInitialiser.java new file mode 100644 index 0000000000..2cb783c114 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrefixUnaryModificationExpressionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.PrefixUnaryModificationExpression; + +public interface IPrefixUnaryModificationExpressionInitialiser extends IUnaryModificationExpressionInitialiser { + @Override + public PrefixUnaryModificationExpression instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionInitialiser.java new file mode 100644 index 0000000000..1ec6a0d9fb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.PrimaryExpression; + +public interface IPrimaryExpressionInitialiser extends IMethodReferenceExpressionChildInitialiser { + @Override + public PrimaryExpression instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionReferenceExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionReferenceExpressionInitialiser.java new file mode 100644 index 0000000000..03cd0b9e8a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IPrimaryExpressionReferenceExpressionInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.MethodReferenceExpressionChild; +import org.emftext.language.java.expressions.PrimaryExpressionReferenceExpression; +import org.emftext.language.java.references.Reference; + +import cipm.consistency.initialisers.jamopp.generics.ICallTypeArgumentableInitialiser; + +public interface IPrimaryExpressionReferenceExpressionInitialiser + extends ICallTypeArgumentableInitialiser, IMethodReferenceExpressionInitialiser { + @Override + public PrimaryExpressionReferenceExpression instantiate(); + + public default boolean setChild(PrimaryExpressionReferenceExpression pere, MethodReferenceExpressionChild mrec) { + pere.setChild(mrec); + return (mrec == null && pere.getChild() == null) || pere.getChild().equals(mrec); + } + + public default boolean setMethodReference(PrimaryExpressionReferenceExpression pere, Reference metRef) { + pere.setMethodReference(metRef); + return (metRef == null && pere.getMethodReference() == null) || pere.getMethodReference().equals(metRef); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionChildInitialiser.java new file mode 100644 index 0000000000..51ce44e741 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.RelationExpressionChild; + +public interface IRelationExpressionChildInitialiser extends IInstanceOfExpressionChildInitialiser { + @Override + public RelationExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionInitialiser.java new file mode 100644 index 0000000000..78c8870353 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IRelationExpressionInitialiser.java @@ -0,0 +1,34 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.RelationExpression; +import org.emftext.language.java.expressions.RelationExpressionChild; +import org.emftext.language.java.operators.RelationOperator; + +public interface IRelationExpressionInitialiser extends IInstanceOfExpressionChildInitialiser { + @Override + public RelationExpression instantiate(); + + public default boolean addRelationOperator(RelationExpression re, RelationOperator op) { + if (op != null) { + re.getRelationOperators().add(op); + return re.getRelationOperators().contains(op); + } + return true; + } + + public default boolean addRelationOperators(RelationExpression re, RelationOperator[] ops) { + return this.doMultipleModifications(re, ops, this::addRelationOperator); + } + + public default boolean addChild(RelationExpression cae, RelationExpressionChild child) { + if (child != null) { + cae.getChildren().add(child); + return cae.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(RelationExpression cae, RelationExpressionChild[] children) { + return this.doMultipleModifications(cae, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionChildInitialiser.java new file mode 100644 index 0000000000..bef581a0b2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ShiftExpressionChild; + +public interface IShiftExpressionChildInitialiser extends IRelationExpressionChildInitialiser { + @Override + public ShiftExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionInitialiser.java new file mode 100644 index 0000000000..c27fc8225b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IShiftExpressionInitialiser.java @@ -0,0 +1,34 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ShiftExpression; +import org.emftext.language.java.expressions.ShiftExpressionChild; +import org.emftext.language.java.operators.ShiftOperator; + +public interface IShiftExpressionInitialiser extends IRelationExpressionChildInitialiser { + @Override + public ShiftExpression instantiate(); + + public default boolean addShiftOperator(ShiftExpression se, ShiftOperator op) { + if (op != null) { + se.getShiftOperators().add(op); + return se.getShiftOperators().contains(op); + } + return true; + } + + public default boolean addShiftOperators(ShiftExpression se, ShiftOperator[] ops) { + return this.doMultipleModifications(se, ops, this::addShiftOperator); + } + + public default boolean addChild(ShiftExpression se, ShiftExpressionChild child) { + if (child != null) { + se.getChildren().add(child); + return se.getChildren().contains(child); + } + return true; + } + + public default boolean addChildren(ShiftExpression se, ShiftExpressionChild[] children) { + return this.doMultipleModifications(se, children, this::addChild); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISingleImplicitLambdaParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISingleImplicitLambdaParameterInitialiser.java new file mode 100644 index 0000000000..0a42080df4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISingleImplicitLambdaParameterInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.SingleImplicitLambdaParameter; + +public interface ISingleImplicitLambdaParameterInitialiser extends IImplicitlyTypedLambdaParametersInitialiser { + @Override + public SingleImplicitLambdaParameter instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISuffixUnaryModificationExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISuffixUnaryModificationExpressionInitialiser.java new file mode 100644 index 0000000000..6cf7f829f2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ISuffixUnaryModificationExpressionInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.SuffixUnaryModificationExpression; + +public interface ISuffixUnaryModificationExpressionInitialiser extends IUnaryModificationExpressionInitialiser { + @Override + public SuffixUnaryModificationExpression instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionChildInitialiser.java new file mode 100644 index 0000000000..08dc42d671 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.UnaryExpressionChild; + +public interface IUnaryExpressionChildInitialiser extends IMultiplicativeExpressionChildInitialiser { + @Override + public UnaryExpressionChild instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionInitialiser.java new file mode 100644 index 0000000000..ec57e30f85 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryExpressionInitialiser.java @@ -0,0 +1,27 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.UnaryExpression; +import org.emftext.language.java.expressions.UnaryExpressionChild; +import org.emftext.language.java.operators.UnaryOperator; + +public interface IUnaryExpressionInitialiser extends IMultiplicativeExpressionChildInitialiser { + @Override + public UnaryExpression instantiate(); + + public default boolean addOperator(UnaryExpression ue, UnaryOperator op) { + if (op != null) { + ue.getOperators().add(op); + return ue.getOperators().contains(op); + } + return true; + } + + public default boolean addOperators(UnaryExpression ue, UnaryOperator[] ops) { + return this.doMultipleModifications(ue, ops, this::addOperator); + } + + public default boolean setChild(UnaryExpression ue, UnaryExpressionChild child) { + ue.setChild(child); + return (child == null && ue.getChild() == null) || ue.getChild().equals(child); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionChildInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionChildInitialiser.java new file mode 100644 index 0000000000..0c7bbee94f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionChildInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.UnaryModificationExpressionChild; + +public interface IUnaryModificationExpressionChildInitialiser extends IUnaryExpressionChildInitialiser { + @Override + public UnaryModificationExpressionChild instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionInitialiser.java new file mode 100644 index 0000000000..913501f924 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/IUnaryModificationExpressionInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.UnaryModificationExpression; +import org.emftext.language.java.expressions.UnaryModificationExpressionChild; +import org.emftext.language.java.operators.UnaryModificationOperator; + +public interface IUnaryModificationExpressionInitialiser extends IUnaryExpressionChildInitialiser { + @Override + public UnaryModificationExpression instantiate(); + + public default boolean setChild(UnaryModificationExpression ume, UnaryModificationExpressionChild child) { + ume.setChild(child); + return (child == null && ume.getChild() == null) || ume.getChild().equals(child); + } + + public default boolean setOperator(UnaryModificationExpression ume, UnaryModificationOperator op) { + ume.setOperator(op); + return (op == null && ume.getOperator() == null) || ume.getOperator().equals(op); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ImplicitlyTypedLambdaParametersInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ImplicitlyTypedLambdaParametersInitialiser.java new file mode 100644 index 0000000000..3fbe2cbada --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ImplicitlyTypedLambdaParametersInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.ImplicitlyTypedLambdaParameters; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ImplicitlyTypedLambdaParametersInitialiser extends AbstractInitialiserBase + implements IImplicitlyTypedLambdaParametersInitialiser { + @Override + public IImplicitlyTypedLambdaParametersInitialiser newInitialiser() { + return new ImplicitlyTypedLambdaParametersInitialiser(); + } + + @Override + public ImplicitlyTypedLambdaParameters instantiate() { + return ExpressionsFactory.eINSTANCE.createImplicitlyTypedLambdaParameters(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InclusiveOrExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InclusiveOrExpressionInitialiser.java new file mode 100644 index 0000000000..2d6381b150 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InclusiveOrExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.InclusiveOrExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class InclusiveOrExpressionInitialiser extends AbstractInitialiserBase + implements IInclusiveOrExpressionInitialiser { + @Override + public IInclusiveOrExpressionInitialiser newInitialiser() { + return new InclusiveOrExpressionInitialiser(); + } + + @Override + public InclusiveOrExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createInclusiveOrExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InstanceOfExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InstanceOfExpressionInitialiser.java new file mode 100644 index 0000000000..a1869c8e97 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/InstanceOfExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.InstanceOfExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class InstanceOfExpressionInitialiser extends AbstractInitialiserBase + implements IInstanceOfExpressionInitialiser { + @Override + public IInstanceOfExpressionInitialiser newInitialiser() { + return new InstanceOfExpressionInitialiser(); + } + + @Override + public InstanceOfExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createInstanceOfExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/LambdaExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/LambdaExpressionInitialiser.java new file mode 100644 index 0000000000..7da443c16e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/LambdaExpressionInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.LambdaExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class LambdaExpressionInitialiser extends AbstractInitialiserBase implements ILambdaExpressionInitialiser { + + @Override + public ILambdaExpressionInitialiser newInitialiser() { + return new LambdaExpressionInitialiser(); + } + + @Override + public LambdaExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createLambdaExpression(); + } + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/MultiplicativeExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/MultiplicativeExpressionInitialiser.java new file mode 100644 index 0000000000..d0b8a5bc30 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/MultiplicativeExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.MultiplicativeExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class MultiplicativeExpressionInitialiser extends AbstractInitialiserBase + implements IMultiplicativeExpressionInitialiser { + @Override + public IMultiplicativeExpressionInitialiser newInitialiser() { + return new MultiplicativeExpressionInitialiser(); + } + + @Override + public MultiplicativeExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createMultiplicativeExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/NestedExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/NestedExpressionInitialiser.java new file mode 100644 index 0000000000..3dab5684bf --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/NestedExpressionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.NestedExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NestedExpressionInitialiser extends AbstractInitialiserBase implements INestedExpressionInitialiser { + @Override + public INestedExpressionInitialiser newInitialiser() { + return new NestedExpressionInitialiser(); + } + + @Override + public NestedExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createNestedExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrefixUnaryModificationExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrefixUnaryModificationExpressionInitialiser.java new file mode 100644 index 0000000000..091028a319 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrefixUnaryModificationExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.PrefixUnaryModificationExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PrefixUnaryModificationExpressionInitialiser extends AbstractInitialiserBase + implements IPrefixUnaryModificationExpressionInitialiser { + @Override + public IPrefixUnaryModificationExpressionInitialiser newInitialiser() { + return new PrefixUnaryModificationExpressionInitialiser(); + } + + @Override + public PrefixUnaryModificationExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createPrefixUnaryModificationExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrimaryExpressionReferenceExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrimaryExpressionReferenceExpressionInitialiser.java new file mode 100644 index 0000000000..bc959ae2c0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/PrimaryExpressionReferenceExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.PrimaryExpressionReferenceExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PrimaryExpressionReferenceExpressionInitialiser extends AbstractInitialiserBase + implements IPrimaryExpressionReferenceExpressionInitialiser { + @Override + public IPrimaryExpressionReferenceExpressionInitialiser newInitialiser() { + return new PrimaryExpressionReferenceExpressionInitialiser(); + } + + @Override + public PrimaryExpressionReferenceExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createPrimaryExpressionReferenceExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/RelationExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/RelationExpressionInitialiser.java new file mode 100644 index 0000000000..d2e56f1c7b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/RelationExpressionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.RelationExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class RelationExpressionInitialiser extends AbstractInitialiserBase implements IRelationExpressionInitialiser { + @Override + public IRelationExpressionInitialiser newInitialiser() { + return new RelationExpressionInitialiser(); + } + + @Override + public RelationExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createRelationExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ShiftExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ShiftExpressionInitialiser.java new file mode 100644 index 0000000000..561f3365ae --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/ShiftExpressionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.ShiftExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ShiftExpressionInitialiser extends AbstractInitialiserBase implements IShiftExpressionInitialiser { + @Override + public IShiftExpressionInitialiser newInitialiser() { + return new ShiftExpressionInitialiser(); + } + + @Override + public ShiftExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createShiftExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SingleImplicitLambdaParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SingleImplicitLambdaParameterInitialiser.java new file mode 100644 index 0000000000..dc24929276 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SingleImplicitLambdaParameterInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.SingleImplicitLambdaParameter; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SingleImplicitLambdaParameterInitialiser extends AbstractInitialiserBase + implements ISingleImplicitLambdaParameterInitialiser { + @Override + public ISingleImplicitLambdaParameterInitialiser newInitialiser() { + return new SingleImplicitLambdaParameterInitialiser(); + } + + @Override + public SingleImplicitLambdaParameter instantiate() { + return ExpressionsFactory.eINSTANCE.createSingleImplicitLambdaParameter(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SuffixUnaryModificationExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SuffixUnaryModificationExpressionInitialiser.java new file mode 100644 index 0000000000..bee3478537 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/SuffixUnaryModificationExpressionInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.SuffixUnaryModificationExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SuffixUnaryModificationExpressionInitialiser extends AbstractInitialiserBase + implements ISuffixUnaryModificationExpressionInitialiser { + @Override + public ISuffixUnaryModificationExpressionInitialiser newInitialiser() { + return new SuffixUnaryModificationExpressionInitialiser(); + } + + @Override + public SuffixUnaryModificationExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createSuffixUnaryModificationExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/UnaryExpressionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/UnaryExpressionInitialiser.java new file mode 100644 index 0000000000..1bda0b4eb3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/UnaryExpressionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.expressions; + +import org.emftext.language.java.expressions.ExpressionsFactory; +import org.emftext.language.java.expressions.UnaryExpression; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class UnaryExpressionInitialiser extends AbstractInitialiserBase implements IUnaryExpressionInitialiser { + @Override + public IUnaryExpressionInitialiser newInitialiser() { + return new UnaryExpressionInitialiser(); + } + + @Override + public UnaryExpression instantiate() { + return ExpressionsFactory.eINSTANCE.createUnaryExpression(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/package-info.java new file mode 100644 index 0000000000..7ad2105963 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/expressions/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.expressions}. + */ +package cipm.consistency.initialisers.jamopp.expressions; \ No newline at end of file From 280d2fcbaaadb399ec90d380d6814952dc8886e3 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:36:18 +0200 Subject: [PATCH 18/87] (WIP) Implement initialiser package for org.emftext.language.java.generics --- .../ExtendsTypeArgumentInitialiser.java | 18 ++++++ .../generics/GenericsInitialiserPackage.java | 24 ++++++++ .../ICallTypeArgumentableInitialiser.java | 23 +++++++ .../IExtendsTypeArgumentInitialiser.java | 32 ++++++++++ .../IQualifiedTypeArgumentInitialiser.java | 10 ++++ .../ISuperTypeArgumentInitialiser.java | 16 +++++ .../generics/ITypeArgumentInitialiser.java | 11 ++++ .../ITypeArgumentableInitialiser.java | 23 +++++++ .../generics/ITypeParameterInitialiser.java | 60 +++++++++++++++++++ .../ITypeParametrizableInitialiser.java | 23 +++++++ .../IUnknownTypeArgumentInitialiser.java | 10 ++++ .../QualifiedTypeArgumentInitialiser.java | 19 ++++++ .../SuperTypeArgumentInitialiser.java | 18 ++++++ .../generics/TypeParameterInitialiser.java | 19 ++++++ .../UnknownTypeArgumentInitialiser.java | 18 ++++++ .../jamopp/generics/package-info.java | 5 ++ 16 files changed, 329 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ExtendsTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/GenericsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ICallTypeArgumentableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IExtendsTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IQualifiedTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ISuperTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParametrizableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IUnknownTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/QualifiedTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/SuperTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/TypeParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/UnknownTypeArgumentInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ExtendsTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ExtendsTypeArgumentInitialiser.java new file mode 100644 index 0000000000..9d651b1c41 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ExtendsTypeArgumentInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.ExtendsTypeArgument; +import org.emftext.language.java.generics.GenericsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ExtendsTypeArgumentInitialiser extends AbstractInitialiserBase implements IExtendsTypeArgumentInitialiser { + @Override + public IExtendsTypeArgumentInitialiser newInitialiser() { + return new ExtendsTypeArgumentInitialiser(); + } + + @Override + public ExtendsTypeArgument instantiate() { + return GenericsFactory.eINSTANCE.createExtendsTypeArgument(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/GenericsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/GenericsInitialiserPackage.java new file mode 100644 index 0000000000..aee7de7ad0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/GenericsInitialiserPackage.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class GenericsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new ExtendsTypeArgumentInitialiser(), + new QualifiedTypeArgumentInitialiser(), new SuperTypeArgumentInitialiser(), + new TypeParameterInitialiser(), new UnknownTypeArgumentInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { ICallTypeArgumentableInitialiser.class, IExtendsTypeArgumentInitialiser.class, + IQualifiedTypeArgumentInitialiser.class, ISuperTypeArgumentInitialiser.class, + ITypeArgumentableInitialiser.class, ITypeArgumentInitialiser.class, ITypeParameterInitialiser.class, + ITypeParametrizableInitialiser.class, IUnknownTypeArgumentInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ICallTypeArgumentableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ICallTypeArgumentableInitialiser.java new file mode 100644 index 0000000000..fec3a9d20b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ICallTypeArgumentableInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.CallTypeArgumentable; +import org.emftext.language.java.generics.TypeArgument; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ICallTypeArgumentableInitialiser extends ICommentableInitialiser { + @Override + public CallTypeArgumentable instantiate(); + + public default boolean addCallTypeArgument(CallTypeArgumentable cta, TypeArgument callTypeArg) { + if (callTypeArg != null) { + cta.getCallTypeArguments().add(callTypeArg); + return cta.getCallTypeArguments().contains(callTypeArg); + } + return true; + } + + public default boolean addCallTypeArguments(CallTypeArgumentable cta, TypeArgument[] callTypeArgs) { + return this.doMultipleModifications(cta, callTypeArgs, this::addCallTypeArgument); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IExtendsTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IExtendsTypeArgumentInitialiser.java new file mode 100644 index 0000000000..7c985fc808 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IExtendsTypeArgumentInitialiser.java @@ -0,0 +1,32 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.ExtendsTypeArgument; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; + +/** + * An interface meant to be implemented by initialisers, which are supposed to + * create {@link ExtendsTypeArgument} instances.
+ *
+ * For an {@link ExtendsTypeArgument} instance eta, + * {@code eta.getExtendTypes().add(...)} does not modify eta. + * + * @author Alp Torac Genc + */ +public interface IExtendsTypeArgumentInitialiser extends IAnnotableInitialiser, ITypeArgumentInitialiser { + @Override + public ExtendsTypeArgument instantiate(); + + /** + * Sets the extend type of the given {@link ExtendsTypeArgument} to extType. + * Uses {@code eta.setExtendType(...)} to do so. + * + * @see {@link IExtendsTypeArgumentInitialiser} + */ + public default boolean setExtendType(ExtendsTypeArgument eta, TypeReference extType) { + eta.setExtendType(extType); + return (extType == null && eta.getExtendType() == null) + || eta.getExtendType().equals(extType) && eta.getExtendTypes().contains(extType); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IQualifiedTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IQualifiedTypeArgumentInitialiser.java new file mode 100644 index 0000000000..f913899c9b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IQualifiedTypeArgumentInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.QualifiedTypeArgument; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IQualifiedTypeArgumentInitialiser extends ITypeArgumentInitialiser, ITypedElementInitialiser { + @Override + public QualifiedTypeArgument instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ISuperTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ISuperTypeArgumentInitialiser.java new file mode 100644 index 0000000000..9ba6065db6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ISuperTypeArgumentInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.SuperTypeArgument; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; + +public interface ISuperTypeArgumentInitialiser extends IAnnotableInitialiser, ITypeArgumentInitialiser { + @Override + public SuperTypeArgument instantiate(); + + public default boolean setSuperType(SuperTypeArgument sta, TypeReference superType) { + sta.setSuperType(superType); + return (superType == null && sta.getSuperType() == null) || sta.getSuperType().equals(superType); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentInitialiser.java new file mode 100644 index 0000000000..136509941b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.TypeArgument; + +import cipm.consistency.initialisers.jamopp.arrays.IArrayTypeableInitialiser; + +public interface ITypeArgumentInitialiser extends IArrayTypeableInitialiser { + @Override + public TypeArgument instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentableInitialiser.java new file mode 100644 index 0000000000..bd4a733d06 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeArgumentableInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.TypeArgument; +import org.emftext.language.java.generics.TypeArgumentable; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ITypeArgumentableInitialiser extends ICommentableInitialiser { + @Override + public TypeArgumentable instantiate(); + + public default boolean addTypeArgument(TypeArgumentable ta, TypeArgument tArg) { + if (tArg != null) { + ta.getTypeArguments().add(tArg); + return ta.getTypeArguments().contains(tArg); + } + return true; + } + + public default boolean addTypeArguments(TypeArgumentable ta, TypeArgument[] tArgs) { + return this.doMultipleModifications(ta, tArgs, this::addTypeArgument); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParameterInitialiser.java new file mode 100644 index 0000000000..6663b9cc2e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParameterInitialiser.java @@ -0,0 +1,60 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.generics.TypeParameter; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; +import cipm.consistency.initialisers.jamopp.classifiers.IClassifierInitialiser; + +/** + * An interface meant for {@link IInitialiser} implementors that are supposed to + * create {@link TypeParameter} instances.
+ *
+ * Note: {@link TypeParameter} cannot add imports to its container, so + * attempting to add imports to it has no effect. This is caused by the + * inconsistency in the {@link Classifier} sub-hierarchy. + * + * @author Alp Torac Genc + * + */ +public interface ITypeParameterInitialiser extends IClassifierInitialiser, IAnnotableInitialiser { + @Override + public TypeParameter instantiate(); + + public default boolean addExtendType(TypeParameter tp, TypeReference extType) { + if (extType != null) { + tp.getExtendTypes().add(extType); + return tp.getExtendTypes().contains(extType); + } + return true; + } + + /** + * {@inheritDoc} + * + * @return Returns false in case of {@link TypeParameter}. + * + * @see {@link ITypeParameterInitialiser} + */ + @Override + public default boolean canAddImports(Classifier cls) { + return false; + } + + /** + * {@inheritDoc} + * + * @return Returns false in case of {@link TypeParameter}. + * + * @see {@link ITypeParameterInitialiser} + */ + @Override + public default boolean canAddPackageImports(Classifier cls) { + return false; + } + + public default boolean addExtendTypes(TypeParameter tp, TypeReference[] extTypes) { + return this.doMultipleModifications(tp, extTypes, this::addExtendType); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParametrizableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParametrizableInitialiser.java new file mode 100644 index 0000000000..b7368a9e94 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/ITypeParametrizableInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.TypeParameter; +import org.emftext.language.java.generics.TypeParametrizable; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ITypeParametrizableInitialiser extends ICommentableInitialiser { + @Override + public TypeParametrizable instantiate(); + + public default boolean addTypeParameter(TypeParametrizable tp, TypeParameter typeParam) { + if (typeParam != null) { + tp.getTypeParameters().add(typeParam); + return tp.getTypeParameters().contains(typeParam); + } + return true; + } + + public default boolean addTypeParameters(TypeParametrizable tp, TypeParameter[] typeParams) { + return this.doMultipleModifications(tp, typeParams, this::addTypeParameter); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IUnknownTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IUnknownTypeArgumentInitialiser.java new file mode 100644 index 0000000000..12478c656b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/IUnknownTypeArgumentInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.UnknownTypeArgument; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; + +public interface IUnknownTypeArgumentInitialiser extends IAnnotableInitialiser, ITypeArgumentInitialiser { + @Override + public UnknownTypeArgument instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/QualifiedTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/QualifiedTypeArgumentInitialiser.java new file mode 100644 index 0000000000..ad032fa859 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/QualifiedTypeArgumentInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.GenericsFactory; +import org.emftext.language.java.generics.QualifiedTypeArgument; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class QualifiedTypeArgumentInitialiser extends AbstractInitialiserBase + implements IQualifiedTypeArgumentInitialiser { + @Override + public IQualifiedTypeArgumentInitialiser newInitialiser() { + return new QualifiedTypeArgumentInitialiser(); + } + + @Override + public QualifiedTypeArgument instantiate() { + return GenericsFactory.eINSTANCE.createQualifiedTypeArgument(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/SuperTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/SuperTypeArgumentInitialiser.java new file mode 100644 index 0000000000..c5f10edc64 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/SuperTypeArgumentInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.GenericsFactory; +import org.emftext.language.java.generics.SuperTypeArgument; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SuperTypeArgumentInitialiser extends AbstractInitialiserBase implements ISuperTypeArgumentInitialiser { + @Override + public ISuperTypeArgumentInitialiser newInitialiser() { + return new SuperTypeArgumentInitialiser(); + } + + @Override + public SuperTypeArgument instantiate() { + return GenericsFactory.eINSTANCE.createSuperTypeArgument(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/TypeParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/TypeParameterInitialiser.java new file mode 100644 index 0000000000..482d894d90 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/TypeParameterInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.TypeParameter; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.generics.GenericsFactory; + +public class TypeParameterInitialiser extends AbstractInitialiserBase implements ITypeParameterInitialiser { + @Override + public TypeParameter instantiate() { + return GenericsFactory.eINSTANCE.createTypeParameter(); + } + + @Override + public ITypeParameterInitialiser newInitialiser() { + return new TypeParameterInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/UnknownTypeArgumentInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/UnknownTypeArgumentInitialiser.java new file mode 100644 index 0000000000..f662c6676e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/UnknownTypeArgumentInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.generics; + +import org.emftext.language.java.generics.GenericsFactory; +import org.emftext.language.java.generics.UnknownTypeArgument; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class UnknownTypeArgumentInitialiser extends AbstractInitialiserBase implements IUnknownTypeArgumentInitialiser { + @Override + public IUnknownTypeArgumentInitialiser newInitialiser() { + return new UnknownTypeArgumentInitialiser(); + } + + @Override + public UnknownTypeArgument instantiate() { + return GenericsFactory.eINSTANCE.createUnknownTypeArgument(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/package-info.java new file mode 100644 index 0000000000..7d369e81bd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/generics/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.generics}. + */ +package cipm.consistency.initialisers.jamopp.generics; \ No newline at end of file From 5f65531c10769f1a4ba4bb45de4b2ed6c8dc8391 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:36:42 +0200 Subject: [PATCH 19/87] (WIP) Implement initialiser package for org.emftext.language.java.instantiations --- .../ExplicitConstructorCallInitialiser.java | 19 ++++++++++++++++ .../IExplicitConstructorCallInitialiser.java | 14 ++++++++++++ .../IInitializableInitialiser.java | 17 ++++++++++++++ .../IInstantiationInitialiser.java | 13 +++++++++++ .../INewConstructorCallInitialiser.java | 18 +++++++++++++++ ...lWithInferredTypeArgumentsInitialiser.java | 8 +++++++ .../InstantiationsInitialiserPackage.java | 22 +++++++++++++++++++ .../NewConstructorCallInitialiser.java | 18 +++++++++++++++ ...lWithInferredTypeArgumentsInitialiser.java | 19 ++++++++++++++++ .../jamopp/instantiations/package-info.java | 5 +++++ 10 files changed, 153 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/ExplicitConstructorCallInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IExplicitConstructorCallInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInitializableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInstantiationInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallWithInferredTypeArgumentsInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/InstantiationsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallWithInferredTypeArgumentsInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/ExplicitConstructorCallInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/ExplicitConstructorCallInitialiser.java new file mode 100644 index 0000000000..7a3af10fd6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/ExplicitConstructorCallInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.instantiations.ExplicitConstructorCall; +import org.emftext.language.java.instantiations.InstantiationsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ExplicitConstructorCallInitialiser extends AbstractInitialiserBase + implements IExplicitConstructorCallInitialiser { + @Override + public IExplicitConstructorCallInitialiser newInitialiser() { + return new ExplicitConstructorCallInitialiser(); + } + + @Override + public ExplicitConstructorCall instantiate() { + return InstantiationsFactory.eINSTANCE.createExplicitConstructorCall(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IExplicitConstructorCallInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IExplicitConstructorCallInitialiser.java new file mode 100644 index 0000000000..7aac9f9de6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IExplicitConstructorCallInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.instantiations.ExplicitConstructorCall; +import org.emftext.language.java.literals.Self; + +public interface IExplicitConstructorCallInitialiser extends IInstantiationInitialiser { + @Override + public ExplicitConstructorCall instantiate(); + + public default boolean setCallTarget(ExplicitConstructorCall ecc, Self callTarget) { + ecc.setCallTarget(callTarget); + return (callTarget == null && ecc.getCallTarget() == null) || ecc.getCallTarget().equals(callTarget); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInitializableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInitializableInitialiser.java new file mode 100644 index 0000000000..536c5b1c79 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInitializableInitialiser.java @@ -0,0 +1,17 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.instantiations.Initializable; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IInitializableInitialiser extends ICommentableInitialiser { + @Override + public Initializable instantiate(); + + public default boolean setInitialValue(Initializable initializable, Expression initVal) { + initializable.setInitialValue(initVal); + return (initVal == null && initializable.getInitialValue() == null) + || initializable.getInitialValue().equals(initVal); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInstantiationInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInstantiationInitialiser.java new file mode 100644 index 0000000000..b44d598e0e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/IInstantiationInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.instantiations.Instantiation; + +import cipm.consistency.initialisers.jamopp.generics.ICallTypeArgumentableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IArgumentableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IReferenceInitialiser; + +public interface IInstantiationInitialiser + extends IArgumentableInitialiser, IReferenceInitialiser, ICallTypeArgumentableInitialiser { + @Override + public Instantiation instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallInitialiser.java new file mode 100644 index 0000000000..355f91d3e2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.classifiers.AnonymousClass; +import org.emftext.language.java.instantiations.NewConstructorCall; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface INewConstructorCallInitialiser extends IInstantiationInitialiser, ITypedElementInitialiser { + + @Override + public NewConstructorCall instantiate(); + + public default boolean setAnonymousClass(NewConstructorCall ncc, AnonymousClass anonymousCls) { + ncc.setAnonymousClass(anonymousCls); + return (anonymousCls == null && ncc.getAnonymousClass() == null) + || ncc.getAnonymousClass().equals(anonymousCls); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallWithInferredTypeArgumentsInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallWithInferredTypeArgumentsInitialiser.java new file mode 100644 index 0000000000..ed7bdfb060 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/INewConstructorCallWithInferredTypeArgumentsInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.instantiations.NewConstructorCallWithInferredTypeArguments; + +public interface INewConstructorCallWithInferredTypeArgumentsInitialiser extends INewConstructorCallInitialiser { + @Override + public NewConstructorCallWithInferredTypeArguments instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/InstantiationsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/InstantiationsInitialiserPackage.java new file mode 100644 index 0000000000..20545c4d1f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/InstantiationsInitialiserPackage.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class InstantiationsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new ExplicitConstructorCallInitialiser(), + new NewConstructorCallInitialiser(), new NewConstructorCallWithInferredTypeArgumentsInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IExplicitConstructorCallInitialiser.class, IInitializableInitialiser.class, + IInstantiationInitialiser.class, INewConstructorCallInitialiser.class, + INewConstructorCallWithInferredTypeArgumentsInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallInitialiser.java new file mode 100644 index 0000000000..5e36611fbd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.instantiations.InstantiationsFactory; +import org.emftext.language.java.instantiations.NewConstructorCall; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NewConstructorCallInitialiser extends AbstractInitialiserBase implements INewConstructorCallInitialiser { + @Override + public INewConstructorCallInitialiser newInitialiser() { + return new NewConstructorCallInitialiser(); + } + + @Override + public NewConstructorCall instantiate() { + return InstantiationsFactory.eINSTANCE.createNewConstructorCall(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallWithInferredTypeArgumentsInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallWithInferredTypeArgumentsInitialiser.java new file mode 100644 index 0000000000..04585b6e5c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/NewConstructorCallWithInferredTypeArgumentsInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.instantiations; + +import org.emftext.language.java.instantiations.InstantiationsFactory; +import org.emftext.language.java.instantiations.NewConstructorCallWithInferredTypeArguments; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NewConstructorCallWithInferredTypeArgumentsInitialiser extends AbstractInitialiserBase + implements INewConstructorCallWithInferredTypeArgumentsInitialiser { + @Override + public INewConstructorCallWithInferredTypeArgumentsInitialiser newInitialiser() { + return new NewConstructorCallWithInferredTypeArgumentsInitialiser(); + } + + @Override + public NewConstructorCallWithInferredTypeArguments instantiate() { + return InstantiationsFactory.eINSTANCE.createNewConstructorCallWithInferredTypeArguments(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/package-info.java new file mode 100644 index 0000000000..c4670a11b1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/instantiations/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.instantiations}. + */ +package cipm.consistency.initialisers.jamopp.instantiations; \ No newline at end of file From 3a71c74addb7bc1b15f2f44fd31324dfc9294f18 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:37:07 +0200 Subject: [PATCH 20/87] (WIP) Implement initialiser package for org.emftext.language.java.literals --- .../BinaryIntegerLiteralInitialiser.java | 19 +++++++++++ .../BinaryLongLiteralInitialiser.java | 18 ++++++++++ .../literals/BooleanLiteralInitialiser.java | 18 ++++++++++ .../literals/CharacterLiteralInitialiser.java | 18 ++++++++++ .../DecimalDoubleLiteralInitialiser.java | 19 +++++++++++ .../DecimalFloatLiteralInitialiser.java | 18 ++++++++++ .../DecimalIntegerLiteralInitialiser.java | 19 +++++++++++ .../DecimalLongLiteralInitialiser.java | 18 ++++++++++ .../literals/HexDoubleLiteralInitialiser.java | 18 ++++++++++ .../literals/HexFloatLiteralInitialiser.java | 18 ++++++++++ .../HexIntegerLiteralInitialiser.java | 18 ++++++++++ .../literals/HexLongLiteralInitialiser.java | 18 ++++++++++ .../IBinaryIntegerLiteralInitialiser.java | 19 +++++++++++ .../IBinaryLongLiteralInitialiser.java | 19 +++++++++++ .../literals/IBooleanLiteralInitialiser.java | 13 +++++++ .../ICharacterLiteralInitialiser.java | 13 +++++++ .../IDecimalDoubleLiteralInitialiser.java | 13 +++++++ .../IDecimalFloatLiteralInitialiser.java | 13 +++++++ .../IDecimalIntegerLiteralInitialiser.java | 19 +++++++++++ .../IDecimalLongLiteralInitialiser.java | 19 +++++++++++ .../literals/IDoubleLiteralInitialiser.java | 9 +++++ .../literals/IFloatLiteralInitialiser.java | 9 +++++ .../IHexDoubleLiteralInitialiser.java | 13 +++++++ .../literals/IHexFloatLiteralInitialiser.java | 13 +++++++ .../IHexIntegerLiteralInitialiser.java | 19 +++++++++++ .../literals/IHexLongLiteralInitialiser.java | 19 +++++++++++ .../literals/IIntegerLiteralInitialiser.java | 9 +++++ .../jamopp/literals/ILiteralInitialiser.java | 11 ++++++ .../literals/ILongLiteralInitialiser.java | 9 +++++ .../literals/INullLiteralInitialiser.java | 9 +++++ .../IOctalIntegerLiteralInitialiser.java | 19 +++++++++++ .../IOctalLongLiteralInitialiser.java | 19 +++++++++++ .../jamopp/literals/ISelfInitialiser.java | 11 ++++++ .../jamopp/literals/ISuperInitialiser.java | 9 +++++ .../jamopp/literals/IThisInitialiser.java | 9 +++++ .../literals/LiteralsInitialiserPackage.java | 34 +++++++++++++++++++ .../literals/NullLiteralInitialiser.java | 18 ++++++++++ .../OctalIntegerLiteralInitialiser.java | 18 ++++++++++ .../literals/OctalLongLiteralInitialiser.java | 18 ++++++++++ .../jamopp/literals/SuperInitialiser.java | 18 ++++++++++ .../jamopp/literals/ThisInitialiser.java | 18 ++++++++++ .../jamopp/literals/package-info.java | 5 +++ 42 files changed, 663 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BooleanLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/CharacterLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalDoubleLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalFloatLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexDoubleLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexFloatLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBooleanLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ICharacterLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDoubleLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IFloatLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/INullLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISelfInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISuperInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IThisInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/LiteralsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/NullLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalIntegerLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalLongLiteralInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/SuperInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ThisInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..d46a2d4c60 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryIntegerLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.BinaryIntegerLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class BinaryIntegerLiteralInitialiser extends AbstractInitialiserBase + implements IBinaryIntegerLiteralInitialiser { + @Override + public IBinaryIntegerLiteralInitialiser newInitialiser() { + return new BinaryIntegerLiteralInitialiser(); + } + + @Override + public BinaryIntegerLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createBinaryIntegerLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryLongLiteralInitialiser.java new file mode 100644 index 0000000000..32508ceed4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BinaryLongLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.BinaryLongLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class BinaryLongLiteralInitialiser extends AbstractInitialiserBase implements IBinaryLongLiteralInitialiser { + @Override + public IBinaryLongLiteralInitialiser newInitialiser() { + return new BinaryLongLiteralInitialiser(); + } + + @Override + public BinaryLongLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createBinaryLongLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BooleanLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BooleanLiteralInitialiser.java new file mode 100644 index 0000000000..2bc55e6f96 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/BooleanLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.BooleanLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class BooleanLiteralInitialiser extends AbstractInitialiserBase implements IBooleanLiteralInitialiser { + @Override + public IBooleanLiteralInitialiser newInitialiser() { + return new BooleanLiteralInitialiser(); + } + + @Override + public BooleanLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createBooleanLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/CharacterLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/CharacterLiteralInitialiser.java new file mode 100644 index 0000000000..431a95b23b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/CharacterLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.CharacterLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class CharacterLiteralInitialiser extends AbstractInitialiserBase implements ICharacterLiteralInitialiser { + @Override + public ICharacterLiteralInitialiser newInitialiser() { + return new CharacterLiteralInitialiser(); + } + + @Override + public CharacterLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createCharacterLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalDoubleLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalDoubleLiteralInitialiser.java new file mode 100644 index 0000000000..4e361e2a80 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalDoubleLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.DecimalDoubleLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DecimalDoubleLiteralInitialiser extends AbstractInitialiserBase + implements IDecimalDoubleLiteralInitialiser { + @Override + public IDecimalDoubleLiteralInitialiser newInitialiser() { + return new DecimalDoubleLiteralInitialiser(); + } + + @Override + public DecimalDoubleLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createDecimalDoubleLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalFloatLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalFloatLiteralInitialiser.java new file mode 100644 index 0000000000..167c6b5ceb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalFloatLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.DecimalFloatLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DecimalFloatLiteralInitialiser extends AbstractInitialiserBase implements IDecimalFloatLiteralInitialiser { + @Override + public IDecimalFloatLiteralInitialiser newInitialiser() { + return new DecimalFloatLiteralInitialiser(); + } + + @Override + public DecimalFloatLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createDecimalFloatLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..edfbb5220b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalIntegerLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.DecimalIntegerLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DecimalIntegerLiteralInitialiser extends AbstractInitialiserBase + implements IDecimalIntegerLiteralInitialiser { + @Override + public IDecimalIntegerLiteralInitialiser newInitialiser() { + return new DecimalIntegerLiteralInitialiser(); + } + + @Override + public DecimalIntegerLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createDecimalIntegerLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalLongLiteralInitialiser.java new file mode 100644 index 0000000000..01cc1744b1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/DecimalLongLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.DecimalLongLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DecimalLongLiteralInitialiser extends AbstractInitialiserBase implements IDecimalLongLiteralInitialiser { + @Override + public IDecimalLongLiteralInitialiser newInitialiser() { + return new DecimalLongLiteralInitialiser(); + } + + @Override + public DecimalLongLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createDecimalLongLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexDoubleLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexDoubleLiteralInitialiser.java new file mode 100644 index 0000000000..f0e1095075 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexDoubleLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.HexDoubleLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class HexDoubleLiteralInitialiser extends AbstractInitialiserBase implements IHexDoubleLiteralInitialiser { + @Override + public IHexDoubleLiteralInitialiser newInitialiser() { + return new HexDoubleLiteralInitialiser(); + } + + @Override + public HexDoubleLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createHexDoubleLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexFloatLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexFloatLiteralInitialiser.java new file mode 100644 index 0000000000..721b620fe4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexFloatLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.HexFloatLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class HexFloatLiteralInitialiser extends AbstractInitialiserBase implements IHexFloatLiteralInitialiser { + @Override + public IHexFloatLiteralInitialiser newInitialiser() { + return new HexFloatLiteralInitialiser(); + } + + @Override + public HexFloatLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createHexFloatLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..ae1be06c31 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexIntegerLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.HexIntegerLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class HexIntegerLiteralInitialiser extends AbstractInitialiserBase implements IHexIntegerLiteralInitialiser { + @Override + public IHexIntegerLiteralInitialiser newInitialiser() { + return new HexIntegerLiteralInitialiser(); + } + + @Override + public HexIntegerLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createHexIntegerLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexLongLiteralInitialiser.java new file mode 100644 index 0000000000..02181156db --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/HexLongLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.HexLongLiteral; +import org.emftext.language.java.literals.LiteralsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class HexLongLiteralInitialiser extends AbstractInitialiserBase implements IHexLongLiteralInitialiser { + @Override + public IHexLongLiteralInitialiser newInitialiser() { + return new HexLongLiteralInitialiser(); + } + + @Override + public HexLongLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createHexLongLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..cbba52710b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryIntegerLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.BinaryIntegerLiteral; + +public interface IBinaryIntegerLiteralInitialiser extends IIntegerLiteralInitialiser { + @Override + public BinaryIntegerLiteral instantiate(); + + public default boolean setBinaryValue(BinaryIntegerLiteral bil, BigInteger val) { + bil.setBinaryValue(val); + return (val == null && bil.getBinaryValue() == null) || bil.getBinaryValue().equals(val); + } + + public default boolean setBinaryValue(BinaryIntegerLiteral bil, int val) { + return this.setBinaryValue(bil, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryLongLiteralInitialiser.java new file mode 100644 index 0000000000..b5bdd3d114 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBinaryLongLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.BinaryLongLiteral; + +public interface IBinaryLongLiteralInitialiser extends ILongLiteralInitialiser { + @Override + public BinaryLongLiteral instantiate(); + + public default boolean setBinaryValue(BinaryLongLiteral bil, BigInteger val) { + bil.setBinaryValue(val); + return (val == null && bil.getBinaryValue() == null) || bil.getBinaryValue().equals(val); + } + + public default boolean setBinaryValue(BinaryLongLiteral bil, long val) { + return this.setBinaryValue(bil, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBooleanLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBooleanLiteralInitialiser.java new file mode 100644 index 0000000000..929c76a85d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IBooleanLiteralInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.BooleanLiteral; + +public interface IBooleanLiteralInitialiser extends ILiteralInitialiser { + @Override + public BooleanLiteral instantiate(); + + public default boolean setValue(BooleanLiteral bl, boolean val) { + bl.setValue(val); + return bl.isValue() == val; + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ICharacterLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ICharacterLiteralInitialiser.java new file mode 100644 index 0000000000..62fead3428 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ICharacterLiteralInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.CharacterLiteral; + +public interface ICharacterLiteralInitialiser extends ILiteralInitialiser { + @Override + public CharacterLiteral instantiate(); + + public default boolean setValue(CharacterLiteral cl, String val) { + cl.setValue(val); + return (val == null && cl.getValue() == null) || cl.getValue().equals(val); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java new file mode 100644 index 0000000000..f96d324f62 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.DecimalDoubleLiteral; + +public interface IDecimalDoubleLiteralInitialiser extends IDoubleLiteralInitialiser { + @Override + public DecimalDoubleLiteral instantiate(); + + public default boolean setDecimalValue(DecimalDoubleLiteral ddl, double val) { + ddl.setDecimalValue(val); + return ddl.getDecimalValue() == val; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java new file mode 100644 index 0000000000..dce2edba88 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.DecimalFloatLiteral; + +public interface IDecimalFloatLiteralInitialiser extends IFloatLiteralInitialiser { + @Override + public DecimalFloatLiteral instantiate(); + + public default boolean setDecimalValue(DecimalFloatLiteral dfl, float val) { + dfl.setDecimalValue(val); + return dfl.getDecimalValue() == val; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..e087787f4e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalIntegerLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.DecimalIntegerLiteral; + +public interface IDecimalIntegerLiteralInitialiser extends IIntegerLiteralInitialiser { + @Override + public DecimalIntegerLiteral instantiate(); + + public default boolean setDecimalValue(DecimalIntegerLiteral dil, BigInteger val) { + dil.setDecimalValue(val); + return (val == null && dil.getDecimalValue() == null) || dil.getDecimalValue().equals(val); + } + + public default boolean setDecimalValue(DecimalIntegerLiteral dil, int val) { + return this.setDecimalValue(dil, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalLongLiteralInitialiser.java new file mode 100644 index 0000000000..3266d6b667 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalLongLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.DecimalLongLiteral; + +public interface IDecimalLongLiteralInitialiser extends ILongLiteralInitialiser { + @Override + public DecimalLongLiteral instantiate(); + + public default boolean setDecimalValue(DecimalLongLiteral dll, BigInteger val) { + dll.setDecimalValue(val); + return (val == null && dll.getDecimalValue() == null) || dll.getDecimalValue().equals(val); + } + + public default boolean setDecimalValue(DecimalLongLiteral dll, long val) { + return this.setDecimalValue(dll, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDoubleLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDoubleLiteralInitialiser.java new file mode 100644 index 0000000000..1414cbbe1a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDoubleLiteralInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.DoubleLiteral; + +public interface IDoubleLiteralInitialiser extends ILiteralInitialiser { + @Override + public DoubleLiteral instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IFloatLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IFloatLiteralInitialiser.java new file mode 100644 index 0000000000..7ae0d44abd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IFloatLiteralInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.FloatLiteral; + +public interface IFloatLiteralInitialiser extends ILiteralInitialiser { + @Override + public FloatLiteral instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java new file mode 100644 index 0000000000..7d40b01fd9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.HexDoubleLiteral; + +public interface IHexDoubleLiteralInitialiser extends IDoubleLiteralInitialiser { + @Override + public HexDoubleLiteral instantiate(); + + public default boolean setHexValue(HexDoubleLiteral hdl, double val) { + hdl.setHexValue(val); + return hdl.getHexValue() == val; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java new file mode 100644 index 0000000000..36318bcca6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.HexFloatLiteral; + +public interface IHexFloatLiteralInitialiser extends IFloatLiteralInitialiser { + @Override + public HexFloatLiteral instantiate(); + + public default boolean setHexValue(HexFloatLiteral hdl, float val) { + hdl.setHexValue(val); + return hdl.getHexValue() == val; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..40eb272eef --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexIntegerLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.HexIntegerLiteral; + +public interface IHexIntegerLiteralInitialiser extends IIntegerLiteralInitialiser { + @Override + public HexIntegerLiteral instantiate(); + + public default boolean setHexValue(HexIntegerLiteral hil, BigInteger val) { + hil.setHexValue(val); + return (val == null && hil.getHexValue() == null) || hil.getHexValue().equals(val); + } + + public default boolean setHexValue(HexIntegerLiteral hil, int val) { + return this.setHexValue(hil, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexLongLiteralInitialiser.java new file mode 100644 index 0000000000..08b986bf81 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexLongLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.HexLongLiteral; + +public interface IHexLongLiteralInitialiser extends ILongLiteralInitialiser { + @Override + public HexLongLiteral instantiate(); + + public default boolean setHexValue(HexLongLiteral hll, BigInteger val) { + hll.setHexValue(val); + return (val == null && hll.getHexValue() == null) || hll.getHexValue().equals(val); + } + + public default boolean setHexValue(HexLongLiteral hll, long val) { + return this.setHexValue(hll, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..635a2ff193 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IIntegerLiteralInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.IntegerLiteral; + +public interface IIntegerLiteralInitialiser extends ILiteralInitialiser { + @Override + public IntegerLiteral instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILiteralInitialiser.java new file mode 100644 index 0000000000..6c34f41483 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILiteralInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.Literal; + +import cipm.consistency.initialisers.jamopp.expressions.IPrimaryExpressionInitialiser; + +public interface ILiteralInitialiser extends IPrimaryExpressionInitialiser { + @Override + public Literal instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILongLiteralInitialiser.java new file mode 100644 index 0000000000..ef1072d750 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ILongLiteralInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.LongLiteral; + +public interface ILongLiteralInitialiser extends ILiteralInitialiser { + @Override + public LongLiteral instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/INullLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/INullLiteralInitialiser.java new file mode 100644 index 0000000000..03c4ac6128 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/INullLiteralInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.NullLiteral; + +public interface INullLiteralInitialiser extends ILiteralInitialiser { + @Override + public NullLiteral instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..abdbb6eae4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalIntegerLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.OctalIntegerLiteral; + +public interface IOctalIntegerLiteralInitialiser extends IIntegerLiteralInitialiser { + @Override + public OctalIntegerLiteral instantiate(); + + public default boolean setOctalValue(OctalIntegerLiteral oil, BigInteger val) { + oil.setOctalValue(val); + return (val == null && oil.getOctalValue() == null) || oil.getOctalValue().equals(val); + } + + public default boolean setOctalValue(OctalIntegerLiteral oil, int val) { + return this.setOctalValue(oil, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalLongLiteralInitialiser.java new file mode 100644 index 0000000000..6e1f039e20 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IOctalLongLiteralInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.OctalLongLiteral; + +public interface IOctalLongLiteralInitialiser extends ILongLiteralInitialiser { + @Override + public OctalLongLiteral instantiate(); + + public default boolean setOctalValue(OctalLongLiteral oll, BigInteger val) { + oll.setOctalValue(val); + return (val == null && oll.getOctalValue() == null) || oll.getOctalValue().equals(val); + } + + public default boolean setOctalValue(OctalLongLiteral oll, long val) { + return this.setOctalValue(oll, BigInteger.valueOf(val)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISelfInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISelfInitialiser.java new file mode 100644 index 0000000000..80ba9fc0a2 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISelfInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.Self; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ISelfInitialiser extends ICommentableInitialiser { + @Override + public Self instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISuperInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISuperInitialiser.java new file mode 100644 index 0000000000..572c609cd0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ISuperInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.Super; + +public interface ISuperInitialiser extends ISelfInitialiser { + @Override + public Super instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IThisInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IThisInitialiser.java new file mode 100644 index 0000000000..4f6cf1d876 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IThisInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.This; + +public interface IThisInitialiser extends ISelfInitialiser { + @Override + public This instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/LiteralsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/LiteralsInitialiserPackage.java new file mode 100644 index 0000000000..54128509bd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/LiteralsInitialiserPackage.java @@ -0,0 +1,34 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class LiteralsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new BinaryIntegerLiteralInitialiser(), + new BinaryLongLiteralInitialiser(), new BooleanLiteralInitialiser(), new CharacterLiteralInitialiser(), + new DecimalDoubleLiteralInitialiser(), new DecimalFloatLiteralInitialiser(), + new DecimalIntegerLiteralInitialiser(), new DecimalLongLiteralInitialiser(), + new HexDoubleLiteralInitialiser(), new HexFloatLiteralInitialiser(), new HexIntegerLiteralInitialiser(), + new HexLongLiteralInitialiser(), new NullLiteralInitialiser(), new OctalIntegerLiteralInitialiser(), + new OctalLongLiteralInitialiser(), new SuperInitialiser(), new ThisInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IBinaryIntegerLiteralInitialiser.class, IBinaryLongLiteralInitialiser.class, + IBooleanLiteralInitialiser.class, ICharacterLiteralInitialiser.class, + IDecimalDoubleLiteralInitialiser.class, IDecimalFloatLiteralInitialiser.class, + IDecimalIntegerLiteralInitialiser.class, IDecimalLongLiteralInitialiser.class, + IDoubleLiteralInitialiser.class, IFloatLiteralInitialiser.class, IHexDoubleLiteralInitialiser.class, + IHexFloatLiteralInitialiser.class, IHexIntegerLiteralInitialiser.class, + IHexLongLiteralInitialiser.class, IIntegerLiteralInitialiser.class, ILiteralInitialiser.class, + ILongLiteralInitialiser.class, INullLiteralInitialiser.class, IOctalIntegerLiteralInitialiser.class, + IOctalLongLiteralInitialiser.class, ISelfInitialiser.class, ISuperInitialiser.class, + IThisInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/NullLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/NullLiteralInitialiser.java new file mode 100644 index 0000000000..c1c0347de7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/NullLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.LiteralsFactory; +import org.emftext.language.java.literals.NullLiteral; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NullLiteralInitialiser extends AbstractInitialiserBase implements INullLiteralInitialiser { + @Override + public INullLiteralInitialiser newInitialiser() { + return new NullLiteralInitialiser(); + } + + @Override + public NullLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createNullLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalIntegerLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalIntegerLiteralInitialiser.java new file mode 100644 index 0000000000..16651f562b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalIntegerLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.LiteralsFactory; +import org.emftext.language.java.literals.OctalIntegerLiteral; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class OctalIntegerLiteralInitialiser extends AbstractInitialiserBase implements IOctalIntegerLiteralInitialiser { + @Override + public IOctalIntegerLiteralInitialiser newInitialiser() { + return new OctalIntegerLiteralInitialiser(); + } + + @Override + public OctalIntegerLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createOctalIntegerLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalLongLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalLongLiteralInitialiser.java new file mode 100644 index 0000000000..bd58a855f4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/OctalLongLiteralInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.LiteralsFactory; +import org.emftext.language.java.literals.OctalLongLiteral; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class OctalLongLiteralInitialiser extends AbstractInitialiserBase implements IOctalLongLiteralInitialiser { + @Override + public IOctalLongLiteralInitialiser newInitialiser() { + return new OctalLongLiteralInitialiser(); + } + + @Override + public OctalLongLiteral instantiate() { + return LiteralsFactory.eINSTANCE.createOctalLongLiteral(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/SuperInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/SuperInitialiser.java new file mode 100644 index 0000000000..659d39cbb8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/SuperInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.LiteralsFactory; +import org.emftext.language.java.literals.Super; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SuperInitialiser extends AbstractInitialiserBase implements ISuperInitialiser { + @Override + public ISuperInitialiser newInitialiser() { + return new SuperInitialiser(); + } + + @Override + public Super instantiate() { + return LiteralsFactory.eINSTANCE.createSuper(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ThisInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ThisInitialiser.java new file mode 100644 index 0000000000..190b6d0183 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/ThisInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.literals; + +import org.emftext.language.java.literals.LiteralsFactory; +import org.emftext.language.java.literals.This; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ThisInitialiser extends AbstractInitialiserBase implements IThisInitialiser { + @Override + public IThisInitialiser newInitialiser() { + return new ThisInitialiser(); + } + + @Override + public This instantiate() { + return LiteralsFactory.eINSTANCE.createThis(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/package-info.java new file mode 100644 index 0000000000..8eb5b75ed8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.literals}. + */ +package cipm.consistency.initialisers.jamopp.literals; \ No newline at end of file From 73e5d7aa93b920aa8ef25debdf53b901f5dd0f59 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:37:25 +0200 Subject: [PATCH 21/87] (WIP) Implement initialiser package for org.emftext.language.java.members --- .../members/AdditionalFieldInitialiser.java | 19 +++++++ .../members/ClassMethodInitialiser.java | 19 +++++++ .../members/ConstructorInitialiser.java | 19 +++++++ .../members/EmptyMemberInitialiser.java | 18 ++++++ .../members/EnumConstantInitialiser.java | 19 +++++++ .../jamopp/members/FieldInitialiser.java | 18 ++++++ .../members/IAdditionalFieldInitialiser.java | 13 +++++ .../members/IClassMethodInitialiser.java | 57 +++++++++++++++++++ .../members/IConstructorInitialiser.java | 23 ++++++++ .../members/IEmptyMemberInitialiser.java | 9 +++ .../members/IEnumConstantInitialiser.java | 19 +++++++ .../members/IExceptionThrowerInitialiser.java | 23 ++++++++ .../jamopp/members/IFieldInitialiser.java | 26 +++++++++ .../members/IInterfaceMethodInitialiser.java | 14 +++++ .../members/IMemberContainerInitialiser.java | 48 ++++++++++++++++ .../jamopp/members/IMemberInitialiser.java | 10 ++++ .../jamopp/members/IMethodInitialiser.java | 17 ++++++ .../members/InterfaceMethodInitialiser.java | 19 +++++++ .../members/MembersInitialiserPackage.java | 24 ++++++++ .../jamopp/members/package-info.java | 5 ++ 20 files changed, 419 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/AdditionalFieldInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ClassMethodInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ConstructorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EmptyMemberInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EnumConstantInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/FieldInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IAdditionalFieldInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IClassMethodInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IConstructorInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEmptyMemberInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEnumConstantInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IExceptionThrowerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IFieldInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IInterfaceMethodInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberContainerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMethodInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/InterfaceMethodInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/MembersInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/AdditionalFieldInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/AdditionalFieldInitialiser.java new file mode 100644 index 0000000000..91e7fac024 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/AdditionalFieldInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.MembersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.members.AdditionalField; + +public class AdditionalFieldInitialiser extends AbstractInitialiserBase implements IAdditionalFieldInitialiser { + @Override + public IAdditionalFieldInitialiser newInitialiser() { + return new AdditionalFieldInitialiser(); + } + + @Override + public AdditionalField instantiate() { + return MembersFactory.eINSTANCE.createAdditionalField(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ClassMethodInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ClassMethodInitialiser.java new file mode 100644 index 0000000000..f7511ca2d8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ClassMethodInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.MembersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.members.ClassMethod; + +public class ClassMethodInitialiser extends AbstractInitialiserBase implements IClassMethodInitialiser { + @Override + public ClassMethod instantiate() { + return MembersFactory.eINSTANCE.createClassMethod(); + } + + @Override + public ClassMethodInitialiser newInitialiser() { + return new ClassMethodInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ConstructorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ConstructorInitialiser.java new file mode 100644 index 0000000000..8f24387404 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/ConstructorInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.MembersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.members.Constructor; + +public class ConstructorInitialiser extends AbstractInitialiserBase implements IConstructorInitialiser { + @Override + public Constructor instantiate() { + return MembersFactory.eINSTANCE.createConstructor(); + } + + @Override + public ConstructorInitialiser newInitialiser() { + return new ConstructorInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EmptyMemberInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EmptyMemberInitialiser.java new file mode 100644 index 0000000000..75ae9bfb76 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EmptyMemberInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.EmptyMember; +import org.emftext.language.java.members.MembersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class EmptyMemberInitialiser extends AbstractInitialiserBase implements IEmptyMemberInitialiser { + @Override + public IEmptyMemberInitialiser newInitialiser() { + return new EmptyMemberInitialiser(); + } + + @Override + public EmptyMember instantiate() { + return MembersFactory.eINSTANCE.createEmptyMember(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EnumConstantInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EnumConstantInitialiser.java new file mode 100644 index 0000000000..034568dc67 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/EnumConstantInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.MembersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.members.EnumConstant; + +public class EnumConstantInitialiser extends AbstractInitialiserBase implements IEnumConstantInitialiser { + @Override + public EnumConstant instantiate() { + return MembersFactory.eINSTANCE.createEnumConstant(); + } + + @Override + public IEnumConstantInitialiser newInitialiser() { + return new EnumConstantInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/FieldInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/FieldInitialiser.java new file mode 100644 index 0000000000..4285301f7c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/FieldInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.Field; +import org.emftext.language.java.members.MembersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class FieldInitialiser extends AbstractInitialiserBase implements IFieldInitialiser { + @Override + public Field instantiate() { + return MembersFactory.eINSTANCE.createField(); + } + + @Override + public FieldInitialiser newInitialiser() { + return new FieldInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IAdditionalFieldInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IAdditionalFieldInitialiser.java new file mode 100644 index 0000000000..7e76c708de --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IAdditionalFieldInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.AdditionalField; + +import cipm.consistency.initialisers.jamopp.instantiations.IInitializableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IReferenceableElementInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IAdditionalFieldInitialiser + extends IInitializableInitialiser, IReferenceableElementInitialiser, ITypedElementInitialiser { + @Override + public AdditionalField instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IClassMethodInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IClassMethodInitialiser.java new file mode 100644 index 0000000000..ee2cb6b255 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IClassMethodInitialiser.java @@ -0,0 +1,57 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.ClassMethod; +import org.emftext.language.java.statements.Statement; +import org.emftext.language.java.statements.StatementListContainer; + +import cipm.consistency.initialisers.jamopp.statements.IStatementListContainerInitialiser; + +/** + * An interface meant for {@link IInitialiser} implementors that are supposed to + * create {@link ClassMethod} instances.
+ *
+ * Due to inconsistencies regarding {@link ClassMethod}, it provides 2 methods + * for adding {@link Statement} instances to it. Adding multiple statements is + * only possible via {@code classMethod.getStatement().add(...)}, which only + * works if classMethod has a {@link Block} set as its statement. This can be + * achieved by passing a {@link Block} instance to + * {@link #setStatement(org.emftext.language.java.statements.StatementContainer, Statement)}. + *
+ *
+ * Otherwise, one may only add a single statement to {@link ClassMethod} via + * {@code classMethod.setStatement(...)}. Note that the said method will + * REPLACE the former statement when used. + * + * @author Alp Torac Genc + * + */ +public interface IClassMethodInitialiser extends IMethodInitialiser, IStatementListContainerInitialiser { + @Override + public ClassMethod instantiate(); + + /** + * A {@link Block} instance must be added to slc (a {@link ClassMethod} in this + * case) for this method to function as intended. This can be done via + * {@link #setStatement(org.emftext.language.java.statements.StatementContainer, Statement)}. + * If slc already has its {@link Statement} set via + * {@link #setStatement(org.emftext.language.java.statements.StatementContainer, Statement)}, + * that statement must be saved in a temporal variable before calling the said + * method. It can then be re-added to slc via calling this method.
+ *
+ * Otherwise, {@code slc.setStatement(st)} can be used to add a single + * {@link Statement} to slc. Note that the {@link Statement} added to slc + * this way WILL BE REPLACED, if {@code slc.setStatement(anotherSt)} is + * called.
+ *
+ * Overridden only to provide commentary. + */ + @Override + public default boolean addStatement(StatementListContainer slc, Statement st) { + return IStatementListContainerInitialiser.super.addStatement(slc, st); + } + + @Override + public default boolean canContainStatements(StatementListContainer slc) { + return ((ClassMethod) slc).getBlock() != null; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IConstructorInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IConstructorInitialiser.java new file mode 100644 index 0000000000..6dc7082e0f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IConstructorInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.Constructor; +import org.emftext.language.java.statements.StatementListContainer; + +import cipm.consistency.initialisers.jamopp.generics.ITypeParametrizableInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.IAnnotableAndModifiableInitialiser; +import cipm.consistency.initialisers.jamopp.parameters.IParametrizableInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IBlockContainerInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IStatementListContainerInitialiser; + +public interface IConstructorInitialiser extends IAnnotableAndModifiableInitialiser, IBlockContainerInitialiser, + IExceptionThrowerInitialiser, IMemberInitialiser, IParametrizableInitialiser, + IStatementListContainerInitialiser, ITypeParametrizableInitialiser { + + @Override + public Constructor instantiate(); + + @Override + public default boolean canContainStatements(StatementListContainer slc) { + return ((Constructor) slc).getBlock() != null; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEmptyMemberInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEmptyMemberInitialiser.java new file mode 100644 index 0000000000..252f86424b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEmptyMemberInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.EmptyMember; + +public interface IEmptyMemberInitialiser extends IMemberInitialiser { + @Override + public EmptyMember instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEnumConstantInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEnumConstantInitialiser.java new file mode 100644 index 0000000000..52bf696e49 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IEnumConstantInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.classifiers.AnonymousClass; +import org.emftext.language.java.members.EnumConstant; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IArgumentableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IReferenceableElementInitialiser; + +public interface IEnumConstantInitialiser + extends IArgumentableInitialiser, IAnnotableInitialiser, IReferenceableElementInitialiser { + @Override + public EnumConstant instantiate(); + + public default boolean setAnonymousClass(EnumConstant ec, AnonymousClass anonymousCls) { + ec.setAnonymousClass(anonymousCls); + return (anonymousCls == null && ec.getAnonymousClass() == null) || ec.getAnonymousClass().equals(anonymousCls); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IExceptionThrowerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IExceptionThrowerInitialiser.java new file mode 100644 index 0000000000..514a657f92 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IExceptionThrowerInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.ExceptionThrower; +import org.emftext.language.java.types.NamespaceClassifierReference; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IExceptionThrowerInitialiser extends ICommentableInitialiser { + @Override + public ExceptionThrower instantiate(); + + public default boolean addException(ExceptionThrower extt, NamespaceClassifierReference exception) { + if (exception != null) { + extt.getExceptions().add(exception); + return extt.getExceptions().contains(exception); + } + return true; + } + + public default boolean addExceptions(ExceptionThrower extt, NamespaceClassifierReference[] exceptions) { + return this.doMultipleModifications(extt, exceptions, this::addException); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IFieldInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IFieldInitialiser.java new file mode 100644 index 0000000000..0ce8522e30 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IFieldInitialiser.java @@ -0,0 +1,26 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.AdditionalField; +import org.emftext.language.java.members.Field; + +import cipm.consistency.initialisers.jamopp.instantiations.IInitializableInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.IAnnotableAndModifiableInitialiser; +import cipm.consistency.initialisers.jamopp.variables.IVariableInitialiser; + +public interface IFieldInitialiser extends IAnnotableAndModifiableInitialiser, IInitializableInitialiser, + IMemberInitialiser, IVariableInitialiser { + @Override + public Field instantiate(); + + public default boolean addAdditionalField(Field field, AdditionalField additionalField) { + if (additionalField != null) { + field.getAdditionalFields().add(additionalField); + return field.getAdditionalFields().contains(additionalField); + } + return true; + } + + public default boolean addAdditionalFields(Field field, AdditionalField[] additionalFields) { + return this.doMultipleModifications(field, additionalFields, this::addAdditionalField); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IInterfaceMethodInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IInterfaceMethodInitialiser.java new file mode 100644 index 0000000000..f109eb2128 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IInterfaceMethodInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.members.InterfaceMethod; + +public interface IInterfaceMethodInitialiser extends IMethodInitialiser { + @Override + public InterfaceMethod instantiate(); + + public default boolean setDefaultValue(InterfaceMethod im, AnnotationValue defVal) { + im.setDefaultValue(defVal); + return (defVal == null && im.getDefaultValue() == null) || im.getDefaultValue().equals(defVal); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberContainerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberContainerInitialiser.java new file mode 100644 index 0000000000..065629a33b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberContainerInitialiser.java @@ -0,0 +1,48 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.Member; +import org.emftext.language.java.members.MemberContainer; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +/** + * An interface meant to be implemented by initialisers, which are supposed to + * create {@link MemberContainer} instances.
+ *
+ * {@code mc.createField(...)} method internally creates a {@link Field}, adds + * it to the calling member container mc and returns the said field. It + * introduces no new ways to modify the calling member container.
+ *
+ * Getter methods of {@link MemberContainer} do not return modifiable lists, + * except for {@code mc.getMembers()} and {@code mc.getDefaultMembers()}. + * + * @author Alp Torac Genc + */ +public interface IMemberContainerInitialiser extends ICommentableInitialiser { + @Override + public MemberContainer instantiate(); + + public default boolean addMember(MemberContainer mc, Member mem) { + if (mem != null) { + mc.getMembers().add(mem); + return mc.getMembers().contains(mem); + } + return true; + } + + public default boolean addMembers(MemberContainer mc, Member[] mems) { + return this.doMultipleModifications(mc, mems, this::addMember); + } + + public default boolean addDefaultMember(MemberContainer mc, Member defMem) { + if (defMem != null) { + mc.getDefaultMembers().add(defMem); + return mc.getDefaultMembers().contains(defMem); + } + return true; + } + + public default boolean addDefaultMembers(MemberContainer mc, Member[] defMems) { + return this.doMultipleModifications(mc, defMems, this::addDefaultMember); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberInitialiser.java new file mode 100644 index 0000000000..90a0527ee9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMemberInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.Member; + +import cipm.consistency.initialisers.jamopp.commons.INamedElementInitialiser; + +public interface IMemberInitialiser extends INamedElementInitialiser { + @Override + public Member instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMethodInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMethodInitialiser.java new file mode 100644 index 0000000000..49b6d0887f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/IMethodInitialiser.java @@ -0,0 +1,17 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.Method; + +import cipm.consistency.initialisers.jamopp.generics.ITypeParametrizableInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.IAnnotableAndModifiableInitialiser; +import cipm.consistency.initialisers.jamopp.parameters.IParametrizableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IReferenceableElementInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IStatementContainerInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IMethodInitialiser extends IAnnotableAndModifiableInitialiser, IExceptionThrowerInitialiser, + IMemberInitialiser, IReferenceableElementInitialiser, IParametrizableInitialiser, + IStatementContainerInitialiser, ITypedElementInitialiser, ITypeParametrizableInitialiser { + @Override + public Method instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/InterfaceMethodInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/InterfaceMethodInitialiser.java new file mode 100644 index 0000000000..b4e8a25467 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/InterfaceMethodInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.members; + +import org.emftext.language.java.members.MembersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.members.InterfaceMethod; + +public class InterfaceMethodInitialiser extends AbstractInitialiserBase implements IInterfaceMethodInitialiser { + @Override + public InterfaceMethod instantiate() { + return MembersFactory.eINSTANCE.createInterfaceMethod(); + } + + @Override + public InterfaceMethodInitialiser newInitialiser() { + return new InterfaceMethodInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/MembersInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/MembersInitialiserPackage.java new file mode 100644 index 0000000000..f3ad53c127 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/MembersInitialiserPackage.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.jamopp.members; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class MembersInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new AdditionalFieldInitialiser(), new ClassMethodInitialiser(), + new ConstructorInitialiser(), new EmptyMemberInitialiser(), new EnumConstantInitialiser(), + new FieldInitialiser(), new InterfaceMethodInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAdditionalFieldInitialiser.class, IClassMethodInitialiser.class, + IConstructorInitialiser.class, IEmptyMemberInitialiser.class, IEnumConstantInitialiser.class, + IExceptionThrowerInitialiser.class, IFieldInitialiser.class, IInterfaceMethodInitialiser.class, + IMemberContainerInitialiser.class, IMemberInitialiser.class, IMethodInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/package-info.java new file mode 100644 index 0000000000..c43905ba82 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/members/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.members}. + */ +package cipm.consistency.initialisers.jamopp.members; \ No newline at end of file From 4f51e33ae0f503f93afaf0b6e184eef4b34bfbbf Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:37:43 +0200 Subject: [PATCH 22/87] (WIP) Implement initialiser package for org.emftext.language.java.modules --- .../ExportsModuleDirectiveInitialiser.java | 20 ++++++++++++ ...ssProvidingModuleDirectiveInitialiser.java | 31 +++++++++++++++++++ .../IExportsModuleDirectiveInitialiser.java | 8 +++++ .../modules/IModuleDirectiveInitialiser.java | 11 +++++++ .../modules/IModuleReferenceInitialiser.java | 16 ++++++++++ .../IOpensModuleDirectiveInitialiser.java | 9 ++++++ .../IProvidesModuleDirectiveInitialiser.java | 23 ++++++++++++++ .../IRequiresModuleDirectiveInitialiser.java | 20 ++++++++++++ .../IUsesModuleDirectiveInitialiser.java | 10 ++++++ .../modules/ModuleReferenceInitialiser.java | 18 +++++++++++ .../modules/ModulesInitialiserPackage.java | 26 ++++++++++++++++ .../OpensModuleDirectiveInitialiser.java | 19 ++++++++++++ .../ProvidesModuleDirectiveInitialiser.java | 19 ++++++++++++ .../RequiresModuleDirectiveInitialiser.java | 19 ++++++++++++ .../UsesModuleDirectiveInitialiser.java | 18 +++++++++++ .../jamopp/modules/package-info.java | 5 +++ 16 files changed, 272 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ExportsModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IAccessProvidingModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IExportsModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IOpensModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IProvidesModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IRequiresModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IUsesModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModuleReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModulesInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/OpensModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ProvidesModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/RequiresModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/UsesModuleDirectiveInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ExportsModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ExportsModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..4e6a5f7640 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ExportsModuleDirectiveInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ModulesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.modules.ExportsModuleDirective; + +public class ExportsModuleDirectiveInitialiser extends AbstractInitialiserBase + implements IExportsModuleDirectiveInitialiser { + @Override + public IExportsModuleDirectiveInitialiser newInitialiser() { + return new ExportsModuleDirectiveInitialiser(); + } + + @Override + public ExportsModuleDirective instantiate() { + return ModulesFactory.eINSTANCE.createExportsModuleDirective(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IAccessProvidingModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IAccessProvidingModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..a5cebd8d4f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IAccessProvidingModuleDirectiveInitialiser.java @@ -0,0 +1,31 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.containers.Package; +import org.emftext.language.java.modules.AccessProvidingModuleDirective; +import org.emftext.language.java.modules.ModuleReference; + +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; + +public interface IAccessProvidingModuleDirectiveInitialiser + extends IModuleDirectiveInitialiser, INamespaceAwareElementInitialiser { + @Override + public AccessProvidingModuleDirective instantiate(); + + public default boolean setAccessablePackage(AccessProvidingModuleDirective apmd, Package accessablePac) { + apmd.setAccessablePackage(accessablePac); + return (accessablePac == null && apmd.getAccessablePackage() == null) + || apmd.getAccessablePackage().equals(accessablePac); + } + + public default boolean addModule(AccessProvidingModuleDirective apmd, ModuleReference mod) { + if (mod != null) { + apmd.getModules().add(mod); + return apmd.getModules().contains(mod); + } + return true; + } + + public default boolean addModules(AccessProvidingModuleDirective apmd, ModuleReference[] mods) { + return this.doMultipleModifications(apmd, mods, this::addModule); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IExportsModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IExportsModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..fb47a93778 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IExportsModuleDirectiveInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ExportsModuleDirective; + +public interface IExportsModuleDirectiveInitialiser extends IAccessProvidingModuleDirectiveInitialiser { + @Override + public ExportsModuleDirective instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..de2f1b1183 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleDirectiveInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ModuleDirective; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IModuleDirectiveInitialiser extends ICommentableInitialiser { + @Override + public ModuleDirective instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleReferenceInitialiser.java new file mode 100644 index 0000000000..5d9f4cbf20 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IModuleReferenceInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.containers.Module; +import org.emftext.language.java.modules.ModuleReference; + +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; + +public interface IModuleReferenceInitialiser extends INamespaceAwareElementInitialiser { + @Override + public ModuleReference instantiate(); + + public default boolean setTarget(ModuleReference mref, Module target) { + mref.setTarget(target); + return (target == null && mref.getTarget() == null) || mref.getTarget().equals(target); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IOpensModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IOpensModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..c70121f14d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IOpensModuleDirectiveInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.OpensModuleDirective; + +public interface IOpensModuleDirectiveInitialiser extends IAccessProvidingModuleDirectiveInitialiser { + @Override + public OpensModuleDirective instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IProvidesModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IProvidesModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..a868d73fe9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IProvidesModuleDirectiveInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ProvidesModuleDirective; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IProvidesModuleDirectiveInitialiser extends IModuleDirectiveInitialiser, ITypedElementInitialiser { + @Override + public ProvidesModuleDirective instantiate(); + + public default boolean addServiceProvider(ProvidesModuleDirective pmd, TypeReference serviceProvider) { + if (serviceProvider != null) { + pmd.getServiceProviders().add(serviceProvider); + return pmd.getServiceProviders().contains(serviceProvider); + } + return true; + } + + public default boolean addServiceProviders(ProvidesModuleDirective pmd, TypeReference[] serviceProviders) { + return this.doMultipleModifications(pmd, serviceProviders, this::addServiceProvider); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IRequiresModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IRequiresModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..06611071c6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IRequiresModuleDirectiveInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modifiers.ModuleRequiresModifier; +import org.emftext.language.java.modules.ModuleReference; +import org.emftext.language.java.modules.RequiresModuleDirective; + +public interface IRequiresModuleDirectiveInitialiser extends IModuleDirectiveInitialiser { + @Override + public RequiresModuleDirective instantiate(); + + public default boolean setModifier(RequiresModuleDirective rmd, ModuleRequiresModifier modif) { + rmd.setModifier(modif); + return (modif == null && rmd.getModifier() == null) || rmd.getModifier().equals(modif); + } + + public default boolean setRequiredModule(RequiresModuleDirective rmd, ModuleReference reqMod) { + rmd.setRequiredModule(reqMod); + return (reqMod == null && rmd.getRequiredModule() == null) || rmd.getRequiredModule().equals(reqMod); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IUsesModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IUsesModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..79f73e7bfc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/IUsesModuleDirectiveInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.UsesModuleDirective; + +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IUsesModuleDirectiveInitialiser extends IModuleDirectiveInitialiser, ITypedElementInitialiser { + @Override + public UsesModuleDirective instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModuleReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModuleReferenceInitialiser.java new file mode 100644 index 0000000000..6236cc2b31 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModuleReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ModuleReference; +import org.emftext.language.java.modules.ModulesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ModuleReferenceInitialiser extends AbstractInitialiserBase implements IModuleReferenceInitialiser { + @Override + public IModuleReferenceInitialiser newInitialiser() { + return new ModuleReferenceInitialiser(); + } + + @Override + public ModuleReference instantiate() { + return ModulesFactory.eINSTANCE.createModuleReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModulesInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModulesInitialiserPackage.java new file mode 100644 index 0000000000..6d2fa8da89 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ModulesInitialiserPackage.java @@ -0,0 +1,26 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ModulesInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this + .initCol(new IInitialiser[] { new ExportsModuleDirectiveInitialiser(), new ModuleReferenceInitialiser(), + new OpensModuleDirectiveInitialiser(), new ProvidesModuleDirectiveInitialiser(), + new RequiresModuleDirectiveInitialiser(), new UsesModuleDirectiveInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAccessProvidingModuleDirectiveInitialiser.class, + IExportsModuleDirectiveInitialiser.class, IModuleDirectiveInitialiser.class, + IModuleReferenceInitialiser.class, IOpensModuleDirectiveInitialiser.class, + IProvidesModuleDirectiveInitialiser.class, IRequiresModuleDirectiveInitialiser.class, + IUsesModuleDirectiveInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/OpensModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/OpensModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..ecabb28de7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/OpensModuleDirectiveInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ModulesFactory; +import org.emftext.language.java.modules.OpensModuleDirective; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class OpensModuleDirectiveInitialiser extends AbstractInitialiserBase + implements IOpensModuleDirectiveInitialiser { + @Override + public IOpensModuleDirectiveInitialiser newInitialiser() { + return new OpensModuleDirectiveInitialiser(); + } + + @Override + public OpensModuleDirective instantiate() { + return ModulesFactory.eINSTANCE.createOpensModuleDirective(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ProvidesModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ProvidesModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..3dca94bcd9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/ProvidesModuleDirectiveInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ModulesFactory; +import org.emftext.language.java.modules.ProvidesModuleDirective; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ProvidesModuleDirectiveInitialiser extends AbstractInitialiserBase + implements IProvidesModuleDirectiveInitialiser { + @Override + public IProvidesModuleDirectiveInitialiser newInitialiser() { + return new ProvidesModuleDirectiveInitialiser(); + } + + @Override + public ProvidesModuleDirective instantiate() { + return ModulesFactory.eINSTANCE.createProvidesModuleDirective(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/RequiresModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/RequiresModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..d698fa74bd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/RequiresModuleDirectiveInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ModulesFactory; +import org.emftext.language.java.modules.RequiresModuleDirective; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class RequiresModuleDirectiveInitialiser extends AbstractInitialiserBase + implements IRequiresModuleDirectiveInitialiser { + @Override + public IRequiresModuleDirectiveInitialiser newInitialiser() { + return new RequiresModuleDirectiveInitialiser(); + } + + @Override + public RequiresModuleDirective instantiate() { + return ModulesFactory.eINSTANCE.createRequiresModuleDirective(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/UsesModuleDirectiveInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/UsesModuleDirectiveInitialiser.java new file mode 100644 index 0000000000..3784a49959 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/UsesModuleDirectiveInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.modules; + +import org.emftext.language.java.modules.ModulesFactory; +import org.emftext.language.java.modules.UsesModuleDirective; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class UsesModuleDirectiveInitialiser extends AbstractInitialiserBase implements IUsesModuleDirectiveInitialiser { + @Override + public IUsesModuleDirectiveInitialiser newInitialiser() { + return new UsesModuleDirectiveInitialiser(); + } + + @Override + public UsesModuleDirective instantiate() { + return ModulesFactory.eINSTANCE.createUsesModuleDirective(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/package-info.java new file mode 100644 index 0000000000..c47531f1d7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/modules/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.modules}. + */ +package cipm.consistency.initialisers.jamopp.modules; \ No newline at end of file From 5011c45d7eda9c6140b49d1cf3fd8784edc9dc22 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:37:58 +0200 Subject: [PATCH 23/87] (WIP) Implement initialiser package for org.emftext.language.java.parameters --- .../parameters/CatchParameterInitialiser.java | 19 +++++++++++++++ .../ICatchParameterInitialiser.java | 21 +++++++++++++++++ .../IOrdinaryParameterInitialiser.java | 8 +++++++ .../parameters/IParameterInitialiser.java | 11 +++++++++ .../IParametrizableInitialiser.java | 23 +++++++++++++++++++ .../IReceiverParameterInitialiser.java | 22 ++++++++++++++++++ .../IVariableLengthParameterInitialiser.java | 10 ++++++++ .../OrdinaryParameterInitialiser.java | 19 +++++++++++++++ .../ParametersInitialiserPackage.java | 22 ++++++++++++++++++ .../ReceiverParameterInitialiser.java | 18 +++++++++++++++ .../VariableLengthParameterInitialiser.java | 19 +++++++++++++++ .../jamopp/parameters/package-info.java | 5 ++++ 12 files changed, 197 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/CatchParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ICatchParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IOrdinaryParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParametrizableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IReceiverParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IVariableLengthParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/OrdinaryParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ParametersInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ReceiverParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/VariableLengthParameterInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/CatchParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/CatchParameterInitialiser.java new file mode 100644 index 0000000000..ca4b3746cd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/CatchParameterInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.ParametersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.parameters.CatchParameter; + +public class CatchParameterInitialiser extends AbstractInitialiserBase implements ICatchParameterInitialiser { + @Override + public CatchParameter instantiate() { + return ParametersFactory.eINSTANCE.createCatchParameter(); + } + + @Override + public ICatchParameterInitialiser newInitialiser() { + return new CatchParameterInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ICatchParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ICatchParameterInitialiser.java new file mode 100644 index 0000000000..635d2c97eb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ICatchParameterInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.CatchParameter; +import org.emftext.language.java.types.TypeReference; + +public interface ICatchParameterInitialiser extends IOrdinaryParameterInitialiser { + @Override + public CatchParameter instantiate(); + + public default boolean addTypeReference(CatchParameter cp, TypeReference tRef) { + if (tRef != null) { + cp.getTypeReferences().add(tRef); + return cp.getTypeReferences().contains(tRef); + } + return true; + } + + public default boolean addTypeReferences(CatchParameter cp, TypeReference[] tRefs) { + return this.doMultipleModifications(cp, tRefs, this::addTypeReference); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IOrdinaryParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IOrdinaryParameterInitialiser.java new file mode 100644 index 0000000000..b831bd0828 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IOrdinaryParameterInitialiser.java @@ -0,0 +1,8 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.OrdinaryParameter; + +public interface IOrdinaryParameterInitialiser extends IParameterInitialiser { + @Override + public OrdinaryParameter instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParameterInitialiser.java new file mode 100644 index 0000000000..fd25c1bfc1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParameterInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.Parameter; + +import cipm.consistency.initialisers.jamopp.modifiers.IAnnotableAndModifiableInitialiser; +import cipm.consistency.initialisers.jamopp.variables.IVariableInitialiser; + +public interface IParameterInitialiser extends IAnnotableAndModifiableInitialiser, IVariableInitialiser { + @Override + public Parameter instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParametrizableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParametrizableInitialiser.java new file mode 100644 index 0000000000..8c6d958efc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IParametrizableInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.Parameter; +import org.emftext.language.java.parameters.Parametrizable; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IParametrizableInitialiser extends ICommentableInitialiser { + @Override + public Parametrizable instantiate(); + + public default boolean addParameter(Parametrizable parametrizable, Parameter param) { + if (param != null) { + parametrizable.getParameters().add(param); + return parametrizable.getParameters().contains(param); + } + return true; + } + + public default boolean addParameters(Parametrizable parametrizable, Parameter[] params) { + return this.doMultipleModifications(parametrizable, params, this::addParameter); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IReceiverParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IReceiverParameterInitialiser.java new file mode 100644 index 0000000000..fc2f373c85 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IReceiverParameterInitialiser.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.literals.This; +import org.emftext.language.java.parameters.ReceiverParameter; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; + +public interface IReceiverParameterInitialiser extends IAnnotableInitialiser, IParameterInitialiser { + @Override + public ReceiverParameter instantiate(); + + public default boolean setOuterTypeReference(ReceiverParameter rp, TypeReference otRef) { + rp.setOuterTypeReference(otRef); + return (otRef == null && rp.getOuterTypeReference() == null) || rp.getOuterTypeReference().equals(otRef); + } + + public default boolean setThisReference(ReceiverParameter rp, This thisRef) { + rp.setThisReference(thisRef); + return (thisRef == null && rp.getThisReference() == null) || rp.getThisReference().equals(thisRef); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IVariableLengthParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IVariableLengthParameterInitialiser.java new file mode 100644 index 0000000000..47e04cbfbc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/IVariableLengthParameterInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.VariableLengthParameter; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; + +public interface IVariableLengthParameterInitialiser extends IAnnotableInitialiser, IParameterInitialiser { + @Override + public VariableLengthParameter instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/OrdinaryParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/OrdinaryParameterInitialiser.java new file mode 100644 index 0000000000..6bc970f605 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/OrdinaryParameterInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.ParametersFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.parameters.OrdinaryParameter; + +public class OrdinaryParameterInitialiser extends AbstractInitialiserBase implements IOrdinaryParameterInitialiser { + @Override + public OrdinaryParameter instantiate() { + return ParametersFactory.eINSTANCE.createOrdinaryParameter(); + } + + @Override + public IOrdinaryParameterInitialiser newInitialiser() { + return new OrdinaryParameterInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ParametersInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ParametersInitialiserPackage.java new file mode 100644 index 0000000000..d94531ce06 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ParametersInitialiserPackage.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ParametersInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new CatchParameterInitialiser(), new OrdinaryParameterInitialiser(), + new ReceiverParameterInitialiser(), new VariableLengthParameterInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { ICatchParameterInitialiser.class, IOrdinaryParameterInitialiser.class, + IParameterInitialiser.class, IParametrizableInitialiser.class, IReceiverParameterInitialiser.class, + IVariableLengthParameterInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ReceiverParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ReceiverParameterInitialiser.java new file mode 100644 index 0000000000..89bb051bbb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/ReceiverParameterInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.ParametersFactory; +import org.emftext.language.java.parameters.ReceiverParameter; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ReceiverParameterInitialiser extends AbstractInitialiserBase implements IReceiverParameterInitialiser { + @Override + public ReceiverParameter instantiate() { + return ParametersFactory.eINSTANCE.createReceiverParameter(); + } + + @Override + public IReceiverParameterInitialiser newInitialiser() { + return new ReceiverParameterInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/VariableLengthParameterInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/VariableLengthParameterInitialiser.java new file mode 100644 index 0000000000..486a338bc8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/VariableLengthParameterInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.parameters; + +import org.emftext.language.java.parameters.ParametersFactory; +import org.emftext.language.java.parameters.VariableLengthParameter; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class VariableLengthParameterInitialiser extends AbstractInitialiserBase + implements IVariableLengthParameterInitialiser { + @Override + public VariableLengthParameter instantiate() { + return ParametersFactory.eINSTANCE.createVariableLengthParameter(); + } + + @Override + public IVariableLengthParameterInitialiser newInitialiser() { + return new VariableLengthParameterInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/package-info.java new file mode 100644 index 0000000000..a8f067bfae --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/parameters/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.parameters}. + */ +package cipm.consistency.initialisers.jamopp.parameters; \ No newline at end of file From 4e265fa54f8e9c9718caaa7372e7e0839c49782f Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:39:02 +0200 Subject: [PATCH 24/87] (WIP) Implement initialiser package for org.emftext.language.java.references --- .../references/IArgumentableInitialiser.java | 37 +++++++++++++++++++ .../IElementReferenceInitialiser.java | 19 ++++++++++ .../IIdentifierReferenceInitialiser.java | 12 ++++++ .../references/IMethodCallInitialiser.java | 11 ++++++ .../IPackageReferenceInitialiser.java | 11 ++++++ .../IPrimitiveTypeReferenceInitialiser.java | 16 ++++++++ .../references/IReferenceInitialiser.java | 34 +++++++++++++++++ .../IReferenceableElementInitialiser.java | 10 +++++ .../IReflectiveClassReferenceInitialiser.java | 9 +++++ .../references/ISelfReferenceInitialiser.java | 14 +++++++ .../IStringReferenceInitialiser.java | 13 +++++++ .../ITextBlockReferenceInitialiser.java | 13 +++++++ .../IdentifierReferenceInitialiser.java | 18 +++++++++ .../references/MethodCallInitialiser.java | 18 +++++++++ .../PackageReferenceInitialiser.java | 18 +++++++++ .../PrimitiveTypeReferenceInitialiser.java | 19 ++++++++++ .../ReferencesInitialiserPackage.java | 27 ++++++++++++++ .../ReflectiveClassReferenceInitialiser.java | 19 ++++++++++ .../references/SelfReferenceInitialiser.java | 18 +++++++++ .../StringReferenceInitialiser.java | 18 +++++++++ .../TextBlockReferenceInitialiser.java | 18 +++++++++ .../jamopp/references/package-info.java | 5 +++ 22 files changed, 377 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IArgumentableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IElementReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IIdentifierReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IMethodCallInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPackageReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPrimitiveTypeReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceableElementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReflectiveClassReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ISelfReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IStringReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ITextBlockReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IdentifierReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/MethodCallInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PackageReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PrimitiveTypeReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReferencesInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReflectiveClassReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/SelfReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/StringReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/TextBlockReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IArgumentableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IArgumentableInitialiser.java new file mode 100644 index 0000000000..0064816943 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IArgumentableInitialiser.java @@ -0,0 +1,37 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.references.Argumentable; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +/** + * An interface meant for {@link IInitialiser} implementors that are supposed to + * create {@link Argumentable} instances.
+ *
+ * {@code argable.getArgumentTypes().add(...)} cannot be used to modify argable. + * + * @author Alp Torac Genc + */ +public interface IArgumentableInitialiser extends ICommentableInitialiser { + @Override + public Argumentable instantiate(); + + /** + * Adds the given expression arg to argable as an argument. Uses + * {@code argable.getArguments().add(...)} to do so. + * + * @see {@link IArgumentableInitialiser} + */ + public default boolean addArgument(Argumentable argable, Expression arg) { + if (arg != null) { + argable.getArguments().add(arg); + return argable.getArguments().contains(arg); + } + return true; + } + + public default boolean addArguments(Argumentable argable, Expression[] args) { + return this.doMultipleModifications(argable, args, this::addArgument); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IElementReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IElementReferenceInitialiser.java new file mode 100644 index 0000000000..76280b6bd6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IElementReferenceInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.ElementReference; +import org.emftext.language.java.references.ReferenceableElement; + +public interface IElementReferenceInitialiser extends IReferenceInitialiser { + @Override + public ElementReference instantiate(); + + public default boolean setContainedTarget(ElementReference eref, ReferenceableElement conTarget) { + eref.setContainedTarget(conTarget); + return (conTarget == null && eref.getContainedTarget() == null) || eref.getContainedTarget().equals(conTarget); + } + + public default boolean setTarget(ElementReference eref, ReferenceableElement target) { + eref.setTarget(target); + return (target == null && eref.getTarget() == null) || eref.getTarget().equals(target); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IIdentifierReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IIdentifierReferenceInitialiser.java new file mode 100644 index 0000000000..87e073b44c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IIdentifierReferenceInitialiser.java @@ -0,0 +1,12 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.IdentifierReference; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; +import cipm.consistency.initialisers.jamopp.arrays.IArrayTypeableInitialiser; + +public interface IIdentifierReferenceInitialiser + extends IAnnotableInitialiser, IArrayTypeableInitialiser, IElementReferenceInitialiser { + @Override + public IdentifierReference instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IMethodCallInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IMethodCallInitialiser.java new file mode 100644 index 0000000000..4bb409b0e8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IMethodCallInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.MethodCall; + +import cipm.consistency.initialisers.jamopp.generics.ICallTypeArgumentableInitialiser; + +public interface IMethodCallInitialiser + extends IElementReferenceInitialiser, IArgumentableInitialiser, ICallTypeArgumentableInitialiser { + @Override + public MethodCall instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPackageReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPackageReferenceInitialiser.java new file mode 100644 index 0000000000..56f511fb1c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPackageReferenceInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.PackageReference; + +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; + +public interface IPackageReferenceInitialiser + extends INamespaceAwareElementInitialiser, IReferenceableElementInitialiser { + @Override + public PackageReference instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPrimitiveTypeReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPrimitiveTypeReferenceInitialiser.java new file mode 100644 index 0000000000..34a58ea332 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IPrimitiveTypeReferenceInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.PrimitiveTypeReference; +import org.emftext.language.java.types.PrimitiveType; + +import cipm.consistency.initialisers.jamopp.arrays.IArrayTypeableInitialiser; + +public interface IPrimitiveTypeReferenceInitialiser extends IArrayTypeableInitialiser, IReferenceInitialiser { + @Override + public PrimitiveTypeReference instantiate(); + + public default boolean setPrimitiveType(PrimitiveTypeReference ptr, PrimitiveType pt) { + ptr.setPrimitiveType(pt); + return (pt == null && ptr.getPrimitiveType() == null) || ptr.getPrimitiveType().equals(pt); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceInitialiser.java new file mode 100644 index 0000000000..8d15264afb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceInitialiser.java @@ -0,0 +1,34 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.references.Reference; + +import cipm.consistency.initialisers.jamopp.expressions.IPrimaryExpressionInitialiser; +import cipm.consistency.initialisers.jamopp.generics.ITypeArgumentableInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypedElementExtensionInitialiser; + +public interface IReferenceInitialiser + extends IPrimaryExpressionInitialiser, ITypeArgumentableInitialiser, ITypedElementExtensionInitialiser { + + @Override + public Reference instantiate(); + + public default boolean addArraySelector(Reference ref, ArraySelector arrSel) { + if (arrSel != null) { + ref.getArraySelectors().add(arrSel); + return ref.getArraySelectors().contains(arrSel); + } + return true; + } + + public default boolean addArraySelectors(Reference ref, ArraySelector[] arrSels) { + return this.doMultipleModifications(ref, arrSels, this::addArraySelector); + } + + public default boolean setNext(Reference ref, Reference next) { + ref.setNext(next); + return (next == null && ref.getNext() == null) + || (ref.getNext().equals(next) && ref.getNext().getPrevious().equals(ref) + && next.getPrevious().equals(ref) && next.getPrevious().getNext().equals(next)); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceableElementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceableElementInitialiser.java new file mode 100644 index 0000000000..22aeb4f6a0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReferenceableElementInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.ReferenceableElement; + +import cipm.consistency.initialisers.jamopp.commons.INamedElementInitialiser; + +public interface IReferenceableElementInitialiser extends INamedElementInitialiser { + @Override + public ReferenceableElement instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReflectiveClassReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReflectiveClassReferenceInitialiser.java new file mode 100644 index 0000000000..0683251183 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IReflectiveClassReferenceInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.ReflectiveClassReference; + +public interface IReflectiveClassReferenceInitialiser extends IReferenceInitialiser { + @Override + public ReflectiveClassReference instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ISelfReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ISelfReferenceInitialiser.java new file mode 100644 index 0000000000..82a1453360 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ISelfReferenceInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.literals.Self; +import org.emftext.language.java.references.SelfReference; + +public interface ISelfReferenceInitialiser extends IReferenceInitialiser { + @Override + public SelfReference instantiate(); + + public default boolean setSelf(SelfReference sref, Self self) { + sref.setSelf(self); + return (self == null && sref.getSelf() == null) || sref.getSelf().equals(self); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IStringReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IStringReferenceInitialiser.java new file mode 100644 index 0000000000..877ce754d3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IStringReferenceInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.StringReference; + +public interface IStringReferenceInitialiser extends IReferenceInitialiser { + @Override + public StringReference instantiate(); + + public default boolean setValue(StringReference sref, String val) { + sref.setValue(val); + return (val == null && sref.getValue() == null) || sref.getValue().equals(val); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ITextBlockReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ITextBlockReferenceInitialiser.java new file mode 100644 index 0000000000..3d5c954823 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ITextBlockReferenceInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.TextBlockReference; + +public interface ITextBlockReferenceInitialiser extends IReferenceInitialiser { + @Override + public TextBlockReference instantiate(); + + public default boolean setValue(TextBlockReference tbref, String val) { + tbref.setValue(val); + return (val == null && tbref.getValue() == null) || tbref.getValue().equals(val); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IdentifierReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IdentifierReferenceInitialiser.java new file mode 100644 index 0000000000..4d29328559 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/IdentifierReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.IdentifierReference; +import org.emftext.language.java.references.ReferencesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class IdentifierReferenceInitialiser extends AbstractInitialiserBase implements IIdentifierReferenceInitialiser { + @Override + public IIdentifierReferenceInitialiser newInitialiser() { + return new IdentifierReferenceInitialiser(); + } + + @Override + public IdentifierReference instantiate() { + return ReferencesFactory.eINSTANCE.createIdentifierReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/MethodCallInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/MethodCallInitialiser.java new file mode 100644 index 0000000000..3a32a11a52 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/MethodCallInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.MethodCall; +import org.emftext.language.java.references.ReferencesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class MethodCallInitialiser extends AbstractInitialiserBase implements IMethodCallInitialiser { + @Override + public IMethodCallInitialiser newInitialiser() { + return new MethodCallInitialiser(); + } + + @Override + public MethodCall instantiate() { + return ReferencesFactory.eINSTANCE.createMethodCall(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PackageReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PackageReferenceInitialiser.java new file mode 100644 index 0000000000..ba4e23bc0e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PackageReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.PackageReference; +import org.emftext.language.java.references.ReferencesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PackageReferenceInitialiser extends AbstractInitialiserBase implements IPackageReferenceInitialiser { + @Override + public IPackageReferenceInitialiser newInitialiser() { + return new PackageReferenceInitialiser(); + } + + @Override + public PackageReference instantiate() { + return ReferencesFactory.eINSTANCE.createPackageReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PrimitiveTypeReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PrimitiveTypeReferenceInitialiser.java new file mode 100644 index 0000000000..030fd1b9f1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/PrimitiveTypeReferenceInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.PrimitiveTypeReference; +import org.emftext.language.java.references.ReferencesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class PrimitiveTypeReferenceInitialiser extends AbstractInitialiserBase + implements IPrimitiveTypeReferenceInitialiser { + @Override + public IPrimitiveTypeReferenceInitialiser newInitialiser() { + return new PrimitiveTypeReferenceInitialiser(); + } + + @Override + public PrimitiveTypeReference instantiate() { + return ReferencesFactory.eINSTANCE.createPrimitiveTypeReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReferencesInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReferencesInitialiserPackage.java new file mode 100644 index 0000000000..21812110f5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReferencesInitialiserPackage.java @@ -0,0 +1,27 @@ +package cipm.consistency.initialisers.jamopp.references; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class ReferencesInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new IdentifierReferenceInitialiser(), new MethodCallInitialiser(), + new PackageReferenceInitialiser(), new PrimitiveTypeReferenceInitialiser(), + new ReflectiveClassReferenceInitialiser(), new SelfReferenceInitialiser(), + new StringReferenceInitialiser(), new TextBlockReferenceInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IArgumentableInitialiser.class, IElementReferenceInitialiser.class, + IIdentifierReferenceInitialiser.class, IMethodCallInitialiser.class, IPackageReferenceInitialiser.class, + IPrimitiveTypeReferenceInitialiser.class, IReferenceableElementInitialiser.class, + IReferenceInitialiser.class, IReflectiveClassReferenceInitialiser.class, + ISelfReferenceInitialiser.class, IStringReferenceInitialiser.class, + ITextBlockReferenceInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReflectiveClassReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReflectiveClassReferenceInitialiser.java new file mode 100644 index 0000000000..e80574f949 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/ReflectiveClassReferenceInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.ReferencesFactory; +import org.emftext.language.java.references.ReflectiveClassReference; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ReflectiveClassReferenceInitialiser extends AbstractInitialiserBase + implements IReflectiveClassReferenceInitialiser { + @Override + public IReflectiveClassReferenceInitialiser newInitialiser() { + return new ReflectiveClassReferenceInitialiser(); + } + + @Override + public ReflectiveClassReference instantiate() { + return ReferencesFactory.eINSTANCE.createReflectiveClassReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/SelfReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/SelfReferenceInitialiser.java new file mode 100644 index 0000000000..bd74cbce4e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/SelfReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.ReferencesFactory; +import org.emftext.language.java.references.SelfReference; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SelfReferenceInitialiser extends AbstractInitialiserBase implements ISelfReferenceInitialiser { + @Override + public ISelfReferenceInitialiser newInitialiser() { + return new SelfReferenceInitialiser(); + } + + @Override + public SelfReference instantiate() { + return ReferencesFactory.eINSTANCE.createSelfReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/StringReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/StringReferenceInitialiser.java new file mode 100644 index 0000000000..297e697e2d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/StringReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.ReferencesFactory; +import org.emftext.language.java.references.StringReference; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class StringReferenceInitialiser extends AbstractInitialiserBase implements IStringReferenceInitialiser { + @Override + public IStringReferenceInitialiser newInitialiser() { + return new StringReferenceInitialiser(); + } + + @Override + public StringReference instantiate() { + return ReferencesFactory.eINSTANCE.createStringReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/TextBlockReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/TextBlockReferenceInitialiser.java new file mode 100644 index 0000000000..84058618fc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/TextBlockReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.references; + +import org.emftext.language.java.references.ReferencesFactory; +import org.emftext.language.java.references.TextBlockReference; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class TextBlockReferenceInitialiser extends AbstractInitialiserBase implements ITextBlockReferenceInitialiser { + @Override + public ITextBlockReferenceInitialiser newInitialiser() { + return new TextBlockReferenceInitialiser(); + } + + @Override + public TextBlockReference instantiate() { + return ReferencesFactory.eINSTANCE.createTextBlockReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/package-info.java new file mode 100644 index 0000000000..054472ee11 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/references/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.references}. + */ +package cipm.consistency.initialisers.jamopp.references; \ No newline at end of file From a69f5e7d04837f1e24f22b60b708eff1148d0af7 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:39:39 +0200 Subject: [PATCH 25/87] (WIP) Implement initialiser package for org.emftext.language.java.statements --- .../jamopp/statements/AssertInitialiser.java | 19 ++++++ .../jamopp/statements/BlockInitialiser.java | 19 ++++++ .../jamopp/statements/BreakInitialiser.java | 18 ++++++ .../statements/CatchBlockInitialiser.java | 18 ++++++ .../statements/ConditionInitialiser.java | 18 ++++++ .../statements/ContinueInitialiser.java | 18 ++++++ .../DefaultSwitchCaseInitialiser.java | 18 ++++++ .../DefaultSwitchRuleInitialiser.java | 18 ++++++ .../statements/DoWhileLoopInitialiser.java | 18 ++++++ .../statements/EmptyStatementInitialiser.java | 18 ++++++ .../ExpressionStatementInitialiser.java | 18 ++++++ .../statements/ForEachLoopInitialiser.java | 18 ++++++ .../jamopp/statements/ForLoopInitialiser.java | 18 ++++++ .../jamopp/statements/IAssertInitialiser.java | 14 +++++ .../IBlockContainerInitialiser.java | 16 +++++ .../jamopp/statements/IBlockInitialiser.java | 18 ++++++ .../jamopp/statements/IBreakInitialiser.java | 9 +++ .../statements/ICatchBlockInitialiser.java | 21 +++++++ .../statements/IConditionInitialiser.java | 16 +++++ .../statements/IConditionalInitialiser.java | 16 +++++ .../statements/IContinueInitialiser.java | 9 +++ .../IDefaultSwitchCaseInitialiser.java | 9 +++ .../IDefaultSwitchRuleInitialiser.java | 9 +++ .../statements/IDoWhileLoopInitialiser.java | 9 +++ .../IEmptyStatementInitialiser.java | 9 +++ .../IExpressionStatementInitialiser.java | 14 +++++ .../statements/IForEachLoopInitialiser.java | 20 ++++++ .../statements/IForLoopInitialiser.java | 28 +++++++++ .../IForLoopInitializerInitialiser.java | 11 ++++ .../jamopp/statements/IJumpInitialiser.java | 14 +++++ .../statements/IJumpLabelInitialiser.java | 12 ++++ .../ILocalVariableStatementInitialiser.java | 14 +++++ .../INormalSwitchCaseInitialiser.java | 21 +++++++ .../INormalSwitchRuleInitialiser.java | 21 +++++++ .../jamopp/statements/IReturnInitialiser.java | 14 +++++ .../IStatementContainerInitialiser.java | 16 +++++ .../statements/IStatementInitialiser.java | 10 +++ .../IStatementListContainerInitialiser.java | 63 +++++++++++++++++++ .../statements/ISwitchCaseInitialiser.java | 14 +++++ .../jamopp/statements/ISwitchInitialiser.java | 29 +++++++++ .../statements/ISwitchRuleInitialiser.java | 9 +++ .../ISynchronizedBlockInitialiser.java | 22 +++++++ .../jamopp/statements/IThrowInitialiser.java | 14 +++++ .../statements/ITryBlockInitialiser.java | 47 ++++++++++++++ .../statements/IWhileLoopInitialiser.java | 10 +++ .../IYieldStatementInitialiser.java | 14 +++++ .../statements/JumpLabelInitialiser.java | 18 ++++++ .../LocalVariableStatementInitialiser.java | 19 ++++++ .../NormalSwitchCaseInitialiser.java | 18 ++++++ .../NormalSwitchRuleInitialiser.java | 18 ++++++ .../jamopp/statements/ReturnInitialiser.java | 18 ++++++ .../StatementsInitialiserPackage.java | 38 +++++++++++ .../jamopp/statements/SwitchInitialiser.java | 18 ++++++ .../SynchronizedBlockInitialiser.java | 18 ++++++ .../jamopp/statements/ThrowInitialiser.java | 18 ++++++ .../statements/TryBlockInitialiser.java | 18 ++++++ .../statements/WhileLoopInitialiser.java | 18 ++++++ .../statements/YieldStatementInitialiser.java | 18 ++++++ .../jamopp/statements/package-info.java | 5 ++ 59 files changed, 1050 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/AssertInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BreakInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/CatchBlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ConditionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ContinueInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchCaseInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchRuleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DoWhileLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/EmptyStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ExpressionStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForEachLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IAssertInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockContainerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBreakInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ICatchBlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionalInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IContinueInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchCaseInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchRuleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDoWhileLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IEmptyStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IExpressionStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForEachLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitializerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpLabelInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ILocalVariableStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchCaseInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchRuleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IReturnInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementContainerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementListContainerInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchCaseInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchRuleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISynchronizedBlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IThrowInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ITryBlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IWhileLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IYieldStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/JumpLabelInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/LocalVariableStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchCaseInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchRuleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ReturnInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/StatementsInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SwitchInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SynchronizedBlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ThrowInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/TryBlockInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/WhileLoopInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/YieldStatementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/AssertInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/AssertInitialiser.java new file mode 100644 index 0000000000..0cb92ea3fc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/AssertInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.statements.Assert; + +public class AssertInitialiser extends AbstractInitialiserBase implements IAssertInitialiser { + @Override + public IAssertInitialiser newInitialiser() { + return new AssertInitialiser(); + } + + @Override + public Assert instantiate() { + return StatementsFactory.eINSTANCE.createAssert(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BlockInitialiser.java new file mode 100644 index 0000000000..b670690848 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BlockInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.statements.Block; + +public class BlockInitialiser extends AbstractInitialiserBase implements IBlockInitialiser { + @Override + public Block instantiate() { + return StatementsFactory.eINSTANCE.createBlock(); + } + + @Override + public BlockInitialiser newInitialiser() { + return new BlockInitialiser(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BreakInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BreakInitialiser.java new file mode 100644 index 0000000000..37ce6d458f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/BreakInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Break; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class BreakInitialiser extends AbstractInitialiserBase implements IBreakInitialiser { + @Override + public IBreakInitialiser newInitialiser() { + return new BreakInitialiser(); + } + + @Override + public Break instantiate() { + return StatementsFactory.eINSTANCE.createBreak(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/CatchBlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/CatchBlockInitialiser.java new file mode 100644 index 0000000000..740a0c2d29 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/CatchBlockInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.CatchBlock; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class CatchBlockInitialiser extends AbstractInitialiserBase implements ICatchBlockInitialiser { + @Override + public CatchBlock instantiate() { + return StatementsFactory.eINSTANCE.createCatchBlock(); + } + + @Override + public CatchBlockInitialiser newInitialiser() { + return new CatchBlockInitialiser(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ConditionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ConditionInitialiser.java new file mode 100644 index 0000000000..11dad2b732 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ConditionInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Condition; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ConditionInitialiser extends AbstractInitialiserBase implements IConditionInitialiser { + @Override + public IConditionInitialiser newInitialiser() { + return new ConditionInitialiser(); + } + + @Override + public Condition instantiate() { + return StatementsFactory.eINSTANCE.createCondition(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ContinueInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ContinueInitialiser.java new file mode 100644 index 0000000000..e418655993 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ContinueInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Continue; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ContinueInitialiser extends AbstractInitialiserBase implements IContinueInitialiser { + @Override + public IContinueInitialiser newInitialiser() { + return new ContinueInitialiser(); + } + + @Override + public Continue instantiate() { + return StatementsFactory.eINSTANCE.createContinue(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchCaseInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchCaseInitialiser.java new file mode 100644 index 0000000000..58fe39deef --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchCaseInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.DefaultSwitchCase; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DefaultSwitchCaseInitialiser extends AbstractInitialiserBase implements IDefaultSwitchCaseInitialiser { + @Override + public IDefaultSwitchCaseInitialiser newInitialiser() { + return new DefaultSwitchCaseInitialiser(); + } + + @Override + public DefaultSwitchCase instantiate() { + return StatementsFactory.eINSTANCE.createDefaultSwitchCase(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchRuleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchRuleInitialiser.java new file mode 100644 index 0000000000..1b0e9bb27f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DefaultSwitchRuleInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.DefaultSwitchRule; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DefaultSwitchRuleInitialiser extends AbstractInitialiserBase implements IDefaultSwitchRuleInitialiser { + @Override + public IDefaultSwitchRuleInitialiser newInitialiser() { + return new DefaultSwitchRuleInitialiser(); + } + + @Override + public DefaultSwitchRule instantiate() { + return StatementsFactory.eINSTANCE.createDefaultSwitchRule(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DoWhileLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DoWhileLoopInitialiser.java new file mode 100644 index 0000000000..ee9ad76e93 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/DoWhileLoopInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.DoWhileLoop; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DoWhileLoopInitialiser extends AbstractInitialiserBase implements IDoWhileLoopInitialiser { + @Override + public IDoWhileLoopInitialiser newInitialiser() { + return new DoWhileLoopInitialiser(); + } + + @Override + public DoWhileLoop instantiate() { + return StatementsFactory.eINSTANCE.createDoWhileLoop(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/EmptyStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/EmptyStatementInitialiser.java new file mode 100644 index 0000000000..a17ca76ebc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/EmptyStatementInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.EmptyStatement; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class EmptyStatementInitialiser extends AbstractInitialiserBase implements IEmptyStatementInitialiser { + @Override + public IEmptyStatementInitialiser newInitialiser() { + return new EmptyStatementInitialiser(); + } + + @Override + public EmptyStatement instantiate() { + return StatementsFactory.eINSTANCE.createEmptyStatement(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ExpressionStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ExpressionStatementInitialiser.java new file mode 100644 index 0000000000..b6f75cf026 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ExpressionStatementInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.ExpressionStatement; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ExpressionStatementInitialiser extends AbstractInitialiserBase implements IExpressionStatementInitialiser { + @Override + public IExpressionStatementInitialiser newInitialiser() { + return new ExpressionStatementInitialiser(); + } + + @Override + public ExpressionStatement instantiate() { + return StatementsFactory.eINSTANCE.createExpressionStatement(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForEachLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForEachLoopInitialiser.java new file mode 100644 index 0000000000..8304afc693 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForEachLoopInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.ForEachLoop; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ForEachLoopInitialiser extends AbstractInitialiserBase implements IForEachLoopInitialiser { + @Override + public IForEachLoopInitialiser newInitialiser() { + return new ForEachLoopInitialiser(); + } + + @Override + public ForEachLoop instantiate() { + return StatementsFactory.eINSTANCE.createForEachLoop(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForLoopInitialiser.java new file mode 100644 index 0000000000..0e436c73a0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ForLoopInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.ForLoop; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ForLoopInitialiser extends AbstractInitialiserBase implements IForLoopInitialiser { + @Override + public IForLoopInitialiser newInitialiser() { + return new ForLoopInitialiser(); + } + + @Override + public ForLoop instantiate() { + return StatementsFactory.eINSTANCE.createForLoop(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IAssertInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IAssertInitialiser.java new file mode 100644 index 0000000000..27d9d01c51 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IAssertInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Assert; + +public interface IAssertInitialiser extends IConditionalInitialiser, IStatementInitialiser { + @Override + public Assert instantiate(); + + public default boolean setErrorMessage(Assert asrt, Expression errMsg) { + asrt.setErrorMessage(errMsg); + return (errMsg == null && asrt.getErrorMessage() == null) || asrt.getErrorMessage().equals(errMsg); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockContainerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockContainerInitialiser.java new file mode 100644 index 0000000000..5a4cdd242e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockContainerInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Block; +import org.emftext.language.java.statements.BlockContainer; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IBlockContainerInitialiser extends ICommentableInitialiser { + @Override + public BlockContainer instantiate(); + + public default boolean setBlock(BlockContainer bc, Block block) { + bc.setBlock(block); + return (block == null && bc.getBlock() == null) || bc.getBlock().equals(block); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockInitialiser.java new file mode 100644 index 0000000000..207c1fdd41 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBlockInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Block; +import org.emftext.language.java.statements.StatementListContainer; + +import cipm.consistency.initialisers.jamopp.members.IMemberInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.IModifiableInitialiser; + +public interface IBlockInitialiser + extends IModifiableInitialiser, IMemberInitialiser, IStatementInitialiser, IStatementListContainerInitialiser { + @Override + public Block instantiate(); + + @Override + public default boolean canContainStatements(StatementListContainer slc) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBreakInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBreakInitialiser.java new file mode 100644 index 0000000000..b72b475730 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IBreakInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Break; + +public interface IBreakInitialiser extends IJumpInitialiser { + @Override + public Break instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ICatchBlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ICatchBlockInitialiser.java new file mode 100644 index 0000000000..98f65532cb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ICatchBlockInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.parameters.OrdinaryParameter; +import org.emftext.language.java.statements.CatchBlock; +import org.emftext.language.java.statements.StatementListContainer; + +public interface ICatchBlockInitialiser extends IBlockContainerInitialiser, IStatementListContainerInitialiser { + + @Override + public CatchBlock instantiate(); + + public default boolean setParameter(CatchBlock cb, OrdinaryParameter param) { + cb.setParameter(param); + return (param == null && cb.getParameter() == null) || cb.getParameter().equals(param); + } + + @Override + public default boolean canContainStatements(StatementListContainer slc) { + return ((CatchBlock) slc).getBlock() != null; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionInitialiser.java new file mode 100644 index 0000000000..ae6a2e1582 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Condition; +import org.emftext.language.java.statements.Statement; + +public interface IConditionInitialiser + extends IConditionalInitialiser, IStatementInitialiser, IStatementContainerInitialiser { + + @Override + public Condition instantiate(); + + public default boolean setElseStatement(Condition cond, Statement elseSt) { + cond.setElseStatement(elseSt); + return (elseSt == null && cond.getElseStatement() == null) || cond.getElseStatement().equals(elseSt); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionalInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionalInitialiser.java new file mode 100644 index 0000000000..8db3161981 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IConditionalInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Conditional; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IConditionalInitialiser extends ICommentableInitialiser { + @Override + public Conditional instantiate(); + + public default boolean setCondition(Conditional cond, Expression condExpr) { + cond.setCondition(condExpr); + return (condExpr == null && cond.getCondition() == null) || cond.getCondition().equals(condExpr); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IContinueInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IContinueInitialiser.java new file mode 100644 index 0000000000..dd81b69440 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IContinueInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Continue; + +public interface IContinueInitialiser extends IJumpInitialiser { + @Override + public Continue instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchCaseInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchCaseInitialiser.java new file mode 100644 index 0000000000..8f07ba5570 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchCaseInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.DefaultSwitchCase; + +public interface IDefaultSwitchCaseInitialiser extends ISwitchCaseInitialiser { + @Override + public DefaultSwitchCase instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchRuleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchRuleInitialiser.java new file mode 100644 index 0000000000..86e44431dc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDefaultSwitchRuleInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.DefaultSwitchRule; + +public interface IDefaultSwitchRuleInitialiser extends ISwitchRuleInitialiser { + @Override + public DefaultSwitchRule instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDoWhileLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDoWhileLoopInitialiser.java new file mode 100644 index 0000000000..caae9d7f27 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IDoWhileLoopInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.DoWhileLoop; + +public interface IDoWhileLoopInitialiser extends IWhileLoopInitialiser { + @Override + public DoWhileLoop instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IEmptyStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IEmptyStatementInitialiser.java new file mode 100644 index 0000000000..fa070eaecb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IEmptyStatementInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.EmptyStatement; + +public interface IEmptyStatementInitialiser extends IStatementInitialiser { + @Override + public EmptyStatement instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IExpressionStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IExpressionStatementInitialiser.java new file mode 100644 index 0000000000..3791acdb73 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IExpressionStatementInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.ExpressionStatement; + +public interface IExpressionStatementInitialiser extends IStatementInitialiser { + @Override + public ExpressionStatement instantiate(); + + public default boolean setExpression(ExpressionStatement es, Expression expr) { + es.setExpression(expr); + return (expr == null && es.getExpression() == null) || es.getExpression().equals(expr); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForEachLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForEachLoopInitialiser.java new file mode 100644 index 0000000000..38e92f8cdc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForEachLoopInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.parameters.OrdinaryParameter; +import org.emftext.language.java.statements.ForEachLoop; + +public interface IForEachLoopInitialiser extends IStatementInitialiser, IStatementContainerInitialiser { + @Override + public ForEachLoop instantiate(); + + public default boolean setCollection(ForEachLoop fel, Expression col) { + fel.setCollection(col); + return (col == null && fel.getCollection() == null) || fel.getCollection().equals(col); + } + + public default boolean setNext(ForEachLoop fel, OrdinaryParameter next) { + fel.setNext(next); + return (next == null && fel.getNext() == null) || fel.getNext().equals(next); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitialiser.java new file mode 100644 index 0000000000..e2dee19392 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitialiser.java @@ -0,0 +1,28 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.ForLoop; +import org.emftext.language.java.statements.ForLoopInitializer; + +public interface IForLoopInitialiser + extends IConditionalInitialiser, IStatementInitialiser, IStatementContainerInitialiser { + @Override + public ForLoop instantiate(); + + public default boolean setInit(ForLoop fl, ForLoopInitializer init) { + fl.setInit(init); + return (init == null && fl.getInit() == null) || fl.getInit().equals(init); + } + + public default boolean addUpdate(ForLoop fl, Expression update) { + if (update != null) { + fl.getUpdates().add(update); + return fl.getUpdates().contains(update); + } + return true; + } + + public default boolean addUpdates(ForLoop fl, Expression[] updates) { + return this.doMultipleModifications(fl, updates, this::addUpdate); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitializerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitializerInitialiser.java new file mode 100644 index 0000000000..2218814fe6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IForLoopInitializerInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.ForLoopInitializer; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IForLoopInitializerInitialiser extends ICommentableInitialiser { + @Override + public ForLoopInitializer instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpInitialiser.java new file mode 100644 index 0000000000..153371d275 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Jump; +import org.emftext.language.java.statements.JumpLabel; + +public interface IJumpInitialiser extends IStatementInitialiser { + @Override + public Jump instantiate(); + + public default boolean setTarget(Jump jump, JumpLabel target) { + jump.setTarget(target); + return (target == null && jump.getTarget() == null) || jump.getTarget().equals(target); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpLabelInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpLabelInitialiser.java new file mode 100644 index 0000000000..dc511cfd1e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IJumpLabelInitialiser.java @@ -0,0 +1,12 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.JumpLabel; + +import cipm.consistency.initialisers.jamopp.commons.INamedElementInitialiser; + +public interface IJumpLabelInitialiser + extends INamedElementInitialiser, IStatementInitialiser, IStatementContainerInitialiser { + @Override + public JumpLabel instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ILocalVariableStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ILocalVariableStatementInitialiser.java new file mode 100644 index 0000000000..a4c09a2c4f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ILocalVariableStatementInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.LocalVariableStatement; +import org.emftext.language.java.variables.LocalVariable; + +public interface ILocalVariableStatementInitialiser extends IStatementInitialiser { + @Override + public LocalVariableStatement instantiate(); + + public default boolean setVariable(LocalVariableStatement lvs, LocalVariable var) { + lvs.setVariable(var); + return (var == null && lvs.getVariable() == null) || lvs.getVariable().equals(var); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchCaseInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchCaseInitialiser.java new file mode 100644 index 0000000000..6a1cf39269 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchCaseInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.NormalSwitchCase; + +public interface INormalSwitchCaseInitialiser extends IConditionalInitialiser, ISwitchCaseInitialiser { + @Override + public NormalSwitchCase instantiate(); + + public default boolean addAdditionalCondition(NormalSwitchCase nsc, Expression additionalCond) { + if (additionalCond != null) { + nsc.getAdditionalConditions().add(additionalCond); + return nsc.getAdditionalConditions().contains(additionalCond); + } + return true; + } + + public default boolean addAdditionalConditions(NormalSwitchCase nsc, Expression[] additionalConds) { + return this.doMultipleModifications(nsc, additionalConds, this::addAdditionalCondition); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchRuleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchRuleInitialiser.java new file mode 100644 index 0000000000..fceb95bc6b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/INormalSwitchRuleInitialiser.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.NormalSwitchRule; + +public interface INormalSwitchRuleInitialiser extends IConditionalInitialiser, ISwitchRuleInitialiser { + @Override + public NormalSwitchRule instantiate(); + + public default boolean addAdditionalCondition(NormalSwitchRule nsr, Expression additionalCond) { + if (additionalCond != null) { + nsr.getAdditionalConditions().add(additionalCond); + return nsr.getAdditionalConditions().contains(additionalCond); + } + return true; + } + + public default boolean addAdditionalConditions(NormalSwitchRule nsr, Expression[] additionalConds) { + return this.doMultipleModifications(nsr, additionalConds, this::addAdditionalCondition); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IReturnInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IReturnInitialiser.java new file mode 100644 index 0000000000..37f860918c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IReturnInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Return; + +public interface IReturnInitialiser extends IStatementInitialiser { + @Override + public Return instantiate(); + + public default boolean setReturnValue(Return ret, Expression retVal) { + ret.setReturnValue(retVal); + return (retVal == null && ret.getReturnValue() == null) || ret.getReturnValue().equals(retVal); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementContainerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementContainerInitialiser.java new file mode 100644 index 0000000000..f48279bbb6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementContainerInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Statement; +import org.emftext.language.java.statements.StatementContainer; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IStatementContainerInitialiser extends ICommentableInitialiser { + @Override + public StatementContainer instantiate(); + + public default boolean setStatement(StatementContainer sc, Statement st) { + sc.setStatement(st); + return (st == null && sc.getStatement() == null) || sc.getStatement().equals(st); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementInitialiser.java new file mode 100644 index 0000000000..d42ae16503 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Statement; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IStatementInitialiser extends ICommentableInitialiser { + @Override + public Statement instantiate(); +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementListContainerInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementListContainerInitialiser.java new file mode 100644 index 0000000000..e0d241ab4e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IStatementListContainerInitialiser.java @@ -0,0 +1,63 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Statement; +import org.emftext.language.java.statements.StatementListContainer; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +/** + * An interface meant to be implemented by initialisers, which are supposed to + * create {@link StatementListContainer} instances.
+ *
+ * Not all implementors of {@link StatementListContainer} allow adding + * statements via {@code .getStatements().add(...)} as expected. Attempting to + * add statements that way can result in exceptions under circumstances. The + * method {@link #canContainStatements(StatementListContainer)} can be used to + * determine, whether this is possible. + * + * @author Alp Torac Genc + */ +public interface IStatementListContainerInitialiser extends ICommentableInitialiser { + @Override + public StatementListContainer instantiate(); + + /** + * Attempts to add the given {@link Statement} st to the given + * {@link StatementListContainer} slc. Uses {@code slc.getStatements().add(st)} + * to do so.
+ *
+ * Note: Attempting to add a null statement will still return true, since there + * is no modification to be performed. + * + * @see {@link IStatementListContainerInitialiser} + * @see {@link #addStatementAssertion(StatementListContainer, Statement)} + */ + public default boolean addStatement(StatementListContainer slc, Statement st) { + if (st != null) { + if (!this.canContainStatements(slc)) { + return false; + } + slc.getStatements().add(st); + return slc.getStatements().contains(st); + } + return true; + } + + /** + * Extracted from {@link #addStatement(StatementListContainer, Statement)} + * because there are some implementors of {@link StatementListContainer}, which + * throw {@link NullPointerException} if {@code slc.getStatements().add(...)} is + * called without proper initialisation. Extracting this method allows such + * implementors to indicate, whether {@link Statement}s can be added to them via + * {@link #addStatement(StatementListContainer, Statement)} without issues. + * + * @return Whether {@link Statement}s can be added to the given + * {@link StatementListContainer} via + * {@link #addStatement(StatementListContainer, Statement)}. + */ + public boolean canContainStatements(StatementListContainer slc); + + public default boolean addStatements(StatementListContainer slc, Statement[] sts) { + return this.doMultipleModifications(slc, sts, this::addStatement); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchCaseInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchCaseInitialiser.java new file mode 100644 index 0000000000..4703854963 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchCaseInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementListContainer; +import org.emftext.language.java.statements.SwitchCase; + +public interface ISwitchCaseInitialiser extends IStatementListContainerInitialiser { + @Override + public SwitchCase instantiate(); + + @Override + public default boolean canContainStatements(StatementListContainer slc) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchInitialiser.java new file mode 100644 index 0000000000..66d349f11f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchInitialiser.java @@ -0,0 +1,29 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Switch; +import org.emftext.language.java.statements.SwitchCase; + +import cipm.consistency.initialisers.jamopp.expressions.IUnaryModificationExpressionChildInitialiser; + +public interface ISwitchInitialiser extends IStatementInitialiser, IUnaryModificationExpressionChildInitialiser { + @Override + public Switch instantiate(); + + public default boolean addCase(Switch sw, SwitchCase swCase) { + if (swCase != null) { + sw.getCases().add(swCase); + return sw.getCases().contains(swCase); + } + return true; + } + + public default boolean addCases(Switch sw, SwitchCase[] swCases) { + return this.doMultipleModifications(sw, swCases, this::addCase); + } + + public default boolean setVariable(Switch sw, Expression var) { + sw.setVariable(var); + return (var == null && sw.getVariable() == null) || sw.getVariable().equals(var); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchRuleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchRuleInitialiser.java new file mode 100644 index 0000000000..63c08ecce6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISwitchRuleInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.SwitchRule; + +public interface ISwitchRuleInitialiser extends ISwitchCaseInitialiser { + @Override + public SwitchRule instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISynchronizedBlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISynchronizedBlockInitialiser.java new file mode 100644 index 0000000000..384587e36c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ISynchronizedBlockInitialiser.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.StatementListContainer; +import org.emftext.language.java.statements.SynchronizedBlock; + +public interface ISynchronizedBlockInitialiser + extends IBlockContainerInitialiser, IStatementInitialiser, IStatementListContainerInitialiser { + @Override + public SynchronizedBlock instantiate(); + + public default boolean setLockProvider(SynchronizedBlock sb, Expression lockProvider) { + sb.setLockProvider(lockProvider); + return (lockProvider == null && sb.getLockProvider() == null) || sb.getLockProvider().equals(lockProvider); + + } + + @Override + public default boolean canContainStatements(StatementListContainer slc) { + return ((SynchronizedBlock) slc).getBlock() != null; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IThrowInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IThrowInitialiser.java new file mode 100644 index 0000000000..9657f4950c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IThrowInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Throw; + +public interface IThrowInitialiser extends IStatementInitialiser { + @Override + public Throw instantiate(); + + public default boolean setThrowable(Throw th, Expression throwable) { + th.setThrowable(throwable); + return (throwable == null && th.getThrowable() == null) || th.getThrowable().equals(throwable); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ITryBlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ITryBlockInitialiser.java new file mode 100644 index 0000000000..e072c15912 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ITryBlockInitialiser.java @@ -0,0 +1,47 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Block; +import org.emftext.language.java.statements.CatchBlock; +import org.emftext.language.java.statements.StatementListContainer; +import org.emftext.language.java.statements.TryBlock; +import org.emftext.language.java.variables.Resource; + +public interface ITryBlockInitialiser + extends IBlockContainerInitialiser, IStatementInitialiser, IStatementListContainerInitialiser { + @Override + public TryBlock instantiate(); + + public default boolean setFinallyBlock(TryBlock tb, Block finallyBlock) { + tb.setFinallyBlock(finallyBlock); + return (finallyBlock == null && tb.getFinallyBlock() == null) || tb.getFinallyBlock().equals(finallyBlock); + } + + public default boolean addCatchBlock(TryBlock tb, CatchBlock cb) { + if (cb != null) { + tb.getCatchBlocks().add(cb); + return tb.getCatchBlocks().contains(cb); + } + return true; + } + + public default boolean addCatchBlocks(TryBlock tb, CatchBlock[] cbs) { + return this.doMultipleModifications(tb, cbs, this::addCatchBlock); + } + + public default boolean addResource(TryBlock tb, Resource res) { + if (res != null) { + tb.getResources().add(res); + return tb.getResources().contains(res); + } + return true; + } + + public default boolean addResources(TryBlock tb, Resource[] ress) { + return this.doMultipleModifications(tb, ress, this::addResource); + } + + @Override + public default boolean canContainStatements(StatementListContainer slc) { + return ((TryBlock) slc).getBlock() != null; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IWhileLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IWhileLoopInitialiser.java new file mode 100644 index 0000000000..a809a2ceed --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IWhileLoopInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.WhileLoop; + +public interface IWhileLoopInitialiser + extends IConditionalInitialiser, IStatementInitialiser, IStatementContainerInitialiser { + @Override + public WhileLoop instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IYieldStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IYieldStatementInitialiser.java new file mode 100644 index 0000000000..ecc8972db9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/IYieldStatementInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.YieldStatement; + +public interface IYieldStatementInitialiser extends IStatementInitialiser { + @Override + public YieldStatement instantiate(); + + public default boolean setYieldExpression(YieldStatement ys, Expression yieldExpr) { + ys.setYieldExpression(yieldExpr); + return (yieldExpr == null && ys.getYieldExpression() == null) || ys.getYieldExpression().equals(yieldExpr); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/JumpLabelInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/JumpLabelInitialiser.java new file mode 100644 index 0000000000..9d6e125b79 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/JumpLabelInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.JumpLabel; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class JumpLabelInitialiser extends AbstractInitialiserBase implements IJumpLabelInitialiser { + @Override + public IJumpLabelInitialiser newInitialiser() { + return new JumpLabelInitialiser(); + } + + @Override + public JumpLabel instantiate() { + return StatementsFactory.eINSTANCE.createJumpLabel(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/LocalVariableStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/LocalVariableStatementInitialiser.java new file mode 100644 index 0000000000..42bdfa0eeb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/LocalVariableStatementInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.LocalVariableStatement; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class LocalVariableStatementInitialiser extends AbstractInitialiserBase + implements ILocalVariableStatementInitialiser { + @Override + public ILocalVariableStatementInitialiser newInitialiser() { + return new LocalVariableStatementInitialiser(); + } + + @Override + public LocalVariableStatement instantiate() { + return StatementsFactory.eINSTANCE.createLocalVariableStatement(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchCaseInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchCaseInitialiser.java new file mode 100644 index 0000000000..676e591ca4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchCaseInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.NormalSwitchCase; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NormalSwitchCaseInitialiser extends AbstractInitialiserBase implements INormalSwitchCaseInitialiser { + @Override + public INormalSwitchCaseInitialiser newInitialiser() { + return new NormalSwitchCaseInitialiser(); + } + + @Override + public NormalSwitchCase instantiate() { + return StatementsFactory.eINSTANCE.createNormalSwitchCase(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchRuleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchRuleInitialiser.java new file mode 100644 index 0000000000..490d73eecc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/NormalSwitchRuleInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.NormalSwitchRule; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NormalSwitchRuleInitialiser extends AbstractInitialiserBase implements INormalSwitchRuleInitialiser { + @Override + public INormalSwitchRuleInitialiser newInitialiser() { + return new NormalSwitchRuleInitialiser(); + } + + @Override + public NormalSwitchRule instantiate() { + return StatementsFactory.eINSTANCE.createNormalSwitchRule(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ReturnInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ReturnInitialiser.java new file mode 100644 index 0000000000..f090c97614 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ReturnInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.Return; +import org.emftext.language.java.statements.StatementsFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ReturnInitialiser extends AbstractInitialiserBase implements IReturnInitialiser { + @Override + public IReturnInitialiser newInitialiser() { + return new ReturnInitialiser(); + } + + @Override + public Return instantiate() { + return StatementsFactory.eINSTANCE.createReturn(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/StatementsInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/StatementsInitialiserPackage.java new file mode 100644 index 0000000000..31064592f1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/StatementsInitialiserPackage.java @@ -0,0 +1,38 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class StatementsInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new AssertInitialiser(), new BlockInitialiser(), + new BreakInitialiser(), new CatchBlockInitialiser(), new ConditionInitialiser(), + new ContinueInitialiser(), new DefaultSwitchCaseInitialiser(), new DefaultSwitchRuleInitialiser(), + new DoWhileLoopInitialiser(), new EmptyStatementInitialiser(), new ExpressionStatementInitialiser(), + new ForEachLoopInitialiser(), new ForLoopInitialiser(), new JumpLabelInitialiser(), + new LocalVariableStatementInitialiser(), new NormalSwitchCaseInitialiser(), + new NormalSwitchRuleInitialiser(), new ReturnInitialiser(), new SwitchInitialiser(), + new SynchronizedBlockInitialiser(), new ThrowInitialiser(), new TryBlockInitialiser(), + new WhileLoopInitialiser(), new YieldStatementInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAssertInitialiser.class, IBlockContainerInitialiser.class, + IBlockInitialiser.class, IBreakInitialiser.class, ICatchBlockInitialiser.class, + IConditionalInitialiser.class, IConditionInitialiser.class, IContinueInitialiser.class, + IDefaultSwitchCaseInitialiser.class, IDefaultSwitchRuleInitialiser.class, IDoWhileLoopInitialiser.class, + IEmptyStatementInitialiser.class, IExpressionStatementInitialiser.class, IForEachLoopInitialiser.class, + IForLoopInitialiser.class, IForLoopInitializerInitialiser.class, IJumpInitialiser.class, + IJumpLabelInitialiser.class, ILocalVariableStatementInitialiser.class, + INormalSwitchCaseInitialiser.class, INormalSwitchRuleInitialiser.class, IReturnInitialiser.class, + IStatementContainerInitialiser.class, IStatementInitialiser.class, + IStatementListContainerInitialiser.class, ISwitchCaseInitialiser.class, ISwitchInitialiser.class, + ISwitchRuleInitialiser.class, ISynchronizedBlockInitialiser.class, IThrowInitialiser.class, + ITryBlockInitialiser.class, IWhileLoopInitialiser.class, IYieldStatementInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SwitchInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SwitchInitialiser.java new file mode 100644 index 0000000000..23900854d3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SwitchInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; +import org.emftext.language.java.statements.Switch; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SwitchInitialiser extends AbstractInitialiserBase implements ISwitchInitialiser { + @Override + public ISwitchInitialiser newInitialiser() { + return new SwitchInitialiser(); + } + + @Override + public Switch instantiate() { + return StatementsFactory.eINSTANCE.createSwitch(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SynchronizedBlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SynchronizedBlockInitialiser.java new file mode 100644 index 0000000000..e69411fe4f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/SynchronizedBlockInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; +import org.emftext.language.java.statements.SynchronizedBlock; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class SynchronizedBlockInitialiser extends AbstractInitialiserBase implements ISynchronizedBlockInitialiser { + @Override + public SynchronizedBlock instantiate() { + return StatementsFactory.eINSTANCE.createSynchronizedBlock(); + } + + @Override + public SynchronizedBlockInitialiser newInitialiser() { + return new SynchronizedBlockInitialiser(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ThrowInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ThrowInitialiser.java new file mode 100644 index 0000000000..6e1f83a558 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/ThrowInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; +import org.emftext.language.java.statements.Throw; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ThrowInitialiser extends AbstractInitialiserBase implements IThrowInitialiser { + @Override + public IThrowInitialiser newInitialiser() { + return new ThrowInitialiser(); + } + + @Override + public Throw instantiate() { + return StatementsFactory.eINSTANCE.createThrow(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/TryBlockInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/TryBlockInitialiser.java new file mode 100644 index 0000000000..bd47c7fefd --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/TryBlockInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; +import org.emftext.language.java.statements.TryBlock; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class TryBlockInitialiser extends AbstractInitialiserBase implements ITryBlockInitialiser { + @Override + public TryBlock instantiate() { + return StatementsFactory.eINSTANCE.createTryBlock(); + } + + @Override + public TryBlockInitialiser newInitialiser() { + return new TryBlockInitialiser(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/WhileLoopInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/WhileLoopInitialiser.java new file mode 100644 index 0000000000..99cb95be48 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/WhileLoopInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; +import org.emftext.language.java.statements.WhileLoop; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class WhileLoopInitialiser extends AbstractInitialiserBase implements IWhileLoopInitialiser { + @Override + public IWhileLoopInitialiser newInitialiser() { + return new WhileLoopInitialiser(); + } + + @Override + public WhileLoop instantiate() { + return StatementsFactory.eINSTANCE.createWhileLoop(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/YieldStatementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/YieldStatementInitialiser.java new file mode 100644 index 0000000000..ee424b5f10 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/YieldStatementInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.statements; + +import org.emftext.language.java.statements.StatementsFactory; +import org.emftext.language.java.statements.YieldStatement; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class YieldStatementInitialiser extends AbstractInitialiserBase implements IYieldStatementInitialiser { + @Override + public IYieldStatementInitialiser newInitialiser() { + return new YieldStatementInitialiser(); + } + + @Override + public YieldStatement instantiate() { + return StatementsFactory.eINSTANCE.createYieldStatement(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/package-info.java new file mode 100644 index 0000000000..b7cc4f581b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/statements/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.statements}. + */ +package cipm.consistency.initialisers.jamopp.statements; \ No newline at end of file From 5c0a46ae38c1bdb6063397b586a1f58a61d578cc Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:39:56 +0200 Subject: [PATCH 26/87] (WIP) Implement initialiser package for org.emftext.language.java.types --- .../jamopp/types/BooleanInitialiser.java | 18 +++ .../jamopp/types/ByteInitialiser.java | 18 +++ .../jamopp/types/CharInitialiser.java | 18 +++ .../types/ClassifierReferenceInitialiser.java | 18 +++ .../jamopp/types/DoubleInitialiser.java | 18 +++ .../jamopp/types/FloatInitialiser.java | 18 +++ .../jamopp/types/IBooleanInitialiser.java | 9 ++ .../jamopp/types/IByteInitialiser.java | 9 ++ .../jamopp/types/ICharInitialiser.java | 9 ++ .../IClassifierReferenceInitialiser.java | 18 +++ .../jamopp/types/IDoubleInitialiser.java | 9 ++ .../jamopp/types/IFloatInitialiser.java | 9 ++ .../types/IInferableTypeInitialiser.java | 14 +++ .../jamopp/types/IIntInitialiser.java | 9 ++ .../jamopp/types/ILongInitialiser.java | 9 ++ ...mespaceClassifierReferenceInitialiser.java | 103 ++++++++++++++++++ .../types/IPrimitiveTypeInitialiser.java | 46 ++++++++ .../jamopp/types/IShortInitialiser.java | 9 ++ .../jamopp/types/ITypeInitialiser.java | 10 ++ .../types/ITypeReferenceInitialiser.java | 76 +++++++++++++ .../ITypedElementExtensionInitialiser.java | 23 ++++ .../types/ITypedElementInitialiser.java | 16 +++ .../jamopp/types/IVoidInitialiser.java | 9 ++ .../types/InferableTypeInitialiser.java | 18 +++ .../jamopp/types/IntInitialiser.java | 18 +++ .../jamopp/types/LongInitialiser.java | 18 +++ ...mespaceClassifierReferenceInitialiser.java | 19 ++++ .../jamopp/types/ShortInitialiser.java | 18 +++ .../jamopp/types/TypesInitialiserPackage.java | 27 +++++ .../jamopp/types/VoidInitialiser.java | 18 +++ .../jamopp/types/package-info.java | 5 + 31 files changed, 636 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/BooleanInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ByteInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/CharInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ClassifierReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/DoubleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/FloatInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IBooleanInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IByteInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ICharInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IClassifierReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IDoubleInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IFloatInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IInferableTypeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IIntInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ILongInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/INamespaceClassifierReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IPrimitiveTypeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IShortInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementExtensionInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IVoidInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/InferableTypeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IntInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/LongInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/NamespaceClassifierReferenceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ShortInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/TypesInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/VoidInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/BooleanInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/BooleanInitialiser.java new file mode 100644 index 0000000000..83a7386521 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/BooleanInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Boolean; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class BooleanInitialiser extends AbstractInitialiserBase implements IBooleanInitialiser { + @Override + public IBooleanInitialiser newInitialiser() { + return new BooleanInitialiser(); + } + + @Override + public Boolean instantiate() { + return TypesFactory.eINSTANCE.createBoolean(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ByteInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ByteInitialiser.java new file mode 100644 index 0000000000..211e79bc08 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ByteInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Byte; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ByteInitialiser extends AbstractInitialiserBase implements IByteInitialiser { + @Override + public IByteInitialiser newInitialiser() { + return new ByteInitialiser(); + } + + @Override + public Byte instantiate() { + return TypesFactory.eINSTANCE.createByte(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/CharInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/CharInitialiser.java new file mode 100644 index 0000000000..2c77c2b86f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/CharInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Char; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class CharInitialiser extends AbstractInitialiserBase implements ICharInitialiser { + @Override + public ICharInitialiser newInitialiser() { + return new CharInitialiser(); + } + + @Override + public Char instantiate() { + return TypesFactory.eINSTANCE.createChar(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ClassifierReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ClassifierReferenceInitialiser.java new file mode 100644 index 0000000000..206be0b1f3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ClassifierReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.ClassifierReference; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ClassifierReferenceInitialiser extends AbstractInitialiserBase implements IClassifierReferenceInitialiser { + @Override + public IClassifierReferenceInitialiser newInitialiser() { + return new ClassifierReferenceInitialiser(); + } + + @Override + public ClassifierReference instantiate() { + return TypesFactory.eINSTANCE.createClassifierReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/DoubleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/DoubleInitialiser.java new file mode 100644 index 0000000000..0a3d473594 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/DoubleInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Double; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class DoubleInitialiser extends AbstractInitialiserBase implements IDoubleInitialiser { + @Override + public IDoubleInitialiser newInitialiser() { + return new DoubleInitialiser(); + } + + @Override + public Double instantiate() { + return TypesFactory.eINSTANCE.createDouble(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/FloatInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/FloatInitialiser.java new file mode 100644 index 0000000000..4604a8c690 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/FloatInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Float; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class FloatInitialiser extends AbstractInitialiserBase implements IFloatInitialiser { + @Override + public IFloatInitialiser newInitialiser() { + return new FloatInitialiser(); + } + + @Override + public Float instantiate() { + return TypesFactory.eINSTANCE.createFloat(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IBooleanInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IBooleanInitialiser.java new file mode 100644 index 0000000000..cd9283a50b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IBooleanInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Boolean; + +public interface IBooleanInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Boolean instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IByteInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IByteInitialiser.java new file mode 100644 index 0000000000..49b6ab9d60 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IByteInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Byte; + +public interface IByteInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Byte instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ICharInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ICharInitialiser.java new file mode 100644 index 0000000000..14ecb2aa30 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ICharInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Char; + +public interface ICharInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Char instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IClassifierReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IClassifierReferenceInitialiser.java new file mode 100644 index 0000000000..2a2045f616 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IClassifierReferenceInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.ClassifierReference; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; +import cipm.consistency.initialisers.jamopp.generics.ITypeArgumentableInitialiser; + +public interface IClassifierReferenceInitialiser + extends ITypeArgumentableInitialiser, IAnnotableInitialiser, ITypeReferenceInitialiser { + @Override + public ClassifierReference instantiate(); + + @Override + public default boolean canSetTarget(TypeReference tref) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IDoubleInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IDoubleInitialiser.java new file mode 100644 index 0000000000..50e651be63 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IDoubleInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Double; + +public interface IDoubleInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Double instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IFloatInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IFloatInitialiser.java new file mode 100644 index 0000000000..9976df7438 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IFloatInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Float; + +public interface IFloatInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Float instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IInferableTypeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IInferableTypeInitialiser.java new file mode 100644 index 0000000000..cf80eaa051 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IInferableTypeInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.InferableType; +import org.emftext.language.java.types.TypeReference; + +public interface IInferableTypeInitialiser extends ITypedElementExtensionInitialiser, ITypeReferenceInitialiser { + @Override + public InferableType instantiate(); + + @Override + public default boolean canSetTarget(TypeReference tref) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IIntInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IIntInitialiser.java new file mode 100644 index 0000000000..6c573d4f45 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IIntInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Int; + +public interface IIntInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Int instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ILongInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ILongInitialiser.java new file mode 100644 index 0000000000..3836ab4ddb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ILongInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Long; + +public interface ILongInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Long instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/INamespaceClassifierReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/INamespaceClassifierReferenceInitialiser.java new file mode 100644 index 0000000000..86fe428c1b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/INamespaceClassifierReferenceInitialiser.java @@ -0,0 +1,103 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.ClassifierReference; +import org.emftext.language.java.types.NamespaceClassifierReference; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; + +public interface INamespaceClassifierReferenceInitialiser + extends INamespaceAwareElementInitialiser, ITypeReferenceInitialiser { + @Override + public NamespaceClassifierReference instantiate(); + + @Override + public default boolean setTargetAssertion(TypeReference tref, Classifier target) { + if (target == null && tref.getTarget() == null) { + return true; + } else if (target == null) { + return false; + } + + var castedTref = (NamespaceClassifierReference) tref; + var containerName = target.getContainingContainerName(); + var nss = castedTref.getNamespaces(); + var clsRefs = castedTref.getClassifierReferences(); + + /* + * Assertions for the implementation at + * https://github.com/DevBoost/JaMoPP/blob/master/Core/org.emftext.language.java + * /src/org/emftext/language/java/extensions/types/TypeReferenceExtension.java + */ + return ITypeReferenceInitialiser.super.setTargetAssertion(tref, target) && nss != null && containerName != null + && nss.size() == containerName.size() && nss.containsAll(containerName) && clsRefs != null + && clsRefs.size() == 1 && clsRefs.stream().anyMatch((cr) -> cr.getTarget().equals(target)); + } + + /** + * {@inheritDoc}
+ *
+ * In the case of {@link NamespaceClassifierReference}, this method: + *
    + *
  • Clears ALL {@link ClassifierReference} instances stored in tref, + *
  • Sets target of tref ({@code tref.getTarget()}) to target, + *
  • Internally constructs and adds a {@link ClassifierReference} pointing at + * target to tref. + *
+ * The overridden version of this method in {@link NamespaceClassifierReference} + * introduces no changes to its super version in + * {@link ITypeReferenceInitialiser}. It is overridden for the sake of providing + * commentary.
+ *
+ * + * @see {@link #canSetTarget(TypeReference)} + * @see {@link #canSetTargetTo(TypeReference, Classifier)} + * @see {@link #setTargetAssertion(TypeReference, Classifier)} + * @see {@link #addClassifierReference(NamespaceClassifierReference, ClassifierReference)} + */ + @Override + public default boolean setTarget(TypeReference tref, Classifier target) { + return ITypeReferenceInitialiser.super.setTarget(tref, target); + } + + /** + * This method: + * + *
    + *
  • Adds the given clsRef to {@code ncr.getClassifierReferences()}, + *
  • Replaces the target of ncr ({@code ncr.getTarget()}) with + * {@code clsRef.getTarget()}. + *
+ * + * Using this method modifies the target attribute of ncr + * ({@code ncr.getTarget()}). Therefore, it should normally NOT be used + * along with {@link #setTarget(TypeReference, Classifier)}, as they will modify + * the said target attribute in conflicting ways.
+ *
+ * + * @see {@link #setTarget(TypeReference, Classifier)} + */ + public default boolean addClassifierReference(NamespaceClassifierReference ncr, ClassifierReference clsRef) { + if (clsRef != null) { + ncr.getClassifierReferences().add(clsRef); + return ncr.getClassifierReferences().contains(clsRef); + } + return true; + } + + @Override + public default boolean canSetTarget(TypeReference tref) { + return true; + } + + @Override + public default boolean canSetTargetTo(TypeReference tref, Classifier target) { + return ITypeReferenceInitialiser.super.canSetTargetTo(tref, target) + && target.getContainingContainerName() != null; + } + + public default boolean addClassifierReferences(NamespaceClassifierReference ncr, ClassifierReference[] clsRefs) { + return this.doMultipleModifications(ncr, clsRefs, this::addClassifierReference); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IPrimitiveTypeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IPrimitiveTypeInitialiser.java new file mode 100644 index 0000000000..e649812315 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IPrimitiveTypeInitialiser.java @@ -0,0 +1,46 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.PrimitiveType; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; + +/** + * An interface meant to be implemented by initialisers, which are supposed to + * instantiate {@link PrimitiveType}.
+ *
+ * The target attribute of primitive types ({@code tref.getTarget()}) are (as + * their name imply) primitives and thus not adjustable. + * + * @author Alp Torac Genc + */ +public interface IPrimitiveTypeInitialiser extends IAnnotableInitialiser, ITypeInitialiser, ITypeReferenceInitialiser { + @Override + public PrimitiveType instantiate(); + + /** + * {@inheritDoc}
+ *
+ * In the case of {@link PrimitiveType}, this method does nothing, since the + * target attribute of primitive types ({@code tref.getTarget()}) are (as their + * name imply) primitives and thus not adjustable.
+ *
+ * This method is overridden to provide commentary, it introduces no changes to + * its super version in {@link ITypeReferenceInitialiser}. + */ + @Override + public default boolean setTarget(TypeReference tref, Classifier target) { + return ITypeReferenceInitialiser.super.setTarget(tref, target); + } + + /** + * {@inheritDoc} + * + * @see {@link IPrimitiveTypeInitialiser} + */ + @Override + public default boolean canSetTarget(TypeReference tref) { + return false; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IShortInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IShortInitialiser.java new file mode 100644 index 0000000000..8cbe7f0650 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IShortInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Short; + +public interface IShortInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Short instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeInitialiser.java new file mode 100644 index 0000000000..84ae8d086f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeInitialiser.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Type; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ITypeInitialiser extends ICommentableInitialiser { + @Override + public Type instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeReferenceInitialiser.java new file mode 100644 index 0000000000..639c10ca38 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypeReferenceInitialiser.java @@ -0,0 +1,76 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.arrays.IArrayTypeableInitialiser; + +/** + * An interface meant to be implemented by initialisers, which are supposed to + * instantiate {@link TypeReference}.
+ *
+ * {@link TypeReference} itself does not have the target attribute, yet its + * implementors do. Its implementors' relations to that attribute vary. + * Therefore, whether the said attribute is modifiable in the individual + * implementors and the acceptable target types differ. Because of this, 2 + * methods {@link #canSetTarget(TypeReference)} and + * {@link #canSetTargetTo(TypeReference, Classifier)} are provided. + * + * @author Alp Torac Genc + */ +public interface ITypeReferenceInitialiser extends IArrayTypeableInitialiser { + @Override + public TypeReference instantiate(); + + /** + * Since {@link TypeReference} itself does not have the "target" attribute and + * its implementors' relations to that attribute vary, this method is + * implemented as a template.
+ *
+ * Therefore, what this method does can change immensely between different + * implementors. Check the concrete implementations within implementors for + * further details.
+ *
+ * Attempting to set null as target will return true, regardless of the concrete + * implementor, since there is no modification to perform. + * + * @see {@link #canSetTarget(TypeReference)} + * @see {@link #canSetTargetTo(TypeReference, Classifier)} + * @see {@link #setTargetAssertion(TypeReference, Classifier)} + */ + public default boolean setTarget(TypeReference tref, Classifier target) { + if (target != null && !this.canSetTargetTo(tref, target)) { + return false; + } + + tref.setTarget(target); + return this.setTargetAssertion(tref, target); + } + + /** + * @return Whether calling {@link #setTarget(TypeReference, Classifier)} with + * the given parameters results in the expected behaviour. + */ + public default boolean setTargetAssertion(TypeReference tref, Classifier target) { + var cTarget = tref.getTarget(); + return (target == null && cTarget == null) || cTarget.equals(target); + } + + /** + * @return Whether {@code tref.setTarget(...)} method can be used to modify + * tref. + */ + public boolean canSetTarget(TypeReference tref); + + /** + * Expects {@link #canSetTarget(TypeReference)} to return true for tref, since + * otherwise its target attribute cannot be changed in the first place. + * + * @return Whether {@code tref.setTarget(target)} method can be used in the + * context of the given target parameter. Returns false if + * {@code target == null}. + */ + public default boolean canSetTargetTo(TypeReference tref, Classifier target) { + return target != null && this.canSetTarget(tref); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementExtensionInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementExtensionInitialiser.java new file mode 100644 index 0000000000..8a698e8f41 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementExtensionInitialiser.java @@ -0,0 +1,23 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.TypeReference; +import org.emftext.language.java.types.TypedElementExtension; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ITypedElementExtensionInitialiser extends ICommentableInitialiser { + @Override + public TypedElementExtension instantiate(); + + public default boolean addActualTarget(TypedElementExtension tee, TypeReference actualTarget) { + if (actualTarget != null) { + tee.getActualTargets().add(actualTarget); + return tee.getActualTargets().contains(actualTarget); + } + return true; + } + + public default boolean addActualTargets(TypedElementExtension tee, TypeReference[] actualTargets) { + return this.doMultipleModifications(tee, actualTargets, this::addActualTarget); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementInitialiser.java new file mode 100644 index 0000000000..df52424487 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ITypedElementInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.TypeReference; +import org.emftext.language.java.types.TypedElement; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface ITypedElementInitialiser extends ICommentableInitialiser { + @Override + public TypedElement instantiate(); + + public default boolean setTypeReference(TypedElement te, TypeReference tRef) { + te.setTypeReference(tRef); + return (tRef == null && te.getTypeReference() == null) || te.getTypeReference().equals(tRef); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IVoidInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IVoidInitialiser.java new file mode 100644 index 0000000000..d5d1f3b3a3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IVoidInitialiser.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Void; + +public interface IVoidInitialiser extends IPrimitiveTypeInitialiser { + @Override + public Void instantiate(); + +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/InferableTypeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/InferableTypeInitialiser.java new file mode 100644 index 0000000000..bbb6a942d8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/InferableTypeInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.InferableType; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class InferableTypeInitialiser extends AbstractInitialiserBase implements IInferableTypeInitialiser { + @Override + public IInferableTypeInitialiser newInitialiser() { + return new InferableTypeInitialiser(); + } + + @Override + public InferableType instantiate() { + return TypesFactory.eINSTANCE.createInferableType(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IntInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IntInitialiser.java new file mode 100644 index 0000000000..129df2ac9b --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/IntInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Int; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class IntInitialiser extends AbstractInitialiserBase implements IIntInitialiser { + @Override + public IIntInitialiser newInitialiser() { + return new IntInitialiser(); + } + + @Override + public Int instantiate() { + return TypesFactory.eINSTANCE.createInt(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/LongInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/LongInitialiser.java new file mode 100644 index 0000000000..1725712870 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/LongInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Long; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class LongInitialiser extends AbstractInitialiserBase implements ILongInitialiser { + @Override + public ILongInitialiser newInitialiser() { + return new LongInitialiser(); + } + + @Override + public Long instantiate() { + return TypesFactory.eINSTANCE.createLong(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/NamespaceClassifierReferenceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/NamespaceClassifierReferenceInitialiser.java new file mode 100644 index 0000000000..0bfacb3583 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/NamespaceClassifierReferenceInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.NamespaceClassifierReference; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class NamespaceClassifierReferenceInitialiser extends AbstractInitialiserBase + implements INamespaceClassifierReferenceInitialiser { + @Override + public INamespaceClassifierReferenceInitialiser newInitialiser() { + return new NamespaceClassifierReferenceInitialiser(); + } + + @Override + public NamespaceClassifierReference instantiate() { + return TypesFactory.eINSTANCE.createNamespaceClassifierReference(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ShortInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ShortInitialiser.java new file mode 100644 index 0000000000..d877da4470 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/ShortInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.Short; +import org.emftext.language.java.types.TypesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class ShortInitialiser extends AbstractInitialiserBase implements IShortInitialiser { + @Override + public IShortInitialiser newInitialiser() { + return new ShortInitialiser(); + } + + @Override + public Short instantiate() { + return TypesFactory.eINSTANCE.createShort(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/TypesInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/TypesInitialiserPackage.java new file mode 100644 index 0000000000..59c5691beb --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/TypesInitialiserPackage.java @@ -0,0 +1,27 @@ +package cipm.consistency.initialisers.jamopp.types; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class TypesInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new BooleanInitialiser(), new ByteInitialiser(), new CharInitialiser(), + new ClassifierReferenceInitialiser(), new DoubleInitialiser(), new FloatInitialiser(), + new InferableTypeInitialiser(), new IntInitialiser(), new LongInitialiser(), + new NamespaceClassifierReferenceInitialiser(), new ShortInitialiser(), new VoidInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IBooleanInitialiser.class, IByteInitialiser.class, ICharInitialiser.class, + IClassifierReferenceInitialiser.class, IDoubleInitialiser.class, IFloatInitialiser.class, + IInferableTypeInitialiser.class, IIntInitialiser.class, ILongInitialiser.class, + INamespaceClassifierReferenceInitialiser.class, IPrimitiveTypeInitialiser.class, + IShortInitialiser.class, ITypedElementExtensionInitialiser.class, ITypedElementInitialiser.class, + ITypeInitialiser.class, ITypeReferenceInitialiser.class, IVoidInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/VoidInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/VoidInitialiser.java new file mode 100644 index 0000000000..fd67f75983 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/VoidInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.types; + +import org.emftext.language.java.types.TypesFactory; +import org.emftext.language.java.types.Void; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class VoidInitialiser extends AbstractInitialiserBase implements IVoidInitialiser { + @Override + public IVoidInitialiser newInitialiser() { + return new VoidInitialiser(); + } + + @Override + public Void instantiate() { + return TypesFactory.eINSTANCE.createVoid(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/package-info.java new file mode 100644 index 0000000000..5ca4bd3583 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/types/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.types}. + */ +package cipm.consistency.initialisers.jamopp.types; \ No newline at end of file From 497971b6564739eed7f7434d96b5794c55e30cce Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:40:15 +0200 Subject: [PATCH 27/87] Implement initialiser package for org.emftext.language.java.variables --- .../AdditionalLocalVariableInitialiser.java | 20 +++++++++++++++ .../IAdditionalLocalVariableInitialiser.java | 13 ++++++++++ .../variables/ILocalVariableInitialiser.java | 25 +++++++++++++++++++ .../variables/IResourceInitialiser.java | 11 ++++++++ .../variables/IVariableInitialiser.java | 22 ++++++++++++++++ .../variables/LocalVariableInitialiser.java | 18 +++++++++++++ .../VariablesInitialiserPackage.java | 21 ++++++++++++++++ .../jamopp/variables/package-info.java | 5 ++++ 8 files changed, 135 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/AdditionalLocalVariableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IAdditionalLocalVariableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/ILocalVariableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IResourceInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IVariableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/LocalVariableInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/VariablesInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/AdditionalLocalVariableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/AdditionalLocalVariableInitialiser.java new file mode 100644 index 0000000000..76a66bf48c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/AdditionalLocalVariableInitialiser.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.jamopp.variables; + +import org.emftext.language.java.variables.VariablesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +import org.emftext.language.java.variables.AdditionalLocalVariable; + +public class AdditionalLocalVariableInitialiser extends AbstractInitialiserBase + implements IAdditionalLocalVariableInitialiser { + @Override + public AdditionalLocalVariable instantiate() { + return VariablesFactory.eINSTANCE.createAdditionalLocalVariable(); + } + + @Override + public IAdditionalLocalVariableInitialiser newInitialiser() { + return new AdditionalLocalVariableInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IAdditionalLocalVariableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IAdditionalLocalVariableInitialiser.java new file mode 100644 index 0000000000..13e776a491 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IAdditionalLocalVariableInitialiser.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.jamopp.variables; + +import org.emftext.language.java.variables.AdditionalLocalVariable; + +import cipm.consistency.initialisers.jamopp.instantiations.IInitializableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IReferenceableElementInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public interface IAdditionalLocalVariableInitialiser + extends IInitializableInitialiser, IReferenceableElementInitialiser, ITypedElementInitialiser { + @Override + public AdditionalLocalVariable instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/ILocalVariableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/ILocalVariableInitialiser.java new file mode 100644 index 0000000000..4120c4cd3e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/ILocalVariableInitialiser.java @@ -0,0 +1,25 @@ +package cipm.consistency.initialisers.jamopp.variables; + +import org.emftext.language.java.variables.AdditionalLocalVariable; +import org.emftext.language.java.variables.LocalVariable; + +import cipm.consistency.initialisers.jamopp.instantiations.IInitializableInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.IAnnotableAndModifiableInitialiser; + +public interface ILocalVariableInitialiser + extends IAnnotableAndModifiableInitialiser, IInitializableInitialiser, IVariableInitialiser { + @Override + public LocalVariable instantiate(); + + public default boolean addAdditionalLocalVariable(LocalVariable lv, AdditionalLocalVariable alv) { + if (alv != null) { + lv.getAdditionalLocalVariables().add(alv); + return lv.getAdditionalLocalVariables().contains(alv); + } + return true; + } + + public default boolean addAdditionalLocalVariables(LocalVariable lv, AdditionalLocalVariable[] alvs) { + return this.doMultipleModifications(lv, alvs, this::addAdditionalLocalVariable); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IResourceInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IResourceInitialiser.java new file mode 100644 index 0000000000..910b7b24f9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IResourceInitialiser.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.jamopp.variables; + +import org.emftext.language.java.variables.Resource; + +import cipm.consistency.initialisers.jamopp.commons.ICommentableInitialiser; + +public interface IResourceInitialiser extends ICommentableInitialiser { + @Override + public Resource instantiate(); + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IVariableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IVariableInitialiser.java new file mode 100644 index 0000000000..6805d0b414 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/IVariableInitialiser.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.jamopp.variables; + +import org.emftext.language.java.variables.Variable; + +import cipm.consistency.initialisers.jamopp.generics.ITypeArgumentableInitialiser; +import cipm.consistency.initialisers.jamopp.references.IReferenceableElementInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +/** + * An interface meant for {@link IInitialiser} implementors that are supposed to + * create {@link Variable} instances.
+ *
+ * Note: "createMethodCall..." methods in {@link Variable} do not modify + * {@link Variable} instances. + * + * @author Alp Torac Genc + */ +public interface IVariableInitialiser + extends IReferenceableElementInitialiser, ITypeArgumentableInitialiser, ITypedElementInitialiser { + @Override + public Variable instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/LocalVariableInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/LocalVariableInitialiser.java new file mode 100644 index 0000000000..e878847187 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/LocalVariableInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.jamopp.variables; + +import org.emftext.language.java.variables.LocalVariable; +import org.emftext.language.java.variables.VariablesFactory; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +public class LocalVariableInitialiser extends AbstractInitialiserBase implements ILocalVariableInitialiser { + @Override + public LocalVariable instantiate() { + return VariablesFactory.eINSTANCE.createLocalVariable(); + } + + @Override + public ILocalVariableInitialiser newInitialiser() { + return new LocalVariableInitialiser(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/VariablesInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/VariablesInitialiserPackage.java new file mode 100644 index 0000000000..0081e1b4d1 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/VariablesInitialiserPackage.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.jamopp.variables; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +public class VariablesInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol( + new IInitialiser[] { new AdditionalLocalVariableInitialiser(), new LocalVariableInitialiser(), }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { IAdditionalLocalVariableInitialiser.class, ILocalVariableInitialiser.class, + IResourceInitialiser.class, IVariableInitialiser.class, }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/package-info.java new file mode 100644 index 0000000000..63280c4546 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/variables/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link IInitialiser} implementations for + * {@link org.emftext.language.java.variables}. + */ +package cipm.consistency.initialisers.jamopp.variables; \ No newline at end of file From 3fe125d5c414961f897cf95ec87d05fbc95bc1ef Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:41:59 +0200 Subject: [PATCH 28/87] Implement initialiser package for all JaMoPP-related initialisers --- .../jamopp/JaMoPPInitialiserPackage.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPInitialiserPackage.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPInitialiserPackage.java new file mode 100644 index 0000000000..13f201a97d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPInitialiserPackage.java @@ -0,0 +1,45 @@ +package cipm.consistency.initialisers.jamopp; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiserPackage; +import cipm.consistency.initialisers.jamopp.annotations.AnnotationsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.arrays.ArraysInitialiserPackage; +import cipm.consistency.initialisers.jamopp.classifiers.ClassifierInitialiserPackage; +import cipm.consistency.initialisers.jamopp.commons.CommonsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.containers.ContainersInitialiserPackage; +import cipm.consistency.initialisers.jamopp.expressions.ExpressionsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.generics.GenericsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.imports.ImportsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.instantiations.InstantiationsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.literals.LiteralsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.members.MembersInitialiserPackage; +import cipm.consistency.initialisers.jamopp.modifiers.ModifiersInitialiserPackage; +import cipm.consistency.initialisers.jamopp.modules.ModulesInitialiserPackage; +import cipm.consistency.initialisers.jamopp.operators.OperatorsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.parameters.ParametersInitialiserPackage; +import cipm.consistency.initialisers.jamopp.references.ReferencesInitialiserPackage; +import cipm.consistency.initialisers.jamopp.statements.StatementsInitialiserPackage; +import cipm.consistency.initialisers.jamopp.types.TypesInitialiserPackage; +import cipm.consistency.initialisers.jamopp.variables.VariablesInitialiserPackage; + +/** + * The topmost implementor of {@link IInitialiserPackage} for EObject + * implementors used by JaMoPP. + * + * @author Alp Torac Genc + */ +public class JaMoPPInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getSubPackages() { + return this.initCol(new IInitialiserPackage[] { new AnnotationsInitialiserPackage(), + new ArraysInitialiserPackage(), new ClassifierInitialiserPackage(), new CommonsInitialiserPackage(), + new ContainersInitialiserPackage(), new ExpressionsInitialiserPackage(), + new GenericsInitialiserPackage(), new ImportsInitialiserPackage(), + new InstantiationsInitialiserPackage(), new LiteralsInitialiserPackage(), + new MembersInitialiserPackage(), new ModifiersInitialiserPackage(), new ModulesInitialiserPackage(), + new OperatorsInitialiserPackage(), new ParametersInitialiserPackage(), + new ReferencesInitialiserPackage(), new StatementsInitialiserPackage(), new TypesInitialiserPackage(), + new VariablesInitialiserPackage() }); + } +} From 850b4e905c7589d208b0bc810729c7553d27b757 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:45:54 +0200 Subject: [PATCH 29/87] Add adaptation strategies for some initialisers These strategies can be used to adapt the initialisers, so that they can successfully initialise the objects they create within tests (to be implemented in another plug-in in the future). --- .../BlockContainerInitialiserAdapter.java | 64 +++++++++++++ .../ClassMethodInitialiserAdapter.java | 84 +++++++++++++++++ .../ConcreteClassifierInitialiserAdapter.java | 63 +++++++++++++ .../MemberInitialiserAdapter.java | 62 +++++++++++++ .../NamedElementInitialiserAdapter.java | 46 ++++++++++ .../NewConstructorCallInitialiserAdapter.java | 90 +++++++++++++++++++ .../jamopp/initadapters/package-info.java | 10 +++ 7 files changed, 419 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/BlockContainerInitialiserAdapter.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ClassMethodInitialiserAdapter.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ConcreteClassifierInitialiserAdapter.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/MemberInitialiserAdapter.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NamedElementInitialiserAdapter.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NewConstructorCallInitialiserAdapter.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/BlockContainerInitialiserAdapter.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/BlockContainerInitialiserAdapter.java new file mode 100644 index 0000000000..238cac8386 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/BlockContainerInitialiserAdapter.java @@ -0,0 +1,64 @@ +package cipm.consistency.initialisers.jamopp.initadapters; + +import org.emftext.language.java.statements.BlockContainer; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.jamopp.statements.IBlockContainerInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IBlockInitialiser; + +/** + * An {@link IInitialiserAdapterStrategy} implementation that can be used with + * {@link IInitialiserBase} implementors that instantiate + * {@link BlockContainer}.
+ *
+ * Adds a {@link Block} to the created {@link BlockContainer}. If the + * {@link BlockContainer} instance already has a {@link Block}, does not modify + * it. This way, similarity checking should not cause exceptions while comparing + * 2 {@link BlockContainer} instances, because of them not having a + * {@link Block}. + * + * @author Alp Torac Genc + */ +public class BlockContainerInitialiserAdapter implements IInitialiserAdapterStrategy { + /** + * The initialiser that creates {@link Block}s to realise the functionality of + * this instance. + */ + private IBlockInitialiser bInit; + + /** + * Constructs an instance with the given {@link IBlockInitialiser}. + */ + public BlockContainerInitialiserAdapter(IBlockInitialiser bInit) { + this.bInit = bInit; + } + + /** + * @return The initialiser contained in this instance, which is responsible for + * creating {@link Block}s. + */ + public IBlockInitialiser getBInit() { + return this.bInit; + } + + @Override + public boolean apply(IInitialiser init, Object obj) { + var castedInit = (IBlockContainerInitialiser) init; + var castedO = (BlockContainer) obj; + + if (castedO.getBlock() == null) { + var bInit = this.getBInit(); + + var block = bInit.instantiate(); + return bInit.initialise(block) && castedInit.setBlock(castedO, block); + } + + return true; + } + + @Override + public IInitialiserAdapterStrategy newStrategy() { + return new BlockContainerInitialiserAdapter((IBlockInitialiser) this.getBInit().newInitialiser()); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ClassMethodInitialiserAdapter.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ClassMethodInitialiserAdapter.java new file mode 100644 index 0000000000..8cfe3f38b0 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ClassMethodInitialiserAdapter.java @@ -0,0 +1,84 @@ +package cipm.consistency.initialisers.jamopp.initadapters; + +import org.emftext.language.java.members.ClassMethod; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.jamopp.members.IClassMethodInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IBlockInitialiser; + +/** + * An {@link IInitialiserAdapterStrategy} implementation that can be used with + * {@link IInitialiserBase} implementors that instantiate {@link ClassMethod}. + *
+ *
+ * Adds a {@link Block} instance to the {@link ClassMethod} via + * {@code classMethod.setStatement(...)}, if its statement accessed via + * {@code classMethod.getStatement()} is not a {@link Block} (in that case + * {@code classMethod.getBlock()} will return null). If the {@link ClassMethod} + * has its {@link Statement} st set, st will be added to the added block + * instance.
+ *
+ * Due to inconsistencies regarding {@link ClassMethod}, it provides 2 methods + * for adding {@link Statement} instances to it. Since adding multiple + * statements is only possible via {@code classMethod.getStatement().add(...)}, + * which only works if classMethod has a block as its statement, this adaptation + * is necessary. Otherwise, one may only add a single statement to + * {@link ClassMethod} via {@code classMethod.setStatement(...)}.
+ *
+ * Note that the said method will REPLACE the former statement when used. + * + * + * @author Alp Torac Genc + * + */ +public class ClassMethodInitialiserAdapter implements IInitialiserAdapterStrategy { + /** + * The initialiser that creates {@link Block}s to realise the functionality of + * this instance. + */ + private IBlockInitialiser bInit; + + /** + * Constructs an instance with the given {@link IBlockInitialiser}. + */ + public ClassMethodInitialiserAdapter(IBlockInitialiser bInit) { + this.bInit = bInit; + } + + /** + * @return The initialiser contained in this instance, which is responsible for + * creating {@link Block}s. + */ + public IBlockInitialiser getBInit() { + return this.bInit; + } + + @Override + public boolean apply(IInitialiser init, Object obj) { + var castedInit = (IClassMethodInitialiser) init; + var castedO = (ClassMethod) obj; + + if (castedO.getBlock() == null) { + var formerSt = castedO.getStatement(); + + var bInit = this.getBInit(); + var block = bInit.instantiate(); + + var res = bInit.initialise(block) && castedInit.setStatement(castedO, block); + + if (formerSt != null) { + res = res && castedInit.addStatement(castedO, formerSt); + } + + return res; + } + + return true; + } + + @Override + public IInitialiserAdapterStrategy newStrategy() { + return new ClassMethodInitialiserAdapter((IBlockInitialiser) this.getBInit().newInitialiser()); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ConcreteClassifierInitialiserAdapter.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ConcreteClassifierInitialiserAdapter.java new file mode 100644 index 0000000000..63c157e3cc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/ConcreteClassifierInitialiserAdapter.java @@ -0,0 +1,63 @@ +package cipm.consistency.initialisers.jamopp.initadapters; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.containers.CompilationUnit; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.jamopp.containers.ICompilationUnitInitialiser; + +/** + * An {@link IInitialiserAdapterStrategy} implementation that can be used with + * {@link IInitialiserBase} implementors that instantiate + * {@link ConcreteClassifier}.
+ *
+ * Adds the {@link ConcreteClassifier} instance to a {@link CompilationUnit}. + * Does not modify the {@link ConcreteClassifier} instance, if it already is + * contained in a {@link CompilationUnit}. This way, similarity checking 2 + * {@link ConcreteClassifier} instances does not throw exceptions, due to them + * not having a container. + * + * @author Alp Torac Genc + */ +public class ConcreteClassifierInitialiserAdapter implements IInitialiserAdapterStrategy { + /** + * The initialiser responsible for creating {@link CompilationUnit}s to fulfil + * this instance's functionality. + */ + private ICompilationUnitInitialiser cuInit; + + /** + * Constructs an instance with the given {@link ICompilationUnitInitialiser}. + */ + public ConcreteClassifierInitialiserAdapter(ICompilationUnitInitialiser cuInit) { + this.cuInit = cuInit; + } + + /** + * @return The initialiser responsible for creating {@link CompilationUnit}s. + */ + public ICompilationUnitInitialiser getCUInit() { + return this.cuInit; + } + + @Override + public boolean apply(IInitialiser init, Object obj) { + var castedO = (ConcreteClassifier) obj; + + if (castedO.getContainingCompilationUnit() == null) { + var cuInit = this.getCUInit(); + + CompilationUnit unit = cuInit.instantiate(); + return cuInit.initialise(unit) && cuInit.addClassifier(unit, castedO); + } + + return true; + } + + @Override + public ConcreteClassifierInitialiserAdapter newStrategy() { + return new ConcreteClassifierInitialiserAdapter( + (ICompilationUnitInitialiser) this.getCUInit().newInitialiser()); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/MemberInitialiserAdapter.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/MemberInitialiserAdapter.java new file mode 100644 index 0000000000..c3a6b9b2ed --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/MemberInitialiserAdapter.java @@ -0,0 +1,62 @@ +package cipm.consistency.initialisers.jamopp.initadapters; + +import org.emftext.language.java.members.Member; +import org.emftext.language.java.members.MemberContainer; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.jamopp.members.IMemberContainerInitialiser; + +/** + * An {@link IInitialiserAdapterStrategy} implementation that can be used with + * {@link IInitialiserBase} implementors that instantiate {@link Member}.
+ *
+ * Adds the created {@link Member} to a {@link MemberContainer}. Does not modify + * the {@link Member} instance, if it is already in a {@link MemberContainer}. + * This way, similarity checking 2 {@link Member} instances does not throw an + * exception, due to them not being contained by a {@link MemberContainer}. + * + * @author Alp Torac Genc + * + */ +public class MemberInitialiserAdapter implements IInitialiserAdapterStrategy { + /** + * The initialiser responsible for creating {@link MemberContainer}s to fulfil + * this instance's functionality. + */ + private IMemberContainerInitialiser mcInit; + + /** + * Constructs an instance with the given {@link IMemberContainerInitialiser}. + */ + public MemberInitialiserAdapter(IMemberContainerInitialiser mcInit) { + this.mcInit = mcInit; + } + + /** + * @return The initialiser in this instance that creates + * {@link MemberContainer}s. + */ + public IMemberContainerInitialiser getMCInit() { + return this.mcInit; + } + + @Override + public boolean apply(IInitialiser init, Object obj) { + var castedO = (Member) obj; + + if (castedO.eContainer() == null) { + var mcInit = this.getMCInit(); + + MemberContainer mc = mcInit.instantiate(); + return mcInit.initialise(mc) && mcInit.addMember(mc, castedO); + } + + return true; + } + + @Override + public MemberInitialiserAdapter newStrategy() { + return new MemberInitialiserAdapter((IMemberContainerInitialiser) this.getMCInit().newInitialiser()); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NamedElementInitialiserAdapter.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NamedElementInitialiserAdapter.java new file mode 100644 index 0000000000..5402f65d99 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NamedElementInitialiserAdapter.java @@ -0,0 +1,46 @@ +package cipm.consistency.initialisers.jamopp.initadapters; + +import org.emftext.language.java.commons.NamedElement; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.jamopp.commons.INamedElementInitialiser; + +/** + * An {@link IInitialiserAdapterStrategy} implementation that can be used with + * {@link IInitialiserBase} implementors that instantiate {@link NamedElement}. + *
+ *
+ * Sets the name of the created {@link NamedElement} to a default name, if it + * has no name. This way, similarity checking 2 {@link NamedElement} instances + * does not throw exceptions, due to them not having a name. + * + * @author Alp Torac Genc + * + */ +public class NamedElementInitialiserAdapter implements IInitialiserAdapterStrategy { + /** + * @return The default name, to which the name of the created + * {@link NamedElement} instances will be set. + */ + public String getDefaultName() { + return ""; + } + + @Override + public boolean apply(IInitialiser init, Object obj) { + var castedInit = (INamedElementInitialiser) init; + var castedO = (NamedElement) obj; + + if (castedInit.canSetName(castedO) && castedO.getName() == null) { + return castedInit.setName(castedO, this.getDefaultName()); + } + + return true; + } + + @Override + public IInitialiserAdapterStrategy newStrategy() { + return new NamedElementInitialiserAdapter(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NewConstructorCallInitialiserAdapter.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NewConstructorCallInitialiserAdapter.java new file mode 100644 index 0000000000..5756df414f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/NewConstructorCallInitialiserAdapter.java @@ -0,0 +1,90 @@ +package cipm.consistency.initialisers.jamopp.initadapters; + +import org.emftext.language.java.instantiations.NewConstructorCall; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.jamopp.classifiers.IClassifierInitialiser; +import cipm.consistency.initialisers.jamopp.instantiations.INewConstructorCallInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypeReferenceInitialiser; + +/** + * An {@link IInitialiserAdapterStrategy} implementation that can be used with + * {@link IInitialiserBase} implementors that instantiate + * {@link NewConstructorCall}.
+ *
+ * Adds a {@link TypeReference} to the created {@link NewConstructorCall} + * ncc. The steps it takes are: + *
    + *
  1. Checks whether ncc has a {@link TypeReference}. If yes, stops. + * Otherwise continues. + *
  2. Creates a {@link Classifier} instance cls + *
  3. Creates a {@link TypeReference} instance tref + *
  4. Sets tref's target to cls + *
  5. Sets ncc's type reference to tref + *
+ * Does not modify the created {@link NewConstructorCall}, if it already has a + * {@link TypeReference}. + * + * @author Alp Torac Genc + * + */ +public class NewConstructorCallInitialiserAdapter implements IInitialiserAdapterStrategy { + + /** + * The initialiser responsible for creating {@link TypeReference} to fulfil this + * instance's functionality. + */ + private ITypeReferenceInitialiser tRefInit; + /** + * The initialiser responsible for creating {@link Classifier} to fulfil this + * instance's functionality. + */ + private IClassifierInitialiser clsInit; + + /** + * Constructs an instance with the given parameters. + */ + public NewConstructorCallInitialiserAdapter(ITypeReferenceInitialiser tRefInit, IClassifierInitialiser clsInit) { + this.tRefInit = tRefInit; + this.clsInit = clsInit; + } + + /** + * @return The initialiser responsible for creating {@link TypeReference}. + */ + public ITypeReferenceInitialiser gettRefInit() { + return tRefInit; + } + + /** + * @return The initialiser responsible for creating {@link Classifier}. + */ + public IClassifierInitialiser getClsInit() { + return clsInit; + } + + @Override + public boolean apply(IInitialiser init, Object obj) { + var castedInit = (INewConstructorCallInitialiser) init; + var castedO = (NewConstructorCall) obj; + + if (castedO.getTypeReference() == null) { + var cls = this.getClsInit().instantiate(); + + var tref = this.gettRefInit().instantiate(); + + return this.getClsInit().initialise(cls) && this.gettRefInit().initialise(tref) + && this.gettRefInit().setTarget(tref, cls) && castedInit.setTypeReference(castedO, tref) + && castedO.getTypeReference().equals(tref); + } + + return true; + } + + @Override + public IInitialiserAdapterStrategy newStrategy() { + return new NewConstructorCallInitialiserAdapter((ITypeReferenceInitialiser) this.gettRefInit().newInitialiser(), + (IClassifierInitialiser) this.getClsInit().newInitialiser()); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/package-info.java new file mode 100644 index 0000000000..a9f4007062 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/package-info.java @@ -0,0 +1,10 @@ +/** + * Contains classes that help adapt initialisers in ways that lets them + * instantiate valid objects without additional method calls. This is + * particularly useful for parameterized tests, as there may be initialisers + * extending mutual interfaces/classes, which may need to perform additional + * modifications of the objects they instantiate. If this is the case, such + * initialisers can be adapted to automatically perform those modifications, + * without large if or instanceof blocks in tests. + */ +package cipm.consistency.initialisers.jamopp.initadapters; \ No newline at end of file From 79533d862c571c6053b090561cdfeb716022b1fe Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:46:45 +0200 Subject: [PATCH 30/87] Add package commentary --- .../cipm/consistency/initialisers/jamopp/package-info.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/package-info.java new file mode 100644 index 0000000000..d1ece94497 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/package-info.java @@ -0,0 +1,7 @@ +/** + * Contains {@link IInitialiser} implementations for Java-related + * {@link EObject} implementors used by JaMoPP. Sub-packages contain concrete + * implementations and interfaces of concrete initialisers for their + * corresponding {@link EObject} implementor. + */ +package cipm.consistency.initialisers.jamopp; \ No newline at end of file From 2f8a7e7a018b239ccf10750fec5d7792cab0271b Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 17:50:08 +0200 Subject: [PATCH 31/87] Add an interface for utility tests Implemented to extract some mutual method implementations. Provides default methods that can be used by tests, which check whether necessary initialisers are present and can be accessed. --- .../initialisers/IInitialiserUtilityTest.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java new file mode 100644 index 0000000000..49f972ef63 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java @@ -0,0 +1,107 @@ +package cipm.consistency.initialisers; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; + +/** + * An interface that contains various methods that can be used in utility tests, + * which ensure that all initialisers and/or tests associated with them are + * present. Not implemented as an abstract class, since utility tests are likely + * to have to inherit from an abstract test class anyway. + * + * @author Alp Torac Genc + */ +public interface IInitialiserUtilityTest { + + /** + * @return A list of all files under the root directory. + */ + public Collection getAllFiles(); + + /** + * @return The {@link IInitialiserPackage} that will be used within the utility + * test. + */ + public IInitialiserPackage getUsedInitialiserPackage(); + + /** + * @return A list of all files under the given path and its sub-directories. + */ + public default Collection getAllFiles(File currentPath) { + var result = new ArrayList(); + + if (currentPath.isFile()) { + result.add(currentPath); + } else { + var files = currentPath.listFiles(); + if (files != null) { + for (var f : files) { + result.addAll(this.getAllFiles(f)); + } + } + } + + return result; + } + + /** + * @return Whether the given file's name (without extension) is equal to the + * given fileName. + */ + public default boolean fileNameEquals(File file, String fileName) { + return file != null && file.getName().split("\\.")[0].equals(fileName); + } + + /** + * @return A String representing the given stream. The provided toStringFunc + * will be used to transform stream elements into Strings. + */ + public default String streamToString(Stream stream, Function toStringFunc) { + return stream.map((e) -> toStringFunc.apply(e)).reduce("", (s1, s2) -> s1 + ", " + s2).substring(2); + } + + /** + * Opens a stream on the given list and delegates to + * {@link #clsStreamToString(Stream)}. + */ + public default String clsListToString(List> list) { + return this.clsStreamToString(list.stream()); + } + + /** + * A variant of {@link #streamToString(Stream, Function)} for Class streams. + * + * Maps stream elements (classes) to String by returning their simple name. + */ + public default String clsStreamToString(Stream> list) { + return this.streamToString(list, (cls) -> cls.getSimpleName()); + } + + /** + * @return An instance of all initialisers accessible from + * {@link #getUsedInitialiserPackage()}. + */ + public default Collection getAllInitialiserInstances() { + return this.getUsedInitialiserPackage().getAllInitialiserInstances(); + } + + /** + * @return Types of all initialisers accessible from + * {@link #getUsedInitialiserPackage()}. + */ + public default Collection> getAllInitialiserInterfaceTypes() { + return this.getUsedInitialiserPackage().getAllInitialiserInterfaceTypes(); + } + + /** + * @return The type of the initialiser meant to instantiate objClass, which is + * accessible from {@link #getUsedInitialiserPackage()}.. + */ + public default Class getInitialiserInterfaceFor(Class objClass) { + return this.getUsedInitialiserPackage().getInitialiserInterfaceTypeFor(objClass); + } +} \ No newline at end of file From af40e6781e810796c478c6e70c8d0ce600c2477e Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:02:49 +0200 Subject: [PATCH 32/87] Add a utility class Contains information about the naming convention used while naming initialisers --- .../eobject/InitialiserNameHelper.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/InitialiserNameHelper.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/InitialiserNameHelper.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/InitialiserNameHelper.java new file mode 100644 index 0000000000..4f211dbc8f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/InitialiserNameHelper.java @@ -0,0 +1,41 @@ +package cipm.consistency.initialisers.eobject; + +/** + * A utility class that contains information about the naming convention used + * within the sub-packages of this package.
+ *
+ * This class is intended to be used from tests, which ensure that all necessary + * initialisers are implemented and are accessible. + * + * @author Alp Torac Genc + */ +public class InitialiserNameHelper { + + /** + * @return The name of the concrete initialiser corresponding to cls. + */ + public String getConcreteInitialiserName(Class cls) { + return cls.getSimpleName() + this.getInitialiserSuffix(); + } + + /** + * @return The name of the initialiser interface corresponding to cls. + */ + public String getInitialiserInterfaceName(Class cls) { + return getInitialiserInterfacePrefix() + cls.getSimpleName() + this.getInitialiserSuffix(); + } + + /** + * The prefix used in initialiser interfaces. + */ + public String getInitialiserInterfacePrefix() { + return "I"; + } + + /** + * The suffix used in initialisers. + */ + public String getInitialiserSuffix() { + return "Initialiser"; + } +} From ad2936a6fd62ca6a50e8640afdd316e39f6a24ff Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:04:01 +0200 Subject: [PATCH 33/87] Add an interface for utility tests that focus on EObject --- .../eobject/IEObjectUtilityTest.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectUtilityTest.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectUtilityTest.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectUtilityTest.java new file mode 100644 index 0000000000..0d92727943 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectUtilityTest.java @@ -0,0 +1,33 @@ +package cipm.consistency.initialisers.eobject; + +import cipm.consistency.initialisers.IInitialiserUtilityTest; + +/** + * An interface that extends {@link IInitialiserUtilityTest} with further + * utility methods, focusing on EObject. + * + * @author Alp Torac Genc + */ +public interface IEObjectUtilityTest extends IInitialiserUtilityTest { + /** + * @return The {@link InitialiserNameHelper} instance that will be used in the + * other methods. + */ + public default InitialiserNameHelper getInitialiserNameHelper() { + return new InitialiserNameHelper(); + } + + /** + * {@link InitialiserNameHelper#getInitialiserInterfaceName(Class)} + */ + public default String getInitialiserInterfaceName(Class cls) { + return this.getInitialiserNameHelper().getInitialiserInterfaceName(cls); + } + + /** + * {@link InitialiserNameHelper#getConcreteInitialiserName(Class)} + */ + public default String getConcreteInitialiserName(Class ifc) { + return this.getInitialiserNameHelper().getConcreteInitialiserName(ifc); + } +} \ No newline at end of file From b10cab2fefb750ef9326fe09223d4ddb12969f1e Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:07:47 +0200 Subject: [PATCH 34/87] Add a utility class Contains some information about the naming convention used in JaMoPP Provides methods to access EObject implementations of Java-related elements in JaMoPP. Includes methods that can be used to retrieve initialisers corresponding to those JaMoPP-elements by using the name of the objects they are supposed to create. --- .../initialisers/jamopp/JaMoPPHelper.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java new file mode 100644 index 0000000000..b13a715e8a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java @@ -0,0 +1,132 @@ +package cipm.consistency.initialisers.jamopp; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EPackage; +import org.emftext.language.java.JavaPackage; +import org.emftext.language.java.commons.Commentable; + +/** + * A utility class that provides information about EObjects used by JaMoPP, as + * well as methods to access their types. There are further methods, which map + * their types to the initialisers implemented in sub-packages.
+ *
+ * This class is intended to be used in tests, which ensure that all necessary + * initialisers are implemented and can be accessed. + * + * @author Alp Torac Genc + */ +public class JaMoPPHelper { + + /** + * The suffix used in the concrete implementation of EObject classes in JaMoPP. + */ + public String getImplSuffix() { + return "Impl"; + } + + /** + * @return Types of concrete implementations and interfaces of all Java-Model + * elements. + */ + public Set> getAllPossibleTypes() { + return this.getAllPossibleTypes(JavaPackage.eINSTANCE.getESubpackages()); + } + + /** + * Recursively discovers sub-packages of cPac (including cPac) for + * {@link EClassifier}s contained within, aggregates the types represented by + * the EClassifiers as a Set and returns the Set. + * + * @param cPac The package, which is the start point of the discovery. + * @return All types represented by EClassifiers contained in cPac and its + * sub-packages. Includes types of interfaces as well as concrete + * implementation classes. + */ + public Set> getAllPossibleTypes(EPackage cPac) { + var clss = cPac.getEClassifiers(); + var subPacs = cPac.getESubpackages(); + + var foundClss = new HashSet>(); + + if (clss != null) { + for (var cls : clss) { + foundClss.add(cls.getInstanceClass()); + + /* + * Although cls is technically of type EClassifier, it also implements EClass + */ + if (cls instanceof EClass) { + var castedCls = (EClass) cls; + + /* + * Add the concrete implementation class, if cls represents a concrete class + */ + if (!castedCls.isAbstract()) { + foundClss.add(cPac.getEFactoryInstance().create(castedCls).getClass()); + } + } + } + } + + if (subPacs != null) { + foundClss.addAll(this.getAllPossibleTypes(subPacs)); + } + + return foundClss; + } + + /** + * @return All types represented by {@link EClassifiers} contained in pacs and + * their sub-packages. Includes types of interfaces as well as concrete + * implementation classes. + * @see {@link #getAllPossibleTypes(EPackage)}} + */ + public Set> getAllPossibleTypes(Collection pacs) { + var foundClss = new HashSet>(); + + for (var pac : pacs) { + foundClss.addAll(this.getAllPossibleTypes(pac)); + } + + return foundClss; + } + + /** + * Used to determine which EObject implementors should have an initialiser.
+ *
+ * Here, such implementors (initialiser candidates) implement + * {@link Commentable} and their names do not end with {@link #implSuffix}. + * + * @return The classes from {@link #getAllPossibleTypes()}, which should have a + * corresponding initialiser interface. + */ + public Collection> getAllInitialiserCandidates() { + var fullHierarchy = getAllPossibleTypes(); + + var intfcs = fullHierarchy.stream().filter((c) -> Commentable.class.isAssignableFrom(c)) + .filter((c) -> !c.getSimpleName().endsWith(this.getImplSuffix())).toArray(Class[]::new); + + return List.of(intfcs); + } + + /** + * @return The EObject types from {@link #getAllPossibleTypes()}, which should + * have a corresponding concrete initialiser that can instantiate the + * said type. + */ + public Collection> getAllConcreteInitialiserCandidates() { + var fullHierarchy = getAllPossibleTypes(); + + var intfcs = fullHierarchy.stream().filter((c) -> Commentable.class.isAssignableFrom(c)) + .filter((c) -> fullHierarchy.stream() + .anyMatch((c2) -> c2.getSimpleName().equals(c.getSimpleName() + this.getImplSuffix()))) + .toArray(Class[]::new); + + return List.of(intfcs); + } +} From 780d1bdeea7ef304a25b59f5a92250a745fe5292 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:08:20 +0200 Subject: [PATCH 35/87] Add an interface for utility tests that focus on JaMoPP --- .../jamopp/IJaMoPPUtilityTest.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java new file mode 100644 index 0000000000..534bdcc371 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java @@ -0,0 +1,42 @@ +package cipm.consistency.initialisers.jamopp; + +import java.util.Collection; +import java.util.Set; + +import cipm.consistency.initialisers.eobject.IEObjectUtilityTest; + +/** + * An interface that extends {@link IEObjectUtilityTest} with further utility + * methods, focusing on EObject types used within JaMoPP. + * + * @author Alp Torac Genc + */ +public interface IJaMoPPUtilityTest extends IEObjectUtilityTest { + /** + * @return The {@link JaMoPPHelper} instance that will be used in other methods. + */ + public default JaMoPPHelper getJaMoPPHelper() { + return new JaMoPPHelper(); + } + + /** + * {@link JaMoPPHelper#getAllPossibleTypes()} + */ + public default Set> getAllPossibleJaMoPPEObjectTypes() { + return this.getJaMoPPHelper().getAllPossibleTypes(); + } + + /** + * {@link JaMoPPHelper#getAllInitialiserCandidates()} + */ + public default Collection> getAllInitialiserCandidates() { + return this.getJaMoPPHelper().getAllInitialiserCandidates(); + } + + /** + * {@link JaMoPPHelper#getAllConcreteInitialiserCandidates()} + */ + public default Collection> getAllConcreteInitialiserCandidates() { + return this.getJaMoPPHelper().getAllConcreteInitialiserCandidates(); + } +} From 86c73d0350f58accefd130d86976aaf4e5f73957 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:12:32 +0200 Subject: [PATCH 36/87] Add utility tests These tests can be run to ensure that there are initialisers for each Java-related element in JaMoPP. Note: Relative paths are used within tests to access initialiser files. Therefore, if the position of cipm.consistency.initialisers.jamopp.utiltests changes relatively to the initialiser files, the said path will have to be changed for tests to work. --- .../jamopp/utiltests/UtilityTests.java | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java new file mode 100644 index 0000000000..2b0de86add --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java @@ -0,0 +1,178 @@ +package cipm.consistency.initialisers.jamopp.utiltests; + +import java.io.File; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.List; + +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import cipm.consistency.initialisers.IInitialiserPackage; +import cipm.consistency.initialisers.jamopp.IJaMoPPUtilityTest; +import cipm.consistency.initialisers.jamopp.JaMoPPInitialiserPackage; + +/** + * A test class, whose tests can be used to make sure no initialiser interfaces + * or concrete initialisers are missing. + * + * @author Alp Torac Genc + */ +public class UtilityTests implements IJaMoPPUtilityTest { + private static final Logger LOGGER = Logger.getLogger(UtilityTests.class); + /** + * Points at the parent package. Used by discovering methods in this class. + */ + private static final File root = new File(Paths + .get(new File("").toPath().toString(), "src", UtilityTests.class.getPackageName() + .substring(0, UtilityTests.class.getPackageName().lastIndexOf(".")).replace(".", File.separator)) + .toAbsolutePath().toUri()); + + @BeforeEach + public void setUp() { + Logger logger = this.getLogger(); + logger.setLevel(Level.ALL); + + logger = Logger.getRootLogger(); + logger.removeAllAppenders(); + ConsoleAppender ap = new ConsoleAppender(new PatternLayout("[%d{DATE}] %-5p: %c - %m%n"), + ConsoleAppender.SYSTEM_OUT); + logger.addAppender(ap); + } + + public Logger getLogger() { + return LOGGER; + } + + @Override + public IInitialiserPackage getUsedInitialiserPackage() { + return new JaMoPPInitialiserPackage(); + } + + @Override + public Collection getAllFiles() { + return this.getAllFiles(root); + } + + /** + * Prints all interface types from {@link #getAllPossibleJaMoPPEObjectTypes()}. + *
+ *
+ * Does not test anything, just prints the said types. + */ + @Test + public void printFullHierarchy() { + var hSet = this.getAllPossibleJaMoPPEObjectTypes(); + this.getLogger().info(this.clsStreamToString(hSet.stream())); + } + + /** + * Checks if all necessary concrete initialisers can be accessed under the used + * initialiser package, which is used in initialiser tests.
+ *
+ * Prints the amount of accessible/registered initialiser types. The missing + * types can be found in the assertion message. + */ + @Test + public void testAllConcreteInitialisersRegistered() { + var clss = this.getAllConcreteInitialiserCandidates(); + var registeredInits = this.getAllInitialiserInstances(); + + var matches = List.of( + clss.stream().filter((cls) -> registeredInits.stream().anyMatch((init) -> init.isInitialiserFor(cls))) + .toArray(Class[]::new)); + + this.getLogger().info(matches.size() + " out of " + clss.size() + " concrete initialisers are registered"); + + if (matches.size() != clss.size()) { + Assertions.fail("Concrete initialisers not registered: " + + this.clsStreamToString(clss.stream().filter((cls) -> !matches.contains(cls)))); + } + } + + /** + * Checks if all necessary initialiser interface types can be accessed under the + * used initialiser package, which is used in initialiser tests.
+ *
+ * Prints the amount of accessible/registered initialiser interface types. The + * missing types can be found in the assertion message. + */ + @Test + public void testAllInitialiserInterfacesRegistered() { + var clss = this.getAllInitialiserCandidates(); + var registeredInits = this.getAllInitialiserInterfaceTypes(); + + var matches = List.of(clss.stream() + .filter((cls) -> registeredInits.stream() + .anyMatch((init) -> this.getInitialiserInterfaceName(cls).equals(init.getSimpleName()))) + .toArray(Class[]::new)); + + this.getLogger().info(matches.size() + " out of " + clss.size() + " initialiser interfaces are registered"); + + if (matches.size() != clss.size()) { + Assertions.fail("Initialiser interfaces not registered: " + + this.clsStreamToString(clss.stream().filter((cls) -> !matches.contains(cls)))); + } + } + + /** + * Checks if all concrete initialisers (SomethingInitialiser.java) files are + * implemented and present under {@link #root}.
+ *
+ * Prints the number of present concrete initialiser files. Information on the + * missing files can be found in the assertion message.
+ *
+ * Only checks whether the said files are present, does not inspect their + * content at all. + */ + @Test + public void testAllConcreteInitialisersPresent() { + var intfcs = this.getAllConcreteInitialiserCandidates(); + var files = this.getAllFiles(); + + var matches = List.of(intfcs.stream().filter( + (ifc) -> files.stream().anyMatch((f) -> this.fileNameEquals(f, this.getConcreteInitialiserName(ifc)))) + .toArray(Class[]::new)); + var count = matches.size(); + + this.getLogger().info(count + " out of " + intfcs.size() + " concrete initialiser files are present"); + + if (count != intfcs.size()) { + Assertions.fail("Concrete initialiser files missing for: " + + this.clsStreamToString(intfcs.stream().filter((ifc) -> !matches.contains(ifc)))); + } + } + + /** + * Checks if all interface initialisers (ISomethingInitialiser.java) files are + * implemented and present under {@link #root}.
+ *
+ * Prints the number of present initialiser files. Information on the missing + * files can be found in the assertion message.
+ *
+ * Only checks whether the said files are present, does not inspect their + * content at all. + */ + @Test + public void testAllInitialiserInterfacesPresent() { + var intfcs = this.getAllInitialiserCandidates(); + var files = this.getAllFiles(); + + var matches = List.of(intfcs.stream().filter( + (ifc) -> files.stream().anyMatch((f) -> this.fileNameEquals(f, this.getInitialiserInterfaceName(ifc)))) + .toArray(Class[]::new)); + var count = matches.size(); + + this.getLogger().info(count + " out of " + intfcs.size() + " initialiser files are present"); + + if (count != intfcs.size()) { + Assertions.fail("Initialiser files missing for: " + + this.clsStreamToString(intfcs.stream().filter((ifc) -> !matches.contains(ifc)))); + } + } +} From 7415df32ca130ab6f48e01791141b8d092a631db Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:12:48 +0200 Subject: [PATCH 37/87] Add package commentary --- .../initialisers/jamopp/utiltests/package-info.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/package-info.java new file mode 100644 index 0000000000..14b60e3558 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains tests that check whether {@link IInitialiser}s are setup properly, + * i.e. if their source files are present and they can be accessed. + */ +package cipm.consistency.initialisers.jamopp.utiltests; \ No newline at end of file From 829f03214a3f6f19c8f690682d609b0cf5912c53 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:15:11 +0200 Subject: [PATCH 38/87] Implement dummy constructs for future tests Those tests will aim to ensure that initialiser discovery by using initialiser packages works as intended. They will furthermore check, whether initialiser adaptation works as expected. --- .../AbstractDummyAdaptationStrategy.java | 45 +++++++++++++++ .../DummyAggregateInitialiserPackageOne.java | 33 +++++++++++ .../DummyAggregateInitialiserPackageTwo.java | 20 +++++++ .../dummy/packages/DummyInitialiserA.java | 22 ++++++++ .../dummy/packages/DummyInitialiserB.java | 32 +++++++++++ .../dummy/packages/DummyInitialiserC.java | 38 +++++++++++++ .../dummy/packages/DummyInitialiserD.java | 32 +++++++++++ .../dummy/packages/DummyInitialiserE.java | 32 +++++++++++ .../packages/DummyInitialiserPackageA.java | 27 +++++++++ .../packages/DummyInitialiserPackageB.java | 27 +++++++++ .../packages/DummyInitialiserPackageCD.java | 27 +++++++++ .../tests/dummy/packages/DummyObjA.java | 30 ++++++++++ .../tests/dummy/packages/DummyObjB.java | 10 ++++ .../tests/dummy/packages/DummyObjC.java | 50 +++++++++++++++++ .../tests/dummy/packages/DummyObjD.java | 10 ++++ .../tests/dummy/packages/DummyObjE.java | 10 ++++ .../DummyTopLevelInitialiserPackage.java | 21 +++++++ .../tests/dummy/packages/ObjAInitStrat.java | 53 ++++++++++++++++++ .../packages/ObjCFirstInitStepStrat.java | 55 +++++++++++++++++++ .../packages/ObjCSecondInitStepStrat.java | 55 +++++++++++++++++++ .../tests/dummy/packages/package-info.java | 36 ++++++++++++ 21 files changed, 665 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/AbstractDummyAdaptationStrategy.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageOne.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageTwo.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserA.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserB.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserC.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserD.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserE.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageA.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageB.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageCD.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjA.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjB.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjC.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjD.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjE.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyTopLevelInitialiserPackage.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjAInitStrat.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCFirstInitStepStrat.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCSecondInitStepStrat.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/AbstractDummyAdaptationStrategy.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/AbstractDummyAdaptationStrategy.java new file mode 100644 index 0000000000..6c4dc90bbf --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/AbstractDummyAdaptationStrategy.java @@ -0,0 +1,45 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; + +/** + * An abstract class for simple dummy implementations of + * {@link IInitialiserAdapterStrategy} that are used in tests. + * + * @author Alp Torac Genc + */ +public abstract class AbstractDummyAdaptationStrategy implements IInitialiserAdapterStrategy { + /** + * @see {@link #doesInitialiseSuccessfully()} + */ + private boolean initSuccessfully; + + /** + * A variant of {@link #AbstractDummyAdaptationStrategy(boolean)} with "true" as + * boolean parameter. + */ + public AbstractDummyAdaptationStrategy() { + this(true); + } + + /** + * Constructs an instance with the given parameter that determines the success + * of the adaptation strategy. + * + * @param initSuccessfully Whether + * {@link #apply(cipm.consistency.initialisers.IInitialiser, Object)} + * performs the initialisation as expected. + */ + public AbstractDummyAdaptationStrategy(boolean initSuccessfully) { + this.initSuccessfully = initSuccessfully; + } + + /** + * @return Whether + * {@link #apply(cipm.consistency.initialisers.IInitialiser, Object)} + * performs the initialisation as expected. + */ + public boolean doesInitialiseSuccessfully() { + return this.initSuccessfully; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageOne.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageOne.java new file mode 100644 index 0000000000..2781dd0714 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageOne.java @@ -0,0 +1,33 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * An {@link IInitialiserPackage} implementation, which simulates a package + * containing 1 initialiser implementation and 2 further sub-packages. + * + * @author Alp Torac Genc + * @see {@link cipm.consistency.initialisers.tests.dummy.packages} for the + * package layout. + */ +public class DummyAggregateInitialiserPackageOne implements IInitialiserPackage { + @Override + public Collection getSubPackages() { + return this + .initCol(new IInitialiserPackage[] { new DummyInitialiserPackageA(), new DummyInitialiserPackageB() }); + } + + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new DummyInitialiserE() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { DummyInitialiserE.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageTwo.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageTwo.java new file mode 100644 index 0000000000..ac485de879 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyAggregateInitialiserPackageTwo.java @@ -0,0 +1,20 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * An {@link IInitialiserPackage} implementation, which simulates a package + * containing 1 further sub-package and no initialiser implementations. + * + * @author Alp Torac Genc + * @see {@link cipm.consistency.initialisers.tests.dummy.packages} for the + * package layout. + */ +public class DummyAggregateInitialiserPackageTwo implements IInitialiserPackage { + @Override + public Collection getSubPackages() { + return this.initCol(new IInitialiserPackage[] { new DummyInitialiserPackageCD() }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserA.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserA.java new file mode 100644 index 0000000000..6fffd11731 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserA.java @@ -0,0 +1,22 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.AbstractInitialiserBase; + +/** + * A dummy initialiser for {@link DummyObjA}. + * + * @author Alp Torac Genc + * @see {@link ObjAInitStrat} + */ +public class DummyInitialiserA extends AbstractInitialiserBase { + + @Override + public DummyInitialiserA newInitialiser() { + return new DummyInitialiserA(); + } + + @Override + public DummyObjA instantiate() { + return new DummyObjA(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserB.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserB.java new file mode 100644 index 0000000000..b93bc8dadc --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserB.java @@ -0,0 +1,32 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy initialiser for {@link DummyObjB}, whose {@link #initialise(Object)} + * method always returns true. + * + * @author Alp Torac Genc + */ +public class DummyInitialiserB implements IInitialiser { + + @Override + public DummyInitialiserB newInitialiser() { + return new DummyInitialiserB(); + } + + @Override + public DummyObjB instantiate() { + return new DummyObjB(); + } + + /** + * {@inheritDoc}
+ *
+ * For this implementor, does nothing and returns true. + */ + @Override + public boolean initialise(Object obj) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserC.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserC.java new file mode 100644 index 0000000000..be3e1c8526 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserC.java @@ -0,0 +1,38 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.AbstractInitialiserBase; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; + +/** + * A dummy initialiser for {@link DummyObjC}. + * + * @author Alp Torac Genc + * @see {@link ObjCFirstInitStepStrat} + * @see {@link ObjCSecondInitStepStrat} + */ +public class DummyInitialiserC extends AbstractInitialiserBase { + + /** + * @see {@link AbstractInitialiserBase#AbstractInitialiserBase()} + */ + public DummyInitialiserC() { + super(); + } + + /** + * @see {@link AbstractInitialiserBase#AbstractInitialiserBase(IInitialiserAdapterStrategy[])} + */ + public DummyInitialiserC(IInitialiserAdapterStrategy[] adaptingInits) { + super(adaptingInits); + } + + @Override + public DummyInitialiserC newInitialiser() { + return new DummyInitialiserC(); + } + + @Override + public DummyObjC instantiate() { + return new DummyObjC(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserD.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserD.java new file mode 100644 index 0000000000..17535bdde9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserD.java @@ -0,0 +1,32 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy initialiser for {@link DummyObjD}, whose {@link #initialise(Object)} + * method always returns true. + * + * @author Alp Torac Genc + */ +public class DummyInitialiserD implements IInitialiser { + + @Override + public DummyInitialiserD newInitialiser() { + return new DummyInitialiserD(); + } + + @Override + public DummyObjD instantiate() { + return new DummyObjD(); + } + + /** + * {@inheritDoc}
+ *
+ * For this implementor, does nothing and returns true. + */ + @Override + public boolean initialise(Object obj) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserE.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserE.java new file mode 100644 index 0000000000..0707e0ee60 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserE.java @@ -0,0 +1,32 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy initialiser for {@link DummyObjE}, whose {@link #initialise(Object)} + * method always returns false. + * + * @author Alp Torac Genc + */ +public class DummyInitialiserE implements IInitialiser { + + @Override + public DummyInitialiserE newInitialiser() { + return new DummyInitialiserE(); + } + + @Override + public DummyObjE instantiate() { + return new DummyObjE(); + } + + /** + * {@inheritDoc}
+ *
+ * For this implementor, does nothing and returns false. + */ + @Override + public boolean initialise(Object obj) { + return false; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageA.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageA.java new file mode 100644 index 0000000000..a530191a23 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageA.java @@ -0,0 +1,27 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * An {@link IInitialiserPackage} implementation, which simulates a package + * containing 1 initialiser implementation and no further sub-packages. + * + * @author Alp Torac Genc + * @see {@link cipm.consistency.initialisers.tests.dummy.packages} for the + * package layout. + */ +public class DummyInitialiserPackageA implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new DummyInitialiserA() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { DummyInitialiserA.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageB.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageB.java new file mode 100644 index 0000000000..b57467588c --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageB.java @@ -0,0 +1,27 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * An {@link IInitialiserPackage} implementation, which simulates a package + * containing 1 initialiser implementation and no further sub-packages. + * + * @author Alp Torac Genc + * @see {@link cipm.consistency.initialisers.tests.dummy.packages} for the + * package layout. + */ +public class DummyInitialiserPackageB implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new DummyInitialiserB() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { DummyInitialiserB.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageCD.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageCD.java new file mode 100644 index 0000000000..85a130e4e6 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyInitialiserPackageCD.java @@ -0,0 +1,27 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * An {@link IInitialiserPackage} implementation, which simulates a package + * containing 2 initialiser implementation and no further sub-packages. + * + * @author Alp Torac Genc + * @see {@link cipm.consistency.initialisers.tests.dummy.packages} for the + * package layout. + */ +public class DummyInitialiserPackageCD implements IInitialiserPackage { + @Override + public Collection getInitialiserInstances() { + return this.initCol(new IInitialiser[] { new DummyInitialiserC(), new DummyInitialiserD() }); + } + + @SuppressWarnings("unchecked") + @Override + public Collection> getInitialiserInterfaceTypes() { + return this.initCol(new Class[] { DummyInitialiserC.class, DummyInitialiserD.class }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjA.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjA.java new file mode 100644 index 0000000000..d9ea4b8846 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjA.java @@ -0,0 +1,30 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +/** + * A dummy object that can be initialised via {@link #initStep()}. Note that the + * said initialisation does not do any vital changes on the object, it only + * simulates an initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjA { + /** + * @see {@link #isInitialisationStepDone()} + */ + private boolean initialisationStepDone = false; + + /** + * Performs the initialisation + */ + public void initStep() { + this.initialisationStepDone = true; + } + + /** + * @return Whether initialisation was done + * @see {@link #initStep()} + */ + public boolean isInitialisationStepDone() { + return initialisationStepDone; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjB.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjB.java new file mode 100644 index 0000000000..bcca0f9975 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjB.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +/** + * A dummy object that needs no initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjB { + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjC.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjC.java new file mode 100644 index 0000000000..5f47d0ae01 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjC.java @@ -0,0 +1,50 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +/** + * A dummy object that can be initialised via 2 methods {@link #initStepOne()} + * and {@link #initStepTwo()}. Note that the said initialisation methods do not + * do any vital changes on the object, they only simulate an initialisation with + * multiple steps. The order of the steps do not matter. + * + * @author Alp Torac Genc + */ +public class DummyObjC { + /** + * @see {@link #isInitialisationStepOneDone()} + */ + private boolean initialisationStepOneDone = false; + /** + * @see {@link #isInitialisationStepTwoDone()} + */ + private boolean initialisationStepTwoDone = false; + + /** + * Performs the step one of the initialisation. + */ + public void initStepOne() { + this.initialisationStepOneDone = true; + } + + /** + * Performs the step two of the initialisation. + */ + public void initStepTwo() { + this.initialisationStepTwoDone = true; + } + + /** + * @return Whether the step one of the initialisation is performed. + * @see {@link #initStepOne()} + */ + public boolean isInitialisationStepOneDone() { + return initialisationStepOneDone; + } + + /** + * @return Whether the step two of the initialisation is performed. + * @see {@link #initStepTwo()} + */ + public boolean isInitialisationStepTwoDone() { + return initialisationStepTwoDone; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjD.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjD.java new file mode 100644 index 0000000000..c2b95d2495 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjD.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +/** + * A dummy object that needs no initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjD { + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjE.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjE.java new file mode 100644 index 0000000000..ede2a85f92 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyObjE.java @@ -0,0 +1,10 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +/** + * A dummy object that needs no initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjE { + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyTopLevelInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyTopLevelInitialiserPackage.java new file mode 100644 index 0000000000..c262efe44a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/DummyTopLevelInitialiserPackage.java @@ -0,0 +1,21 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * An {@link IInitialiserPackage} implementation, which simulates a top-level + * package containing 2 further sub-packages. + * + * @author Alp Torac Genc + * @see {@link cipm.consistency.initialisers.tests.dummy.packages} for the + * package layout. + */ +public class DummyTopLevelInitialiserPackage implements IInitialiserPackage { + @Override + public Collection getSubPackages() { + return this.initCol(new IInitialiserPackage[] { new DummyAggregateInitialiserPackageOne(), + new DummyAggregateInitialiserPackageTwo() }); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjAInitStrat.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjAInitStrat.java new file mode 100644 index 0000000000..d29952ec08 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjAInitStrat.java @@ -0,0 +1,53 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * An {@link AbstractDummyAdaptationStrategy} implementation that initialises + * {@link DummyObjA} instances, provided its constructor is given parameters + * that allow it. + * + * @author Alp Torac Genc + */ +public class ObjAInitStrat extends AbstractDummyAdaptationStrategy { + /** + * A variant of {@link #ObjAInitStrat(boolean)} with "true" as the boolean + * parameter. + */ + public ObjAInitStrat() { + super(); + } + + /** + * @see {@link AbstractDummyAdaptationStrategy#AbstractDummyAdaptationStrategy(boolean)} + */ + public ObjAInitStrat(boolean initSuccessfully) { + super(initSuccessfully); + } + + /** + * {@inheritDoc}
+ *
+ * Initialises the given {@link DummyObjA} instance, if + * {@link #doesInitialiseSuccessfully()} is true. + */ + @Override + public boolean apply(IInitialiser init, Object obj) { + if (obj instanceof DummyObjA) { + var castedO = (DummyObjA) obj; + + if (this.doesInitialiseSuccessfully()) { + castedO.initStep(); + } + + return castedO.isInitialisationStepDone(); + } + + return true; + } + + @Override + public ObjAInitStrat newStrategy() { + return new ObjAInitStrat(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCFirstInitStepStrat.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCFirstInitStepStrat.java new file mode 100644 index 0000000000..2b984b3cea --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCFirstInitStepStrat.java @@ -0,0 +1,55 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * An {@link AbstractDummyAdaptationStrategy} implementation that partially + * initialises {@link DummyObjC} instances, provided its constructor is given + * parameters that allow it. This implementation is complemented with + * {@link ObjCSecondInitStepStrat}, which performs the remaining part of the + * said initialisation. + * + * @author Alp Torac Genc + */ +public class ObjCFirstInitStepStrat extends AbstractDummyAdaptationStrategy { + /** + * A variant of {@link #ObjCFirstInitStepStrat(boolean)} with "true" as the + * boolean parameter. + */ + public ObjCFirstInitStepStrat() { + super(); + } + + /** + * @see {@link AbstractDummyAdaptationStrategy#AbstractDummyAdaptationStrategy(boolean)} + */ + public ObjCFirstInitStepStrat(boolean initSuccessfully) { + super(initSuccessfully); + } + + /** + * {@inheritDoc}
+ *
+ * Performs {@link DummyObjC#initStepOne()} on the given {@link DummyObjC} + * instance, if {@link #doesInitialiseSuccessfully()} is true. + */ + @Override + public boolean apply(IInitialiser init, Object obj) { + if (obj instanceof DummyObjC) { + var castedO = (DummyObjC) obj; + + if (this.doesInitialiseSuccessfully()) { + castedO.initStepOne(); + } + + return castedO.isInitialisationStepOneDone(); + } + + return true; + } + + @Override + public ObjCFirstInitStepStrat newStrategy() { + return new ObjCFirstInitStepStrat(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCSecondInitStepStrat.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCSecondInitStepStrat.java new file mode 100644 index 0000000000..5b6a2c2aa9 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/ObjCSecondInitStepStrat.java @@ -0,0 +1,55 @@ +package cipm.consistency.initialisers.tests.dummy.packages; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * An {@link AbstractDummyAdaptationStrategy} implementation that partially + * initialises {@link DummyObjC} instances, provided its constructor is given + * parameters that allow it. This implementation is complemented with + * {@link ObjCFirstInitStepStrat}, which performs the remaining part of the said + * initialisation. + * + * @author Alp Torac Genc + */ +public class ObjCSecondInitStepStrat extends AbstractDummyAdaptationStrategy { + /** + * A variant of {@link #ObjCSecondInitStepStrat(boolean)} with "true" as the + * boolean parameter. + */ + public ObjCSecondInitStepStrat() { + super(); + } + + /** + * @see {@link AbstractDummyAdaptationStrategy#AbstractDummyAdaptationStrategy(boolean)} + */ + public ObjCSecondInitStepStrat(boolean initSuccessfully) { + super(initSuccessfully); + } + + /** + * {@inheritDoc}
+ *
+ * Performs {@link DummyObjC#initStepTwo()} on the given {@link DummyObjC} + * instance, if {@link #doesInitialiseSuccessfully()} is true. + */ + @Override + public boolean apply(IInitialiser init, Object obj) { + if (obj instanceof DummyObjC) { + var castedO = (DummyObjC) obj; + + if (this.doesInitialiseSuccessfully()) { + castedO.initStepTwo(); + } + + return castedO.isInitialisationStepTwoDone(); + } + + return true; + } + + @Override + public ObjCSecondInitStepStrat newStrategy() { + return new ObjCSecondInitStepStrat(); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/package-info.java new file mode 100644 index 0000000000..bb61fa3c31 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/packages/package-info.java @@ -0,0 +1,36 @@ +/** + * Contains dummy implementations of initialiser packages as well as their + * content. They are used in tests for initialiser packages and initialiser + * adaptation. Through these tests, the recursive discovery of sub-packages and + * their content is tested. The current package/initialiser layout is as + * follows:
+ *
+ *
    + *
  • {@link DummyTopLevelInitialiserPackage} + *
      + *
    • {@link DummyAggregateInitialiserPackageOne} + *
        + *
      • {@link DummyInitialiserE} + *
      • {@link DummyInitialiserPackageA} + *
          + *
        • {@link DummyInitialiserA} + *
        + *
      • {@link DummyInitialiserPackageB} + *
          + *
        • {@link DummyInitialiserB} + *
        + *
      + *
    • {@link DummyAggregateInitialiserPackageTwo} + *
        + *
      • {@link DummyInitialiserPackageCD} + *
          + *
        • {@link DummyInitialiserC} + *
        • {@link DummyInitialiserD} + *
        + *
      + *
    + *
+ * + * @author Alp Torac Genc + */ +package cipm.consistency.initialisers.tests.dummy.packages; \ No newline at end of file From 64dbb99077afa6c40c5ce521ca815ba17c02a0ba Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:23:35 +0200 Subject: [PATCH 39/87] Implement dummy constructs for future tests Their purpose is to be used to verify that initialisers can modify the objects they create as intended. They can also be used to test some static methods of IInitialiser (the top-level initialiser interface). The said dummy constructs also include a re-usable abstract class for further dummy constructs (to be implemented in the following commits). --- ...DummyTriviallyInitialisingInitialiser.java | 49 +++++++++++++++++++ .../tests/dummy/types/DummyModifiableObj.java | 37 ++++++++++++++ .../types/DummyModifiableObjInitialiser.java | 48 ++++++++++++++++++ .../IDummyInitialiserWithoutMethods.java | 13 +++++ 4 files changed, 147 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/AbstractDummyTriviallyInitialisingInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObj.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObjInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/IDummyInitialiserWithoutMethods.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/AbstractDummyTriviallyInitialisingInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/AbstractDummyTriviallyInitialisingInitialiser.java new file mode 100644 index 0000000000..a4ce23e2b5 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/AbstractDummyTriviallyInitialisingInitialiser.java @@ -0,0 +1,49 @@ +package cipm.consistency.initialisers.tests.dummy.types; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * An abstract dummy {@link IInitialiser}, which either always succeeds or + * always fails initialising via {@link #initialise(Object)}. + * + * @author Alp Torac Genc + */ +public abstract class AbstractDummyTriviallyInitialisingInitialiser implements IInitialiser { + + /** + * @see {@link AbstractDummyTriviallyInitialisingInitialiser#AbstractDummyTriviallyInitialisingInitialiser(boolean)} + */ + private boolean isInitialiseSuccessful; + + /** + * A variant of + * {@link AbstractDummyTriviallyInitialisingInitialiser#AbstractDummyTriviallyInitialisingInitialiser(boolean)} + * with "true" as the boolean parameter. + */ + public AbstractDummyTriviallyInitialisingInitialiser() { + this(true); + } + + /** + * Constructs an instance, which either always succeeds or always fails + * initialising via {@link #initialise(Object)}. + * + * @param isInitialiseSuccessful The return value of {@link #initialise(Object)} + * (i.e. whether initialisation succeeds). + */ + public AbstractDummyTriviallyInitialisingInitialiser(boolean isInitialiseSuccessful) { + this.isInitialiseSuccessful = isInitialiseSuccessful; + } + + /** + * {@inheritDoc}
+ *
+ * For this implementation, does nothing to the given object. Check + * {@link AbstractDummyTriviallyInitialisingInitialiser#AbstractDummyTriviallyInitialisingInitialiser(boolean)} + * for the return value. + */ + @Override + public boolean initialise(Object obj) { + return this.isInitialiseSuccessful; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObj.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObj.java new file mode 100644 index 0000000000..b98c07a556 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObj.java @@ -0,0 +1,37 @@ +package cipm.consistency.initialisers.tests.dummy.types; + +import java.util.HashSet; +import java.util.Set; + +/** + * A dummy object, to which modifiable attributes can be added. The said + * attributes are then stored in a {@link Set}. + * + * @author Alp Torac Genc + */ +public class DummyModifiableObj { + /** + * A set of modifiable attributes. + */ + private final Set someModifiableAttrCol = new HashSet(); + + /** + * @param attrToAdd An attribute to be added to this + * @return Whether the given attibute was added successfully + */ + public boolean addAttr(Object attrToAdd) { + return attrToAdd != null && this.someModifiableAttrCol.add(attrToAdd); + } + + /** + * @return A set containing all attributes stored in this. Modifying the + * returned attributes will affect the attributes stored in this. + * Modifying the returned set will not affect the stored values, + * however. + */ + public Set getAttrs() { + var attrs = new HashSet(); + this.someModifiableAttrCol.forEach((attr) -> attrs.add(attr)); + return attrs; + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObjInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObjInitialiser.java new file mode 100644 index 0000000000..f623942e8f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/DummyModifiableObjInitialiser.java @@ -0,0 +1,48 @@ +package cipm.consistency.initialisers.tests.dummy.types; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy {@link IInitialiser} implementation for {@link DummyModifiableObj}, + * which also offers methods to add them attributes. + * + * @author Alp Torac Genc + */ +public class DummyModifiableObjInitialiser implements IInitialiser { + + @Override + public DummyModifiableObjInitialiser newInitialiser() { + return new DummyModifiableObjInitialiser(); + } + + @Override + public DummyModifiableObj instantiate() { + return new DummyModifiableObj(); + } + + /** + * {@inheritDoc}
+ *
+ * For this implementor, does nothing and returns true. + */ + @Override + public boolean initialise(Object obj) { + return true; + } + + /** + * @see {@link DummyModifiableObj#addAttr(Object)} + */ + public boolean addAttr(DummyModifiableObj obj, Object attrToAdd) { + return obj.addAttr(attrToAdd); + } + + /** + * A variant of {@link #addAttr(DummyModifiableObj, Object)} for adding an array + * of attributes (each element within the given array will be added + * individually). + */ + public boolean addAttrs(DummyModifiableObj obj, Object[] attrsToAdd) { + return this.doMultipleModifications(obj, attrsToAdd, this::addAttr); + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/IDummyInitialiserWithoutMethods.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/IDummyInitialiserWithoutMethods.java new file mode 100644 index 0000000000..68086fb874 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/IDummyInitialiserWithoutMethods.java @@ -0,0 +1,13 @@ +package cipm.consistency.initialisers.tests.dummy.types; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy interface that extends {@link IInitialiser} without introducing + * anything new. + * + * @author Alp Torac Genc + */ +public interface IDummyInitialiserWithoutMethods extends IInitialiser { + +} From 771609b16bc3c1fab4bc78bf9e8fdac51a7a4077 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:26:56 +0200 Subject: [PATCH 40/87] Implement dummy constructs for future tests Add a package that contains 4 dummy objects, as well as their dummy initialisers. Neither the said objects nor their initialisers form a type hierarchy (i.e. they do not extend one another). They are meant to be used in tests, which verify some static methods of IInitialiser (the top-level initialiser interface). --- .../types/flathierarchy/DummyObjFour.java | 9 ++++ .../DummyObjFourInitialiser.java | 43 +++++++++++++++++++ .../types/flathierarchy/DummyObjOne.java | 9 ++++ .../flathierarchy/DummyObjOneInitialiser.java | 31 +++++++++++++ .../types/flathierarchy/DummyObjThree.java | 9 ++++ .../DummyObjThreeInitialiser.java | 31 +++++++++++++ .../types/flathierarchy/DummyObjTwo.java | 9 ++++ .../flathierarchy/DummyObjTwoInitialiser.java | 36 ++++++++++++++++ .../IDummyObjFourInitialiser.java | 25 +++++++++++ .../IDummyObjOneInitialiser.java | 18 ++++++++ .../IDummyObjThreeInitialiser.java | 14 ++++++ .../IDummyObjTwoInitialiser.java | 14 ++++++ .../types/flathierarchy/package-info.java | 11 +++++ 13 files changed, 259 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFour.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFourInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOne.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOneInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThree.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThreeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwo.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwoInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjFourInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjOneInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjThreeInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjTwoInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFour.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFour.java new file mode 100644 index 0000000000..501a1fc233 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFour.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +/** + * A dummy object that needs no initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjFour { +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFourInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFourInitialiser.java new file mode 100644 index 0000000000..fba03e8e18 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjFourInitialiser.java @@ -0,0 +1,43 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.tests.dummy.types.AbstractDummyTriviallyInitialisingInitialiser; + +/** + * A dummy initialiser implementation of {@link IDummyObjFourInitialiser} that + * introduces some further utility methods: + *
    + *
  • One with an object parameter + *
  • Another one without parameters + *
+ * + * @author Alp Torac Genc + */ +public class DummyObjFourInitialiser extends AbstractDummyTriviallyInitialisingInitialiser + implements IDummyObjFourInitialiser { + + public DummyObjFourInitialiser() { + super(); + } + + public DummyObjFourInitialiser(boolean isInitialiseSuccessful) { + super(isInitialiseSuccessful); + } + + @Override + public DummyObjFourInitialiser newInitialiser() { + return new DummyObjFourInitialiser(); + } + + @Override + public DummyObjFour instantiate() { + return new DummyObjFour(); + } + + public boolean someUtilityMethodInClass(Object param) { + return true; + } + + public boolean someUtilityMethodInClassWithoutParam() { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOne.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOne.java new file mode 100644 index 0000000000..78ef06da84 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOne.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +/** + * A dummy object that needs no initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjOne { +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOneInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOneInitialiser.java new file mode 100644 index 0000000000..5ff0a852a8 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjOneInitialiser.java @@ -0,0 +1,31 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.tests.dummy.types.AbstractDummyTriviallyInitialisingInitialiser; + +/** + * A dummy initialiser implementation of {@link IDummyObjOneInitialiser} that + * introduces no new methods. + * + * @author Alp Torac Genc + */ +public class DummyObjOneInitialiser extends AbstractDummyTriviallyInitialisingInitialiser + implements IDummyObjOneInitialiser { + + public DummyObjOneInitialiser() { + super(); + } + + public DummyObjOneInitialiser(boolean isInitialiseSuccessful) { + super(isInitialiseSuccessful); + } + + @Override + public DummyObjOneInitialiser newInitialiser() { + return new DummyObjOneInitialiser(); + } + + @Override + public DummyObjOne instantiate() { + return new DummyObjOne(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThree.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThree.java new file mode 100644 index 0000000000..4bfadf7005 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThree.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +/** + * A dummy object that needs no initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjThree { +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThreeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThreeInitialiser.java new file mode 100644 index 0000000000..810aab7d30 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjThreeInitialiser.java @@ -0,0 +1,31 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.tests.dummy.types.AbstractDummyTriviallyInitialisingInitialiser; + +/** + * A dummy initialiser implementation of {@link IDummyObjThreeInitialiser} that + * introduces no new methods. + * + * @author Alp Torac Genc + */ +public class DummyObjThreeInitialiser extends AbstractDummyTriviallyInitialisingInitialiser + implements IDummyObjThreeInitialiser { + + public DummyObjThreeInitialiser() { + super(); + } + + public DummyObjThreeInitialiser(boolean isInitialiseSuccessful) { + super(isInitialiseSuccessful); + } + + @Override + public DummyObjThreeInitialiser newInitialiser() { + return new DummyObjThreeInitialiser(); + } + + @Override + public DummyObjThree instantiate() { + return new DummyObjThree(); + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwo.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwo.java new file mode 100644 index 0000000000..80ceee57df --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwo.java @@ -0,0 +1,9 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +/** + * A dummy object that needs no initialisation. + * + * @author Alp Torac Genc + */ +public class DummyObjTwo { +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwoInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwoInitialiser.java new file mode 100644 index 0000000000..b27989437a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/DummyObjTwoInitialiser.java @@ -0,0 +1,36 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.tests.dummy.types.AbstractDummyTriviallyInitialisingInitialiser; + +/** + * A dummy initialiser implementation of {@link IDummyObjTwoInitialiser} that + * introduces a new modification method, which takes an object parameter as well + * as the object to be modified. + * + * @author Alp Torac Genc + */ +public class DummyObjTwoInitialiser extends AbstractDummyTriviallyInitialisingInitialiser + implements IDummyObjTwoInitialiser { + + public DummyObjTwoInitialiser() { + super(); + } + + public DummyObjTwoInitialiser(boolean isInitialiseSuccessful) { + super(isInitialiseSuccessful); + } + + @Override + public DummyObjTwoInitialiser newInitialiser() { + return new DummyObjTwoInitialiser(); + } + + @Override + public DummyObjTwo instantiate() { + return new DummyObjTwo(); + } + + public boolean modificationMethodInClass(DummyObjTwo obj, Object param) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjFourInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjFourInitialiser.java new file mode 100644 index 0000000000..21781b6a17 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjFourInitialiser.java @@ -0,0 +1,25 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy initialiser interface with some default utility methods: + *
    + *
  • One with an object parameter + *
  • Another one without parameters + *
+ * + * @author Alp Torac Genc + */ +public interface IDummyObjFourInitialiser extends IInitialiser { + @Override + public DummyObjFour instantiate(); + + public default boolean someUtilityMethodInInterface(Object someParam) { + return true; + } + + public default boolean someUtilityMethodInInterfaceWithoutParam() { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjOneInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjOneInitialiser.java new file mode 100644 index 0000000000..cdd150c0f7 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjOneInitialiser.java @@ -0,0 +1,18 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy initialiser interface with a default modification method taking + * multiple parameters, as well as the object to be modified. + * + * @author Alp Torac Genc + */ +public interface IDummyObjOneInitialiser extends IInitialiser { + @Override + public DummyObjOne instantiate(); + + public default boolean modificationMethodInInterface(DummyObjOne obj, Object param1, Object param2) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjThreeInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjThreeInitialiser.java new file mode 100644 index 0000000000..4ec1a796f4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjThreeInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy initialiser interface that introduces nothing new. It only overrides + * the return type of {@link IDummyObjThreeInitialiser#instantiate()}. + * + * @author Alp Torac Genc + */ +public interface IDummyObjThreeInitialiser extends IInitialiser { + @Override + public DummyObjThree instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjTwoInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjTwoInitialiser.java new file mode 100644 index 0000000000..c4849e9384 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/IDummyObjTwoInitialiser.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy initialiser interface that introduces nothing new. It only overrides + * the return type of {@link IDummyObjThreeInitialiser#instantiate()}. + * + * @author Alp Torac Genc + */ +public interface IDummyObjTwoInitialiser extends IInitialiser { + @Override + public DummyObjTwo instantiate(); +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/package-info.java new file mode 100644 index 0000000000..41bc7f2487 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/flathierarchy/package-info.java @@ -0,0 +1,11 @@ +/** + * This package contains dummy objects without members and one initialiser for + * each of those objects (both an initialiser class and an initialiser + * interface). Neither the dummy objects nor their initialisers depend on one + * another.
+ *
+ * The constructs defined within this package can be used to test interactions + * of some {@link IInitialiser} methods with objects/initialisers that are + * independent of one another. + */ +package cipm.consistency.initialisers.tests.dummy.types.flathierarchy; \ No newline at end of file From 01d1b809a0dfd8f029c932c7aeabb684c34189ce Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:28:27 +0200 Subject: [PATCH 41/87] Implement dummy constructs for future tests Add a package that contains some dummy objects and their dummy initialisers, which extend one another. They are to be used in tests that verify some static methods of IInitialiser (the top-level initialiser interface). --- .../DummyAlternateInitialiser.java | 26 ++++++++++++++ .../DummyNonTerminalObj.java | 14 ++++++++ .../DummyNonTerminalObjInitialiser.java | 24 +++++++++++++ .../verticalhierarchy/DummyTerminalObj.java | 11 ++++++ .../DummyTerminalObjInitialiser.java | 24 +++++++++++++ .../verticalhierarchy/DummyTopLevelObj.java | 11 ++++++ .../DummyTopLevelObjInitialiser.java | 24 +++++++++++++ .../IDummyAlternateInitialiser.java | 16 +++++++++ .../IDummyNonTerminalObjInitialiser.java | 19 +++++++++++ .../IDummyTerminalObjInitialiser.java | 19 +++++++++++ .../IDummyTopLevelObjInitialiser.java | 19 +++++++++++ .../types/verticalhierarchy/package-info.java | 34 +++++++++++++++++++ 12 files changed, 241 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyAlternateInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObj.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObjInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObj.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObjInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObj.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObjInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyAlternateInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyNonTerminalObjInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTerminalObjInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTopLevelObjInitialiser.java create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyAlternateInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyAlternateInitialiser.java new file mode 100644 index 0000000000..4adca9a9e3 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyAlternateInitialiser.java @@ -0,0 +1,26 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +/** + * A dummy implementation of {@link IDummyAlternateInitialiser} that introduces + * nothing new. Serves as an alternative to + * {@link DummyNonTerminalObjInitialiser} (does not have any dependencies to + * it). + * + * @author Alp Torac Genc + */ +public class DummyAlternateInitialiser implements IDummyAlternateInitialiser { + @Override + public DummyAlternateInitialiser newInitialiser() { + return new DummyAlternateInitialiser(); + } + + @Override + public DummyNonTerminalObj instantiate() { + return new DummyNonTerminalObj(); + } + + @Override + public boolean initialise(Object obj) { + return true; + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObj.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObj.java new file mode 100644 index 0000000000..6d433a9178 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObj.java @@ -0,0 +1,14 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +/** + * A dummy object in the middle of the type hierarchy defined within this + * package. Does not need initialisation.
+ *
+ * Can be instantiated by 2 separate initialisers: + * {@link DummyAlternateInitialiser} and {@link DummyNonTerminalObjInitialiser}. + * + * @author Alp Torac Genc + */ +public class DummyNonTerminalObj extends DummyTopLevelObj { + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObjInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObjInitialiser.java new file mode 100644 index 0000000000..bf31e4a2ac --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyNonTerminalObjInitialiser.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +/** + * A dummy implementation of {@link IDummyNonTerminalObjInitialiser} that + * introduces nothing new. + * + * @author Alp Torac Genc + */ +public class DummyNonTerminalObjInitialiser implements IDummyNonTerminalObjInitialiser { + @Override + public DummyNonTerminalObjInitialiser newInitialiser() { + return new DummyNonTerminalObjInitialiser(); + } + + @Override + public DummyNonTerminalObj instantiate() { + return new DummyNonTerminalObj(); + } + + @Override + public boolean initialise(Object obj) { + return true; + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObj.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObj.java new file mode 100644 index 0000000000..d9bb5ad98a --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObj.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +/** + * A dummy object at the bottom of the type hierarchy defined within this + * package. Does not need initialisation. + * + * @author Alp Torac Genc + */ +public class DummyTerminalObj extends DummyNonTerminalObj { + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObjInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObjInitialiser.java new file mode 100644 index 0000000000..7e81765a19 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTerminalObjInitialiser.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +/** + * A dummy implementation of {@link IDummyTerminalObjInitialiser} that + * introduces nothing new. + * + * @author Alp Torac Genc + */ +public class DummyTerminalObjInitialiser implements IDummyTerminalObjInitialiser { + @Override + public DummyTerminalObjInitialiser newInitialiser() { + return new DummyTerminalObjInitialiser(); + } + + @Override + public DummyTerminalObj instantiate() { + return new DummyTerminalObj(); + } + + @Override + public boolean initialise(Object obj) { + return true; + } +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObj.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObj.java new file mode 100644 index 0000000000..8d0b78839e --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObj.java @@ -0,0 +1,11 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +/** + * A dummy object at the top of the type hierarchy defined within this package. + * Does not need initialisation. + * + * @author Alp Torac Genc + */ +public class DummyTopLevelObj { + +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObjInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObjInitialiser.java new file mode 100644 index 0000000000..f3d31bfeda --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/DummyTopLevelObjInitialiser.java @@ -0,0 +1,24 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +/** + * A dummy implementation of {@link IDummyTopLevelObjInitialiser} that + * introduces nothing new. + * + * @author Alp Torac Genc + */ +public class DummyTopLevelObjInitialiser implements IDummyTopLevelObjInitialiser { + @Override + public DummyTopLevelObjInitialiser newInitialiser() { + return new DummyTopLevelObjInitialiser(); + } + + @Override + public DummyTopLevelObj instantiate() { + return new DummyTopLevelObj(); + } + + @Override + public boolean initialise(Object obj) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyAlternateInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyAlternateInitialiser.java new file mode 100644 index 0000000000..c621ca4cea --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyAlternateInitialiser.java @@ -0,0 +1,16 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy {@link IInitialiser} interface that is in the middle of the type + * hierarchy defined within this package. It represents an alternative for + * {@link IDummyNonTerminalObjInitialiser} (does not have any dependencies to + * it). + * + * @author Alp Torac Genc + */ +public interface IDummyAlternateInitialiser extends IDummyTopLevelObjInitialiser { + @Override + public DummyNonTerminalObj instantiate(); +} \ No newline at end of file diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyNonTerminalObjInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyNonTerminalObjInitialiser.java new file mode 100644 index 0000000000..bbcae24f5f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyNonTerminalObjInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy {@link IInitialiser} interface that is in the middle of the type + * hierarchy defined within this package. Introduces one default modification + * method that only takes the object to be modified. + * + * @author Alp Torac Genc + */ +public interface IDummyNonTerminalObjInitialiser extends IDummyTopLevelObjInitialiser { + @Override + public DummyNonTerminalObj instantiate(); + + public default boolean someNonTerminalObjModificationMethod(DummyNonTerminalObj obj) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTerminalObjInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTerminalObjInitialiser.java new file mode 100644 index 0000000000..bffab357ae --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTerminalObjInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy {@link IInitialiser} interface that is at the bottom of the type + * hierarchy defined within this package. Introduces one default modification + * method that only takes the object to be modified. + * + * @author Alp Torac Genc + */ +public interface IDummyTerminalObjInitialiser extends IDummyNonTerminalObjInitialiser { + @Override + public DummyTerminalObj instantiate(); + + public default boolean someTerminalObjModificationMethod(DummyTerminalObj obj) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTopLevelObjInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTopLevelObjInitialiser.java new file mode 100644 index 0000000000..6ee199965d --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/IDummyTopLevelObjInitialiser.java @@ -0,0 +1,19 @@ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; + +import cipm.consistency.initialisers.IInitialiser; + +/** + * A dummy {@link IInitialiser} interface that is at the top of the type + * hierarchy defined within this package. Introduces one default modification + * method that only takes the object to be modified. + * + * @author Alp Torac Genc + */ +public interface IDummyTopLevelObjInitialiser extends IInitialiser { + @Override + public DummyTopLevelObj instantiate(); + + public default boolean someTopLevelObjModificationMethod(DummyTopLevelObj obj) { + return true; + } +} diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/package-info.java new file mode 100644 index 0000000000..83f17570ca --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/verticalhierarchy/package-info.java @@ -0,0 +1,34 @@ +/** + * This package contains dummy objects without members and initialisers for each + * of those objects (both an initialiser class and an initialiser interface). + * These objects and initialisers extend one another and form a type hierarchy. + *
+ *
+ * The constructs defined within this package can be used to test interactions + * of some {@link IInitialiser} methods with objects/initialisers that inherit + * from one another.
+ *
+ * The current layout of the type hierarchy for the objects is as follows: + *
    + *
  • {@link DummyTopLevelObj} + *
      + *
    • {@link DummyNonTerminalObj} + *
        + *
      • {@link DummyTerminalObj} + *
      + *
    + *
+ * The current layout of the type hierarchy for the initialisers is as follows + * (similar for initialiser interfaces): + *
    + *
  • {@link DummyTopLevelObjInitialiser} + *
      + *
    • {@link DummyNonTerminalObjInitialiser} + *
        + *
      • {@link DummyTerminalObjInitialiser} + *
      + *
    • {@link DummyAlternateInitialiser} + *
    + *
+ */ +package cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy; \ No newline at end of file From 81b959a9445aeb5718f21657fe5f306b7b096781 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:28:50 +0200 Subject: [PATCH 42/87] Add package commentary --- .../initialisers/tests/dummy/types/package-info.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/package-info.java new file mode 100644 index 0000000000..0eaa0a1c70 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/types/package-info.java @@ -0,0 +1,11 @@ +/** + * This package, as well as its sub-packages, contain dummy object and + * initialiser implementations for tests. They can be used to test various + * methods of the {@link IInitialiser} interface, especially the static utility + * methods within.
+ *
+ * The sub-packages feature different initialiser (and object) hierarchies, so + * that the interaction of initialiser methods with different type hierarchies + * can be tested. + */ +package cipm.consistency.initialisers.tests.dummy.types; \ No newline at end of file From 61f228a356e62d789404e71e2b4fe12a0733fa0c Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:29:01 +0200 Subject: [PATCH 43/87] Add package commentary --- .../consistency/initialisers/tests/dummy/package-info.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/package-info.java new file mode 100644 index 0000000000..661d3e0147 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/dummy/package-info.java @@ -0,0 +1,5 @@ +/** + * Sub-packages contain various dummy elements designed to test interfaces and + * abstract classes used by initialisers. + */ +package cipm.consistency.initialisers.tests.dummy; \ No newline at end of file From cdb1d95acdef01d74efe2460d35ab9a887de5561 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:30:36 +0200 Subject: [PATCH 44/87] Add tests for initialiser discovery via initialiser packages --- .../tests/InitialiserPackageTests.java | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserPackageTests.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserPackageTests.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserPackageTests.java new file mode 100644 index 0000000000..8f8db7ac7f --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserPackageTests.java @@ -0,0 +1,199 @@ +package cipm.consistency.initialisers.tests; + +import java.util.Collection; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; +import cipm.consistency.initialisers.tests.dummy.packages.DummyAggregateInitialiserPackageOne; +import cipm.consistency.initialisers.tests.dummy.packages.DummyAggregateInitialiserPackageTwo; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserA; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserB; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserC; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserD; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserE; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserPackageA; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserPackageB; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserPackageCD; +import cipm.consistency.initialisers.tests.dummy.packages.DummyObjA; +import cipm.consistency.initialisers.tests.dummy.packages.DummyObjB; +import cipm.consistency.initialisers.tests.dummy.packages.DummyObjC; +import cipm.consistency.initialisers.tests.dummy.packages.DummyObjD; +import cipm.consistency.initialisers.tests.dummy.packages.DummyObjE; +import cipm.consistency.initialisers.tests.dummy.packages.DummyTopLevelInitialiserPackage; + +/** + * Contains tests for {@link IInitialiserPackage} over dummy elements. The aim + * is to ensure that initialiser discovery works on certain package structures + * as intended.
+ *
+ * Check the used dummy elements to get more information on their structure. + * + * @author Alp Torac Genc + */ +public class InitialiserPackageTests { + /** + * Assert that the initialiser for objects of type cls is/is not reachable from + * pac. + */ + private void assertInitialiserReachableFrom(Class cls, IInitialiserPackage pac, boolean isReachable) { + var init = pac.getInitialiserInstanceFor(cls); + var initCls = pac.getInitialiserInterfaceTypeFor(cls); + + Assertions.assertEquals(isReachable, init != null); + Assertions.assertEquals(isReachable, initCls != null); + + if (isReachable) { + Assertions.assertTrue(init.isInitialiserFor(cls)); + Assertions.assertTrue(init.getClass().equals(initCls)); + } + } + + /** + * A variant of + * {@link #assertInitialiserReachableFrom(Class, IInitialiserPackage, boolean)}, + * where the final parameter is true. + */ + private void assertInitialiserReachableFrom(Class cls, IInitialiserPackage pac) { + this.assertInitialiserReachableFrom(cls, pac, true); + } + + /** + * Asserts either that the expected elements are in col or that col contains + * elements of same types as expected elements. + */ + private void assertContentEqualsByClass(T[] expectedElems, Collection col) { + if (expectedElems != null) { + Assertions.assertEquals(expectedElems.length, col.size()); + + for (var elem : expectedElems) { + Assertions.assertTrue( + col.contains(elem) || col.stream().anyMatch((e) -> e.getClass().equals(elem.getClass()))); + } + } else { + Assertions.assertEquals(0, col.size()); + } + } + + /** + * Asserts that all inits are present within initInsCol (as instance) and in + * initClsCol (as class object). + */ + @SuppressWarnings("unchecked") + private void assertInitialiserContentEquals(IInitialiser[] inits, Collection initInsCol, + Collection> initClsCol) { + this.assertContentEqualsByClass(inits, initInsCol); + this.assertContentEqualsByClass(initInsCol.stream().map((i) -> i.getClass()).toArray(Class[]::new), initClsCol); + } + + /** + * Asserts that direct contents (i.e. contents of pac that can be found without + * discovering its sub-packages) of pac are equal to inits. + */ + private void assertDirectPackageContentEquals(IInitialiser[] inits, IInitialiserPackage pac) { + this.assertInitialiserContentEquals(inits, pac.getInitialiserInstances(), pac.getInitialiserInterfaceTypes()); + } + + /** + * Asserts that all contents accessible from pac are equal to inits. + */ + private void assertAllPackageContentEquals(IInitialiser[] inits, IInitialiserPackage pac) { + this.assertInitialiserContentEquals(inits, pac.getAllInitialiserInstances(), + pac.getAllInitialiserInterfaceTypes()); + } + + @Test + public void test_TopLevelPackage_Content() { + var pac = new DummyTopLevelInitialiserPackage(); + + this.assertDirectPackageContentEquals(null, pac); + this.assertAllPackageContentEquals(new IInitialiser[] { new DummyInitialiserA(), new DummyInitialiserB(), + new DummyInitialiserC(), new DummyInitialiserD(), new DummyInitialiserE() }, pac); + } + + @Test + public void test_AggregateOnePackage_Content() { + var pac = new DummyAggregateInitialiserPackageOne(); + + this.assertDirectPackageContentEquals(new IInitialiser[] { new DummyInitialiserE() }, pac); + this.assertAllPackageContentEquals( + new IInitialiser[] { new DummyInitialiserE(), new DummyInitialiserA(), new DummyInitialiserB() }, pac); + } + + @Test + public void test_AggregateTwoPackage_Content() { + var pac = new DummyAggregateInitialiserPackageTwo(); + + this.assertDirectPackageContentEquals(null, pac); + this.assertAllPackageContentEquals(new IInitialiser[] { new DummyInitialiserC(), new DummyInitialiserD() }, + pac); + } + + @Test + public void test_TopLevelPackage_GetInitialiser() { + var pac = new DummyTopLevelInitialiserPackage(); + + this.assertInitialiserReachableFrom(DummyObjA.class, pac); + this.assertInitialiserReachableFrom(DummyObjB.class, pac); + this.assertInitialiserReachableFrom(DummyObjC.class, pac); + this.assertInitialiserReachableFrom(DummyObjD.class, pac); + this.assertInitialiserReachableFrom(DummyObjE.class, pac); + } + + @Test + public void test_AggregateOnePackage_GetInitialiser() { + var pac = new DummyAggregateInitialiserPackageOne(); + + this.assertInitialiserReachableFrom(DummyObjA.class, pac); + this.assertInitialiserReachableFrom(DummyObjB.class, pac); + this.assertInitialiserReachableFrom(DummyObjC.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjD.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjE.class, pac); + } + + @Test + public void test_AggregateTwoPackage_GetInitialiser() { + var pac = new DummyAggregateInitialiserPackageTwo(); + + this.assertInitialiserReachableFrom(DummyObjA.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjB.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjC.class, pac); + this.assertInitialiserReachableFrom(DummyObjD.class, pac); + this.assertInitialiserReachableFrom(DummyObjE.class, pac, false); + } + + @Test + public void test_PackageA_GetInitialiser() { + var pac = new DummyInitialiserPackageA(); + + this.assertInitialiserReachableFrom(DummyObjA.class, pac); + this.assertInitialiserReachableFrom(DummyObjB.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjC.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjD.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjE.class, pac, false); + } + + @Test + public void test_PackageB_GetInitialiser() { + var pac = new DummyInitialiserPackageB(); + + this.assertInitialiserReachableFrom(DummyObjA.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjB.class, pac); + this.assertInitialiserReachableFrom(DummyObjC.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjD.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjE.class, pac, false); + } + + @Test + public void test_PackageCD_GetInitialiser() { + var pac = new DummyInitialiserPackageCD(); + + this.assertInitialiserReachableFrom(DummyObjA.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjB.class, pac, false); + this.assertInitialiserReachableFrom(DummyObjC.class, pac); + this.assertInitialiserReachableFrom(DummyObjD.class, pac); + this.assertInitialiserReachableFrom(DummyObjE.class, pac, false); + } +} From 5e64400183629c66d9a812db19cbf99cc83b6f6d Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:31:18 +0200 Subject: [PATCH 45/87] Add tests for methods in IInitialiser --- .../initialisers/tests/IInitialiserTests.java | 353 ++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/IInitialiserTests.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/IInitialiserTests.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/IInitialiserTests.java new file mode 100644 index 0000000000..17c822ab98 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/IInitialiserTests.java @@ -0,0 +1,353 @@ +package cipm.consistency.initialisers.tests; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.DummyModifiableObjInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.IDummyInitialiserWithoutMethods; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjFour; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjFourInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjOne; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjOneInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjThree; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjThreeInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjTwo; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.DummyObjTwoInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.IDummyObjFourInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.IDummyObjOneInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.IDummyObjThreeInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.flathierarchy.IDummyObjTwoInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.DummyAlternateInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.DummyNonTerminalObj; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.DummyNonTerminalObjInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.DummyTerminalObj; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.DummyTerminalObjInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.DummyTopLevelObj; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.DummyTopLevelObjInitialiser; +import cipm.consistency.initialisers.tests.dummy.types.verticalhierarchy.IDummyAlternateInitialiser; + +/** + * Contains tests for (static/default) methods implemented in + * {@link IInitialiser} + * + * @author Alp Torac Genc + */ +public class IInitialiserTests { + /** + * Ensures that + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * throws null pointer exceptions if the object to be modified is null. + */ + @Test + public void test_doMultipleModifications_NullObject() { + var init = new DummyModifiableObjInitialiser(); + Assertions.assertThrows(NullPointerException.class, () -> { + init.addAttrs(null, new Object[] { 1 }); + }); + } + + /** + * Check whether + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * throws exceptions, if null is passed as array of modification parameters. + * Also ensures that true is returned. + */ + @Test + public void test_doMultipleModifications_NullModificationParams() { + var init = new DummyModifiableObjInitialiser(); + Assertions.assertTrue(init.addAttrs(init.instantiate(), null)); + } + + /** + * Check whether + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * throws exceptions, if array of modification parameters is empty. Also ensures + * that true is returned. + */ + @Test + public void test_doMultipleModifications_EmptyModificationParams() { + var init = new DummyModifiableObjInitialiser(); + Assertions.assertTrue(init.addAttrs(init.instantiate(), new Object[] {})); + } + + /** + * Check whether + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * works for 1 proper modification parameter (passed via an array of size 1). + */ + @Test + public void test_doMultipleModifications_SingleModification_Success() { + var init = new DummyModifiableObjInitialiser(); + Assertions.assertTrue(init.addAttrs(init.instantiate(), new Object[] { 1 })); + } + + /** + * Check whether + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * works for 1 inappropriate modification parameter (passed via an array of size + * 1). + */ + @Test + public void test_doMultipleModifications_SingleModification_Failure() { + var init = new DummyModifiableObjInitialiser(); + Assertions.assertFalse(init.addAttrs(init.instantiate(), new Object[] { null })); + } + + /** + * Check whether + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * works for its intended use case (i.e. summarising multiple modification + * method calls) with proper parameters. + */ + @Test + public void test_doMultipleModifications_MultipleModifications_Success() { + var init = new DummyModifiableObjInitialiser(); + Assertions.assertTrue(init.addAttrs(init.instantiate(), new Object[] { 1, 2, 3 })); + } + + /** + * Check whether + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * successfully performs modifications till it fails. + */ + @Test + public void test_doMultipleModifications_MultipleModifications_LateFailure() { + var init = new DummyModifiableObjInitialiser(); + var obj = init.instantiate(); + var attr1 = Integer.valueOf(1); + var attr2 = Integer.valueOf(2); + + Assertions.assertFalse(init.addAttrs(obj, new Object[] { attr1, attr2, attr1 })); + var attrs = obj.getAttrs(); + Assertions.assertTrue(attrs.contains(attr1)); + Assertions.assertTrue(attrs.contains(attr2)); + Assertions.assertEquals(2, attrs.size()); + } + + /** + * Check whether + * {@link IInitialiser#doMultipleModifications(Object, Object[], java.util.function.BiFunction)} + * fails early, if a modification fails, which is neither performed at the start + * nor at the end. + */ + @Test + public void test_doMultipleModifications_MultipleModifications_FailEarly() { + var init = new DummyModifiableObjInitialiser(); + var obj = init.instantiate(); + var attr1 = Integer.valueOf(1); + var attr2 = Integer.valueOf(2); + + Assertions.assertFalse(init.addAttrs(obj, new Object[] { attr1, attr1, attr2 })); + var attrs = obj.getAttrs(); + Assertions.assertTrue(attrs.contains(attr1)); + Assertions.assertFalse(attrs.contains(attr2)); + Assertions.assertEquals(1, attrs.size()); + } + + /** + * Checks whether {@link IInitialiser#declaresModificationMethods(Class)} + * circumvents null pointer exceptions. + */ + @Test + public void test_DeclaresModificationMethods_NullClass() { + Class cls = null; + Assertions.assertFalse(IInitialiser.declaresModificationMethods(cls)); + } + + /** + * Checks whether {@link IInitialiser#declaresModificationMethods(IInitialiser)} + * circumvents null pointer exceptions. + */ + @Test + public void test_DeclaresModificationMethods_NullInitialiser() { + IInitialiser init = null; + Assertions.assertFalse(IInitialiser.declaresModificationMethods(init)); + } + + /** + * Check whether a modification method implemented only in the interface of an + * initialiser can be found. + */ + @Test + public void test_DeclaresModificationMethods_InInterface() { + var init = new DummyObjOneInitialiser(); + Assertions.assertFalse(init.declaresModificationMethods()); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(init)); + Assertions.assertTrue(IInitialiser.declaresModificationMethods(IDummyObjOneInitialiser.class)); + } + + /** + * Check whether a modification method implemented only in the concrete class of + * an initialiser can be found. + */ + @Test + public void test_DeclaresModificationMethods_InClass() { + var init = new DummyObjTwoInitialiser(); + Assertions.assertTrue(init.declaresModificationMethods()); + Assertions.assertTrue(IInitialiser.declaresModificationMethods(init)); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(IDummyObjTwoInitialiser.class)); + } + + /** + * Check whether initialiser types with neither direct nor overridden methods + * cause exceptions. + */ + @Test + public void test_DeclaresModificationMethods_NoMethods() { + Assertions.assertFalse(IInitialiser.declaresModificationMethods(IDummyInitialiserWithoutMethods.class)); + } + + /** + * Check whether initialisers with only an overridden instantiate() method are + * detected as initialisers without modification methods. + */ + @Test + public void test_DeclaresModificationMethods_NoAdditionalMethods() { + var init = new DummyObjThreeInitialiser(); + Assertions.assertFalse(init.declaresModificationMethods()); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(init)); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(IDummyObjThreeInitialiser.class)); + } + + /** + * Check whether initialisers with no additional modification methods can be + * detected, even if they do have other methods. + */ + @Test + public void test_DeclaresModificationMethods_NoModificationMethods() { + var init = new DummyObjFourInitialiser(); + Assertions.assertFalse(init.declaresModificationMethods()); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(init)); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(IDummyObjFourInitialiser.class)); + } + + /** + * Check whether initialisers with no direct modification methods are detected, + * i.e. initialisers that do inherit modification methods yet do not implement + * any in their own body. + */ + @Test + public void test_DeclaresModificationMethods_NoDirectModificationMethods() { + var init = new DummyAlternateInitialiser(); + Assertions.assertFalse(init.declaresModificationMethods()); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(init)); + Assertions.assertFalse(IInitialiser.declaresModificationMethods(IDummyAlternateInitialiser.class)); + } + + /** + * Check whether initialiser types with neither direct nor overridden methods + * cause exceptions. + */ + @Test + public void test_IsInitialiserFor_NoMethods() { + Assertions.assertFalse( + IInitialiser.isInitialiserFor(IDummyInitialiserWithoutMethods.class, DummyNonTerminalObj.class)); + Assertions.assertFalse(IInitialiser.isInitialiserFor(IDummyInitialiserWithoutMethods.class, null)); + } + + /** + * Check whether an initialiser, whose name does not contain the name of the + * object class it is supposed to instantiate, is still detected as its + * initialiser, if it has a proper instantiation method. + */ + @Test + public void test_IsInitialiserFor_NameMismatch() { + Assertions.assertTrue(new DummyAlternateInitialiser().isInitialiserFor(DummyNonTerminalObj.class)); + Assertions + .assertTrue(IInitialiser.isInitialiserFor(IDummyAlternateInitialiser.class, DummyNonTerminalObj.class)); + } + + /** + * Checks whether {@link IInitialiser#isInitialiserFor(Class, Class)} + * circumvents null pointer exceptions, which could be caused by the first + * parameter being null. + */ + @Test + public void test_IsInitialiserFor_NullInitialiserClass() { + Class initCls = null; + Assertions.assertFalse(IInitialiser.isInitialiserFor(initCls, DummyNonTerminalObj.class)); + } + + /** + * Checks whether {@link IInitialiser#isInitialiserFor(IInitialiser, Class)} + * circumvents null pointer exceptions, which could be caused by the first + * parameter being null. + */ + @Test + public void test_IsInitialiserFor_NullInitialiser() { + IInitialiser init = null; + Assertions.assertFalse(IInitialiser.isInitialiserFor(init, DummyNonTerminalObj.class)); + } + + /** + * Checks whether isInitialiserFor methods circumvent null pointer exceptions, + * which could be caused by the class object parameter being null. + */ + @Test + public void test_IsInitialiserFor_NullClass() { + Class cls = null; + + Assertions.assertFalse(IInitialiser.isInitialiserFor(new DummyObjOneInitialiser(), cls)); + Assertions.assertFalse(IInitialiser.isInitialiserFor(DummyObjOneInitialiser.class, cls)); + Assertions.assertFalse(new DummyObjOneInitialiser().isInitialiserFor(cls)); + } + + /** + * Check whether initialisers that are meant to instantiate certain objects can + * be detected, where the said objects (and their initialisers) have no type + * hierarchy. + */ + @SuppressWarnings("unchecked") + @Test + public void test_IsInitialiserFor_NoTypeHierarchy() { + var objClss = new Class[] { DummyObjOne.class, DummyObjTwo.class, DummyObjThree.class, DummyObjFour.class }; + var initInterfaceClss = new Class[] { IDummyObjOneInitialiser.class, IDummyObjTwoInitialiser.class, + IDummyObjThreeInitialiser.class, IDummyObjFourInitialiser.class }; + var initClss = new Class[] { DummyObjOneInitialiser.class, DummyObjTwoInitialiser.class, + DummyObjThreeInitialiser.class, DummyObjFourInitialiser.class }; + var inits = new IInitialiser[] { new DummyObjOneInitialiser(), new DummyObjTwoInitialiser(), + new DummyObjThreeInitialiser(), new DummyObjFourInitialiser() }; + + // Test over all the classes given above, in order to make sure that + // other methods implemented in the classes/interfaces do not cause issues + for (int i = 0; i < objClss.length; i++) { + var cInitInterfaceCls = initInterfaceClss[i]; + var cInitClss = initClss[i]; + var cInit = inits[i]; + + for (int j = 0; j < objClss.length; j++) { + var cObjCls = objClss[j]; + + Assertions.assertEquals(i == j, cInit.isInitialiserFor(cObjCls)); + Assertions.assertEquals(i == j, IInitialiser.isInitialiserFor(cInit, cObjCls)); + Assertions.assertEquals(i == j, IInitialiser.isInitialiserFor(cInitClss, cObjCls)); + Assertions.assertEquals(i == j, IInitialiser.isInitialiserFor(cInitInterfaceCls, cObjCls)); + } + } + } + + /** + * Check whether initialisers within a type hierarchy are correctly matched to + * the object class they are supposed to instantiate. + */ + @Test + public void test_IsInitialiserFor_WithTypeHierarchy() { + var tlInit = new DummyTopLevelObjInitialiser(); + var ntInit = new DummyNonTerminalObjInitialiser(); + var tInit = new DummyTerminalObjInitialiser(); + + Assertions.assertFalse(tlInit.isInitialiserFor(DummyTerminalObj.class)); + Assertions.assertFalse(tlInit.isInitialiserFor(DummyNonTerminalObj.class)); + Assertions.assertTrue(tlInit.isInitialiserFor(DummyTopLevelObj.class)); + + Assertions.assertFalse(ntInit.isInitialiserFor(DummyTerminalObj.class)); + Assertions.assertTrue(ntInit.isInitialiserFor(DummyNonTerminalObj.class)); + Assertions.assertFalse(ntInit.isInitialiserFor(DummyTopLevelObj.class)); + + Assertions.assertTrue(tInit.isInitialiserFor(DummyTerminalObj.class)); + Assertions.assertFalse(tInit.isInitialiserFor(DummyNonTerminalObj.class)); + Assertions.assertFalse(tInit.isInitialiserFor(DummyTopLevelObj.class)); + + } +} From 427e7bdad7c7b0da8a25ec9415a126176b9806c3 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:31:49 +0200 Subject: [PATCH 46/87] Add tests for initialiser adaptation --- .../tests/InitialiserBaseTests.java | 446 ++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserBaseTests.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserBaseTests.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserBaseTests.java new file mode 100644 index 0000000000..d7d68d6135 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/InitialiserBaseTests.java @@ -0,0 +1,446 @@ +package cipm.consistency.initialisers.tests; + +import java.util.ArrayList; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.IInitialiserBase; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserA; +import cipm.consistency.initialisers.tests.dummy.packages.DummyInitialiserC; +import cipm.consistency.initialisers.tests.dummy.packages.ObjAInitStrat; +import cipm.consistency.initialisers.tests.dummy.packages.ObjCFirstInitStepStrat; +import cipm.consistency.initialisers.tests.dummy.packages.ObjCSecondInitStepStrat; + +/** + * Contains tests for {@link IInitialiserBase} over dummy elements, with a focus + * on the interaction with {@link IInitialiserAdapterStrategy}. + * + * @author Alp Torac Genc + */ +public class InitialiserBaseTests { + /** + * Shortcut for {@code assertAdapted(init, true)} + */ + private void assertAdapted(IInitialiserBase init) { + this.assertAdapted(init, true); + } + + /** + * Assert that the given initialiser is being adapted by at least one adaptation + * strategy. + */ + private void assertAdapted(IInitialiserBase init, boolean isAdapted) { + Assertions.assertEquals(init.getAdaptingStrategyCount(), init.getAdaptingStrategies().size()); + Assertions.assertEquals(isAdapted, init.isAdapted()); + Assertions.assertEquals(isAdapted, init.getAdaptingStrategyCount() > 0); + } + + /** + * Assert that all given adaptation strategies are adapting the given + * initialiser. + */ + private void assertAdaptedBy(IInitialiserAdapterStrategy[] strats, IInitialiserBase init) { + if (strats != null && strats.length > 0) { + var adaptingStrats = init.getAdaptingStrategies(); + Assertions.assertEquals(strats.length, adaptingStrats.size()); + this.assertAdapted(init); + for (var strat : strats) { + Assertions.assertTrue(adaptingStrats.contains(strat)); + } + } else { + this.assertAdapted(init, false); + } + } + + /** + * Add the given adaptation strategy to the given initialiser and make the + * necessary assertions before and after insertion. + */ + private void addAndAssertAdded(IInitialiserAdapterStrategy strat, IInitialiserBase init) { + var priorStrats = init.getAdaptingStrategies(); + Assertions.assertFalse(priorStrats.contains(strat)); + + var allStrats = new ArrayList(); + allStrats.addAll(priorStrats); + this.assertAdaptedBy(allStrats.toArray(IInitialiserAdapterStrategy[]::new), init); + + allStrats.add(strat); + init.addAdaptingStrategy(strat); + this.assertAdaptedBy(allStrats.toArray(IInitialiserAdapterStrategy[]::new), init); + + Assertions.assertEquals(priorStrats.size() + 1, init.getAdaptingStrategyCount()); + } + + /** + * Test adding a non-empty array of adaptation strategies to an initialiser + * during its construction. + */ + @Test + public void test_AddStrategiesToInitAtConstruction() { + var stratOne = new ObjCFirstInitStepStrat(); + var stratTwo = new ObjCSecondInitStepStrat(); + var stratArr = new IInitialiserAdapterStrategy[] { stratOne, stratTwo }; + + var init = new DummyInitialiserC(stratArr); + + this.assertAdaptedBy(stratArr, init); + } + + /** + * Test adding an empty array of adaptation strategies to an initialiser during + * its construction. + */ + @Test + public void test_AddStrategiesToInitAtConstruction_EmptyArray() { + var stratArr = new IInitialiserAdapterStrategy[] {}; + + var init = new DummyInitialiserC(stratArr); + + this.assertAdaptedBy(stratArr, init); + } + + /** + * Test adding a null array of adaptation strategies to an initialiser during + * its construction. + */ + @Test + public void test_AddStrategiesToInitAtConstruction_NullArray() { + var init = new DummyInitialiserC(null); + this.assertAdapted(init, false); + } + + /** + * Test adding adaptation strategies to an initialiser. Strategies are added one + * at a time. + */ + @Test + public void test_AddStrategy_OneAtATime() { + var init = new DummyInitialiserA(); + + this.assertAdapted(init, false); + + var stratOne = new ObjAInitStrat(); + init.addAdaptingStrategy(stratOne); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratOne }, init); + + var stratTwo = new ObjAInitStrat(); + init.addAdaptingStrategy(stratTwo); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratOne, stratTwo }, init); + } + + /** + * Test adding adaptation strategies to an initialiser. A strategy array is + * added to the initialiser. + */ + @Test + public void test_AddStrategy_StrategyArray() { + var init = new DummyInitialiserA(); + this.assertAdapted(init, false); + + var stratOne = new ObjAInitStrat(); + var stratTwo = new ObjAInitStrat(); + var stratArr = new IInitialiserAdapterStrategy[] { stratOne, stratTwo }; + + init.addAdaptingStrategies(stratArr); + this.assertAdaptedBy(stratArr, init); + } + + /** + * Test adding adaptation strategies to an initialiser. A strategy array with a + * null element is added to the initialiser. + */ + @Test + public void test_AddStrategy_StrategyArrayWithNull() { + var init = new DummyInitialiserA(); + this.assertAdapted(init, false); + + var stratOne = new ObjAInitStrat(); + var stratTwo = new ObjAInitStrat(); + var stratArr = new IInitialiserAdapterStrategy[] { stratOne, null, stratTwo }; + + init.addAdaptingStrategies(stratArr); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratOne, stratTwo }, init); + } + + /** + * Test adding an empty array of adaptation strategies to an initialiser. + */ + @Test + public void test_AddStrategy_EmptyArray() { + var init = new DummyInitialiserA(); + this.assertAdapted(init, false); + + var stratArr = new IInitialiserAdapterStrategy[] {}; + + init.addAdaptingStrategies(stratArr); + this.assertAdapted(init, false); + } + + /** + * Test adding a null array (of adaptation strategies) to an initialiser. + */ + @Test + public void test_AddStrategy_NullArray() { + var init = new DummyInitialiserA(); + this.assertAdapted(init, false); + + init.addAdaptingStrategies(null); + this.assertAdapted(init, false); + } + + /** + * Test removing (existing) adaptation strategies from an initialiser. + */ + @Test + public void test_RemoveAdapterStrategy() { + var init = new DummyInitialiserA(); + var stratOne = new ObjAInitStrat(); + var stratTwo = new ObjAInitStrat(); + init.addAdaptingStrategy(stratOne); + init.addAdaptingStrategy(stratTwo); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratOne, stratTwo }, init); + + init.removeAdaptingStrategy(stratOne); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratTwo }, init); + + init.removeAdaptingStrategy(stratTwo); + this.assertAdaptedBy(null, init); + } + + /** + * Test removing a non-existent adaptation strategy from an initialiser. + */ + @Test + public void test_RemoveAdapterStrategy_NonExistent() { + var init = new DummyInitialiserA(); + var strat = new ObjAInitStrat(); + + this.assertAdapted(init, false); + init.removeAdaptingStrategy(strat); + this.assertAdapted(init, false); + } + + /** + * Test removing a non-existent adaptation strategy from an initialiser. + */ + @Test + public void test_RemoveAdapterStrategy_NullCheck() { + var init = new DummyInitialiserA(); + + this.assertAdapted(init, false); + init.removeAdaptingStrategy(null); + this.assertAdapted(init, false); + } + + /** + * Test removing an existing adaptation strategy from an initialiser twice. + */ + @Test + public void test_RemoveAdapterStrategy_Twice() { + var init = new DummyInitialiserA(); + var stratOne = new ObjAInitStrat(); + var stratTwo = new ObjAInitStrat(); + init.addAdaptingStrategy(stratOne); + init.addAdaptingStrategy(stratTwo); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratOne, stratTwo }, init); + + init.removeAdaptingStrategy(stratOne); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratTwo }, init); + var stratsAfterFirstRemoval = init.getAdaptingStrategies(); + + init.removeAdaptingStrategy(stratOne); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratTwo }, init); + + // Make sure that all other adapting initialisers are still there after the + // second removal attempt + Assertions.assertTrue(init.getAdaptingStrategies().containsAll(stratsAfterFirstRemoval)); + } + + /** + * Test cleaning all adaptation strategies from an initialiser, i.e. removing + * all such strategies at once. + */ + @Test + public void test_CleanAdapterStrategy() { + var init = new DummyInitialiserA(); + var stratOne = new ObjAInitStrat(); + var stratTwo = new ObjAInitStrat(); + init.addAdaptingStrategy(stratOne); + init.addAdaptingStrategy(stratTwo); + this.assertAdaptedBy(new IInitialiserAdapterStrategy[] { stratOne, stratTwo }, init); + + init.cleanAdaptingStrategy(); + this.assertAdapted(init, false); + } + + /** + * Test new initialiser creation with adapting strategies, where the original + * initialiser has no adapting strategies. + */ + @Test + public void test_NewInitialiserWithStrategy_NoStrategies() { + var init = new DummyInitialiserC(); + this.assertAdapted(init, false); + var newInit = init.newInitialiserWithStrategies(); + this.assertAdapted(newInit, false); + + Assertions.assertFalse(init == newInit); + } + + /** + * Test new initialiser creation with adapting strategies. + */ + @Test + public void test_NewInitialiserWithStrategy() { + var init = new DummyInitialiserC(); + var stratOne = new ObjCFirstInitStepStrat(); + var stratTwo = new ObjCSecondInitStepStrat(); + + this.addAndAssertAdded(stratOne, init); + this.addAndAssertAdded(stratTwo, init); + this.assertAdapted(init, true); + + var newInit = init.newInitialiserWithStrategies(); + this.assertAdapted(newInit, true); + + Assertions.assertFalse(init == newInit); + Assertions.assertFalse(newInit.getAdaptingStrategies().contains(stratOne)); + Assertions.assertFalse(newInit.getAdaptingStrategies().contains(stratTwo)); + } + + /** + * Test new initialiser creation without adapting strategies, even though the + * original initialiser has adapting strategies. + */ + @Test + public void test_NewInitialiser_WithStrategies() { + var init = new DummyInitialiserC(); + var stratOne = new ObjCFirstInitStepStrat(); + var stratTwo = new ObjCSecondInitStepStrat(); + + this.addAndAssertAdded(stratOne, init); + this.addAndAssertAdded(stratTwo, init); + this.assertAdapted(init, true); + + var newInit = init.newInitialiser(); + this.assertAdapted(newInit, false); + + Assertions.assertFalse(init == newInit); + } + + /** + * Test initialising an object generated from an initialiser without adapting + * it. + */ + @Test + public void test_Initialisation_WithoutStrategy() { + var init = new DummyInitialiserC(); + var obj = init.instantiate(); + this.assertAdapted(init, false); + // No initialisation steps to fail here, so true + Assertions.assertTrue(init.initialise(obj)); + + Assertions.assertFalse(obj.isInitialisationStepOneDone()); + Assertions.assertFalse(obj.isInitialisationStepTwoDone()); + } + + /** + * Test initialising an object generated from an initialiser without adapting it + * all the way. + */ + @Test + public void test_SingleInitialisation_PartialSuccess() { + var init = new DummyInitialiserC(); + var obj = init.instantiate(); + + this.addAndAssertAdded(new ObjCFirstInitStepStrat(), init); + Assertions.assertTrue(init.initialise(obj)); + Assertions.assertTrue(obj.isInitialisationStepOneDone()); + Assertions.assertFalse(obj.isInitialisationStepTwoDone()); + } + + /** + * Test initialising an object generated from an initialiser with a failing + * adaptation strategy. + */ + @Test + public void test_SingleInitialisation_Failure() { + var init = new DummyInitialiserC(); + var obj = init.instantiate(); + + this.addAndAssertAdded(new ObjCFirstInitStepStrat(false), init); + Assertions.assertFalse(init.initialise(obj)); + Assertions.assertFalse(obj.isInitialisationStepOneDone()); + Assertions.assertFalse(obj.isInitialisationStepTwoDone()); + } + + /** + * Test initialising an object generated from an adapted initialiser, where the + * first adaptation strategy succeeds but the second one fails. + */ + @Test + public void test_SingleInitialisation_LateConflict() { + var init = new DummyInitialiserC(); + var obj = init.instantiate(); + + this.addAndAssertAdded(new ObjCFirstInitStepStrat(), init); + this.addAndAssertAdded(new ObjCSecondInitStepStrat(false), init); + Assertions.assertFalse(init.initialise(obj)); + Assertions.assertTrue(obj.isInitialisationStepOneDone()); + Assertions.assertFalse(obj.isInitialisationStepTwoDone()); + } + + /** + * Test initialising an object generated from an adapted initialiser, where the + * first adaptation strategy fails and stops the second one from working, even + * though the second one would succeed. + */ + @Test + public void test_SingleInitialisation_FailEarlyAtConflict() { + var init = new DummyInitialiserC(); + var obj = init.instantiate(); + + this.addAndAssertAdded(new ObjCFirstInitStepStrat(false), init); + this.addAndAssertAdded(new ObjCFirstInitStepStrat(), init); + Assertions.assertFalse(init.initialise(obj)); + Assertions.assertFalse(obj.isInitialisationStepOneDone()); + Assertions.assertFalse(obj.isInitialisationStepTwoDone()); + } + + /** + * Test initialising an object generated from a properly adapted initialiser. + */ + @Test + public void test_SingleInitialisation_AtOnce() { + var init = new DummyInitialiserC(); + var obj = init.instantiate(); + + this.addAndAssertAdded(new ObjCFirstInitStepStrat(), init); + this.addAndAssertAdded(new ObjCSecondInitStepStrat(), init); + Assertions.assertTrue(init.initialise(obj)); + Assertions.assertTrue(obj.isInitialisationStepOneDone()); + Assertions.assertTrue(obj.isInitialisationStepTwoDone()); + } + + /** + * Test initialising an object generated from an initialiser but add necessary + * adaptation strategies over multiple steps. + */ + @Test + public void test_MultipleInitialisations() { + var init = new DummyInitialiserC(); + var obj = init.instantiate(); + + this.addAndAssertAdded(new ObjCFirstInitStepStrat(), init); + Assertions.assertTrue(init.initialise(obj)); + Assertions.assertTrue(obj.isInitialisationStepOneDone()); + Assertions.assertFalse(obj.isInitialisationStepTwoDone()); + + this.addAndAssertAdded(new ObjCSecondInitStepStrat(), init); + Assertions.assertTrue(init.initialise(obj)); + Assertions.assertTrue(obj.isInitialisationStepOneDone()); + Assertions.assertTrue(obj.isInitialisationStepTwoDone()); + } +} From 32eb7cd9f488f32bc00d8080cb33b972708e6448 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Fri, 25 Oct 2024 18:31:58 +0200 Subject: [PATCH 47/87] Add package commentary --- .../cipm/consistency/initialisers/tests/package-info.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/package-info.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/package-info.java new file mode 100644 index 0000000000..87d99130a4 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/tests/package-info.java @@ -0,0 +1,8 @@ +/** + * Contains tests for top level {@link IInitialiser} classes and interfaces. + *
+ *
+ * Concrete initialisers are not tested, since there are already mechanisms + * implemented in them to ensure that they do what they are meant to do. + */ +package cipm.consistency.initialisers.tests; \ No newline at end of file From d613e7457f8448ddc11469f9c66e8b8fcc185b59 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 18:03:52 +0100 Subject: [PATCH 48/87] Add missing IdentifierReferenceInitialiserAdapter --- ...IdentifierReferenceInitialiserAdapter.java | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/IdentifierReferenceInitialiserAdapter.java diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/IdentifierReferenceInitialiserAdapter.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/IdentifierReferenceInitialiserAdapter.java new file mode 100644 index 0000000000..728e009b53 --- /dev/null +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/initadapters/IdentifierReferenceInitialiserAdapter.java @@ -0,0 +1,76 @@ +package cipm.consistency.initialisers.jamopp.initadapters; + +import org.eclipse.emf.ecore.EObject; +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.references.IdentifierReference; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserAdapterStrategy; +import cipm.consistency.initialisers.jamopp.instantiations.ExplicitConstructorCallInitialiser; +import cipm.consistency.initialisers.jamopp.statements.ExpressionStatementInitialiser; + +/** + * An {@link IInitialiserAdapterStrategy} implementation that can be used with + * {@link IInitialiserBase} implementors that instantiate + * {@link IdentifierReference}.
+ *
+ * Let IR be an {@link IdentifierReference} instance. + * {@link IdentifierReferenceInitialiserAdapter} then nests an uninitialised + * {@link ExpressionStatement} es instance within an uninitialised + * {@link ExplicitConstructorCall} ecc instance and sets IR's + * container to ecc. This way, IR will have a container, which is + * neither of type {@link Expression} nor {@link ArraySelector} (i.e. an + * eligible container).
+ *
+ * Note: IR's eligible container will be es. + * + * @author Alp Torac Genc + */ +public class IdentifierReferenceInitialiserAdapter implements IInitialiserAdapterStrategy { + + /** + * Realises the functionality of + * {@code JaMoPPElementUtil.getFirstContainerNotOfGivenType(...)} + */ + private EObject getFirstEligibleContainer(EObject obj) { + var firstEligibleContainer = obj.eContainer(); + + while (firstEligibleContainer != null) { + if (Expression.class.isAssignableFrom(firstEligibleContainer.getClass()) + || ArraySelector.class.isAssignableFrom(firstEligibleContainer.getClass())) { + firstEligibleContainer = firstEligibleContainer.eContainer(); + } else { + break; + } + } + + return firstEligibleContainer; + } + + @Override + public boolean apply(IInitialiser init, Object obj) { + var castedO = (IdentifierReference) obj; + + var firstEligibleContainer = this.getFirstEligibleContainer(castedO); + + if (firstEligibleContainer == null) { + var insInit = new ExplicitConstructorCallInitialiser(); + var ecc = insInit.instantiate(); + insInit.addArgument(ecc, castedO); + + var esInit = new ExpressionStatementInitialiser(); + var es = esInit.instantiate(); + esInit.setExpression(es, ecc); + + return this.getFirstEligibleContainer(castedO) == es; + } + + return this.getFirstEligibleContainer(castedO) != null; + } + + @Override + public IInitialiserAdapterStrategy newStrategy() { + return new IdentifierReferenceInitialiserAdapter(); + } +} From 445879c1bdd81c4cb924bf1f24259eb9b9d45444 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Mon, 10 Feb 2025 14:53:25 +0100 Subject: [PATCH 49/87] Change JUnit dependencies Use the same JUnit related dependencies as vsum tests Add JUnit Argument dependencies as well --- .../cipm.consistency.initialisers/META-INF/MANIFEST.MF | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF b/commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF index 217185e3c3..3645675d6f 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/META-INF/MANIFEST.MF @@ -5,8 +5,9 @@ Bundle-SymbolicName: cipm.consistency.initialisers Bundle-Version: 1.0.0.qualifier Automatic-Module-Name: cipm.consistency.initialisers Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.junit, - org.junit.jupiter.api, +Require-Bundle: junit-jupiter-api, + junit-jupiter-engine, + junit-jupiter-params, org.apache.log4j, org.eclipse.emf.ecore, org.emftext.language.java From b4c9e15424da5317d0077fdf0c4737eed8041ff5 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Tue, 4 Feb 2025 17:32:05 +0100 Subject: [PATCH 50/87] Fix return value of float/double literal initialisers --- .../jamopp/literals/IDecimalDoubleLiteralInitialiser.java | 2 +- .../jamopp/literals/IDecimalFloatLiteralInitialiser.java | 2 +- .../jamopp/literals/IHexDoubleLiteralInitialiser.java | 2 +- .../jamopp/literals/IHexFloatLiteralInitialiser.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java index f96d324f62..dea8c21f53 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalDoubleLiteralInitialiser.java @@ -8,6 +8,6 @@ public interface IDecimalDoubleLiteralInitialiser extends IDoubleLiteralInitiali public default boolean setDecimalValue(DecimalDoubleLiteral ddl, double val) { ddl.setDecimalValue(val); - return ddl.getDecimalValue() == val; + return ddl.getDecimalValue() == val || (Double.isNaN(ddl.getDecimalValue()) && Double.isNaN(val)); } } diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java index dce2edba88..46bb8d0ab1 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IDecimalFloatLiteralInitialiser.java @@ -8,6 +8,6 @@ public interface IDecimalFloatLiteralInitialiser extends IFloatLiteralInitialise public default boolean setDecimalValue(DecimalFloatLiteral dfl, float val) { dfl.setDecimalValue(val); - return dfl.getDecimalValue() == val; + return dfl.getDecimalValue() == val || (Float.isNaN(dfl.getDecimalValue()) && Float.isNaN(val)); } } diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java index 7d40b01fd9..43c564b3e8 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexDoubleLiteralInitialiser.java @@ -8,6 +8,6 @@ public interface IHexDoubleLiteralInitialiser extends IDoubleLiteralInitialiser public default boolean setHexValue(HexDoubleLiteral hdl, double val) { hdl.setHexValue(val); - return hdl.getHexValue() == val; + return hdl.getHexValue() == val || (Double.isNaN(hdl.getHexValue()) && Double.isNaN(val)); } } diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java index 36318bcca6..29ef53192e 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/literals/IHexFloatLiteralInitialiser.java @@ -8,6 +8,6 @@ public interface IHexFloatLiteralInitialiser extends IFloatLiteralInitialiser { public default boolean setHexValue(HexFloatLiteral hdl, float val) { hdl.setHexValue(val); - return hdl.getHexValue() == val; + return hdl.getHexValue() == val || (Float.isNaN(hdl.getHexValue()) && Float.isNaN(val)); } } From 78d6d8843147bda09374240c2b373b256445c3ab Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Tue, 4 Feb 2025 17:36:29 +0100 Subject: [PATCH 51/87] Add utility method to initialisers Use the utility method in isInitialiserFor to retrieve the type of object they instantiate. Added to spare code duplication in tests --- .../consistency/initialisers/IInitialiser.java | 15 ++++++++++++++- .../initialisers/eobject/IEObjectInitialiser.java | 13 +++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java index 59f67ad167..534de34a31 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java @@ -169,7 +169,20 @@ public static boolean isInitialiserFor(Class initCls, Cl * extracted from init. Returns false, if any parameter is null. */ public static boolean isInitialiserFor(IInitialiser init, Class objClass) { - return init != null && objClass != null && isInitialiserFor(init.getClass(), objClass); + return init != null && init.getInstanceClassOfInitialiser().equals(objClass); + } + + /** + * Uses the return value of {@link #instantiate()} to determine the outcome. + * This method should not return null, as long as {@link #instantiate()} does + * not return null. + * + * @return The {@link Class} object of the type this initialiser instantiates, + * or null if {@link #instantiate()} returns null. + */ + public default Class getInstanceClassOfInitialiser() { + var obj = this.instantiate(); + return obj != null ? obj.getClass() : null; } /** diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java index 50bfb2c59c..84f03c8ace 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/eobject/IEObjectInitialiser.java @@ -26,4 +26,17 @@ public interface IEObjectInitialiser extends IInitialiser { @Override public IEObjectInitialiser newInitialiser(); + + /** + * {@inheritDoc} + * + * @return The instance class associated with the EClass of the return value of + * {@link #instantiate()}, or null if the said method returns null. + */ + @SuppressWarnings("unchecked") + @Override + public default Class getInstanceClassOfInitialiser() { + var obj = this.instantiate(); + return obj != null ? (Class) obj.eClass().getInstanceClass() : null; + } } From 8c629bfa1d7fab83f177064c297aa52b7c33d947 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Tue, 4 Feb 2025 17:40:31 +0100 Subject: [PATCH 52/87] Add hardcoded expected initialiser count in order to make sure that the tests are working as intended. Computing and determining this dynamically can lead to misleading results. It is better to synchronise initialiser counts upon adding new initialisers, since adding new initialisers is not expected to be common. --- .../jamopp/utiltests/UtilityTests.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java index 2b0de86add..59e0bec3b4 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java @@ -59,6 +59,25 @@ public Collection getAllFiles() { return this.getAllFiles(root); } + /** + * The expected amount of concrete initialiser types.
+ *
+ * Note: Must be adapted, if new initialisers are added, which have concrete + * implementations. + */ + private int getExpectedConcreteInitialiserCount() { + return 181; + } + + /** + * The expected amount of initialiser types (abstract or concrete).
+ *
+ * Note: Must be adapted, if new initialisers are added. + */ + private int getExpectedInitialiserCount() { + return 274; + } + /** * Prints all interface types from {@link #getAllPossibleJaMoPPEObjectTypes()}. *
@@ -81,7 +100,9 @@ public void printFullHierarchy() { @Test public void testAllConcreteInitialisersRegistered() { var clss = this.getAllConcreteInitialiserCandidates(); + Assertions.assertEquals(this.getExpectedConcreteInitialiserCount(), clss.size()); var registeredInits = this.getAllInitialiserInstances(); + Assertions.assertEquals(this.getExpectedConcreteInitialiserCount(), registeredInits.size()); var matches = List.of( clss.stream().filter((cls) -> registeredInits.stream().anyMatch((init) -> init.isInitialiserFor(cls))) @@ -105,7 +126,9 @@ public void testAllConcreteInitialisersRegistered() { @Test public void testAllInitialiserInterfacesRegistered() { var clss = this.getAllInitialiserCandidates(); + Assertions.assertEquals(this.getExpectedInitialiserCount(), clss.size()); var registeredInits = this.getAllInitialiserInterfaceTypes(); + Assertions.assertEquals(this.getExpectedInitialiserCount(), registeredInits.size()); var matches = List.of(clss.stream() .filter((cls) -> registeredInits.stream() @@ -133,6 +156,7 @@ public void testAllInitialiserInterfacesRegistered() { @Test public void testAllConcreteInitialisersPresent() { var intfcs = this.getAllConcreteInitialiserCandidates(); + Assertions.assertEquals(this.getExpectedConcreteInitialiserCount(), intfcs.size()); var files = this.getAllFiles(); var matches = List.of(intfcs.stream().filter( @@ -161,6 +185,7 @@ public void testAllConcreteInitialisersPresent() { @Test public void testAllInitialiserInterfacesPresent() { var intfcs = this.getAllInitialiserCandidates(); + Assertions.assertEquals(this.getExpectedInitialiserCount(), intfcs.size()); var files = this.getAllFiles(); var matches = List.of(intfcs.stream().filter( From a3b9416feb82c7f0653704eddfd2be943face525 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Tue, 4 Feb 2025 17:48:05 +0100 Subject: [PATCH 53/87] Remove redundant methods --- .../consistency/initialisers/IInitialiserUtilityTest.java | 6 ------ .../initialisers/jamopp/utiltests/UtilityTests.java | 3 +-- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java index 49f972ef63..763f0f2c00 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserUtilityTest.java @@ -16,12 +16,6 @@ * @author Alp Torac Genc */ public interface IInitialiserUtilityTest { - - /** - * @return A list of all files under the root directory. - */ - public Collection getAllFiles(); - /** * @return The {@link IInitialiserPackage} that will be used within the utility * test. diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java index 59e0bec3b4..7ef4411b58 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/utiltests/UtilityTests.java @@ -54,8 +54,7 @@ public IInitialiserPackage getUsedInitialiserPackage() { return new JaMoPPInitialiserPackage(); } - @Override - public Collection getAllFiles() { + private Collection getAllFiles() { return this.getAllFiles(root); } From 6d2adb2fa1dcba4aa4d95e5972c8ee524f138cbb Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Tue, 4 Feb 2025 17:53:47 +0100 Subject: [PATCH 54/87] Use EObject methods in JaMoPPHelper to retrieve types, which should have a (concrete) initialiser. Although using the suffix each implementation has ("Impl") is possible, having a dynamic way of separating such types is more desirable. --- .../jamopp/IJaMoPPUtilityTest.java | 8 +- .../initialisers/jamopp/JaMoPPHelper.java | 178 ++++++++++++++---- 2 files changed, 147 insertions(+), 39 deletions(-) diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java index 534bdcc371..0fcbe86451 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/IJaMoPPUtilityTest.java @@ -3,6 +3,8 @@ import java.util.Collection; import java.util.Set; +import org.eclipse.emf.ecore.EObject; + import cipm.consistency.initialisers.eobject.IEObjectUtilityTest; /** @@ -22,21 +24,21 @@ public default JaMoPPHelper getJaMoPPHelper() { /** * {@link JaMoPPHelper#getAllPossibleTypes()} */ - public default Set> getAllPossibleJaMoPPEObjectTypes() { + public default Set> getAllPossibleJaMoPPEObjectTypes() { return this.getJaMoPPHelper().getAllPossibleTypes(); } /** * {@link JaMoPPHelper#getAllInitialiserCandidates()} */ - public default Collection> getAllInitialiserCandidates() { + public default Collection> getAllInitialiserCandidates() { return this.getJaMoPPHelper().getAllInitialiserCandidates(); } /** * {@link JaMoPPHelper#getAllConcreteInitialiserCandidates()} */ - public default Collection> getAllConcreteInitialiserCandidates() { + public default Collection> getAllConcreteInitialiserCandidates() { return this.getJaMoPPHelper().getAllConcreteInitialiserCandidates(); } } diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java index b13a715e8a..8d4149b6dc 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/jamopp/JaMoPPHelper.java @@ -1,14 +1,17 @@ package cipm.consistency.initialisers.jamopp; +import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; -import java.util.List; import java.util.Set; +import java.util.function.Predicate; import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.emftext.language.java.JavaPackage; -import org.emftext.language.java.commons.Commentable; /** * A utility class that provides information about EObjects used by JaMoPP, as @@ -21,19 +24,129 @@ * @author Alp Torac Genc */ public class JaMoPPHelper { + /** + * A variant of {@link #getAllClasses(Predicate)} with no given predicate. + */ + public Collection> getAllClasses() { + return this.getAllClasses(null); + } + + /** + * If the given predicate is null, does not filter the found types. + * + * @return All types accessible under the sub-packages of {@link JavaPackage} in + * form of {@link EClass}, whose instance class + * {@code eClass.getInstanceClass()} will be in the return value, which + * fulfill the given predicate. + */ + public Collection> getAllClasses(Predicate pred) { + var res = new ArrayList>(); + Predicate predToUse = pred != null ? pred : (a) -> true; + this.getAllEClasses().stream().filter(predToUse) + .forEach((eCls) -> res.add(this.getInstanceClassOfEClassifier(eCls))); + return res; + } /** - * The suffix used in the concrete implementation of EObject classes in JaMoPP. + * @return All {@link EClass}es accessible under the sub-packages of + * {@link JavaPackage}. */ - public String getImplSuffix() { - return "Impl"; + public Collection getAllEClasses() { + var res = new ArrayList(); + var ePacs = JavaPackage.eINSTANCE.getESubpackages(); + ePacs.forEach((pac) -> pac.getEClassifiers().stream().filter((eClsf) -> eClsf instanceof EClass) + .forEach((c) -> res.add((EClass) c))); + return res; + } + + protected Class getInstanceClassOfEObject(T obj) { + return this.getInstanceClassOfEClassifier(obj.eClass()); + } + + @SuppressWarnings("unchecked") + protected Class getInstanceClassOfEClassifier(EClassifier eClsfier) { + return (Class) eClsfier.getInstanceClass(); + } + + /** + * Finds the {@link EClass} corresponding to the given cls, whose instance class + * is equal to cls: {@code eCls.getInstanceClass().equals(cls)}. + * + * @param cls The type of the Java element, whose {@link EClass} will be + * returned, if cls is the type of a Java element. + * + * @return The {@link EClass} corresponding to the class represented by cls. + * Null, if no such {@link EClass} is found under {@link JavaPackage}. + */ + public EClass getEClassForJavaElement(Class cls) { + var ePacs = JavaPackage.eINSTANCE.getESubpackages(); + for (var ePac : ePacs) { + var eClss = ePac.getEClassifiers(); + for (var eCls : eClss) { + if (eCls.getInstanceClass().equals(cls)) { + return (EClass) eCls; + } + } + } + return null; + } + + /** + * Finds the {@link EClass} corresponding to the given cls, whose instance + * class' concrete type is equal to cls. + * + * @param cls The type of the concrete implementation of the Java element, whose + * corresponding {@link EClass} will be returned. + * + * @return The {@link EClass} corresponding to the interface type of cls. Null, + * if no such {@link EClass} is found under {@link JavaPackage}. Note + * that the returned {@link EClass} will be from the interface of cls. + * This means, if cls represents the type xImpl, the returned + * {@link EClass} will belong to x. + */ + public EClass getEClassForJavaElementImpl(Class cls) { + var interfaceType = this.getInterfaceTypeForJavaElementImpl(cls); + if (interfaceType != null) { + return this.getEClassForJavaElement(interfaceType); + } + return null; + } + + /** + * The interface {@code I} of the implementation of a Java element type + * {@code T} within JaMoPP is directly implemented by it and also contains its + * name, i.e.:
+ *
+ * T extends I directly and the simple name of T contains the simple name of I. + * T can neither be an interface nor abstract. + * + * @param The type of the passed parameter. Used to allow making assumptions + * on the return value. + * @param cls The type of an implementation of a Java element within JaMoPP. + * @return The interface of cls matching the description from above, if it + * exists. Otherwise null. + */ + @SuppressWarnings("unchecked") + public Class getInterfaceTypeForJavaElementImpl(Class cls) { + if (cls.isInterface() || Modifier.isAbstract(cls.getModifiers())) { + return null; + } + + var directIfcs = cls.getInterfaces(); + for (var ifc : directIfcs) { + if (cls.getSimpleName().contains(ifc.getSimpleName())) { + return (Class) ifc; + } + } + + return null; } /** * @return Types of concrete implementations and interfaces of all Java-Model * elements. */ - public Set> getAllPossibleTypes() { + public Set> getAllPossibleTypes() { return this.getAllPossibleTypes(JavaPackage.eINSTANCE.getESubpackages()); } @@ -47,15 +160,15 @@ public Set> getAllPossibleTypes() { * sub-packages. Includes types of interfaces as well as concrete * implementation classes. */ - public Set> getAllPossibleTypes(EPackage cPac) { + public Set> getAllPossibleTypes(EPackage cPac) { var clss = cPac.getEClassifiers(); var subPacs = cPac.getESubpackages(); - var foundClss = new HashSet>(); + var foundClss = new HashSet>(); if (clss != null) { for (var cls : clss) { - foundClss.add(cls.getInstanceClass()); + foundClss.add(this.getInstanceClassOfEClassifier(cls)); /* * Although cls is technically of type EClassifier, it also implements EClass @@ -86,8 +199,8 @@ public Set> getAllPossibleTypes(EPackage cPac) { * implementation classes. * @see {@link #getAllPossibleTypes(EPackage)}} */ - public Set> getAllPossibleTypes(Collection pacs) { - var foundClss = new HashSet>(); + public Set> getAllPossibleTypes(Collection pacs) { + var foundClss = new HashSet>(); for (var pac : pacs) { foundClss.addAll(this.getAllPossibleTypes(pac)); @@ -97,36 +210,29 @@ public Set> getAllPossibleTypes(Collection pacs) { } /** - * Used to determine which EObject implementors should have an initialiser.
- *
- * Here, such implementors (initialiser candidates) implement - * {@link Commentable} and their names do not end with {@link #implSuffix}. + * Used to determine which EObject implementors should have an initialiser + * interface. * - * @return The classes from {@link #getAllPossibleTypes()}, which should have a - * corresponding initialiser interface. + * @return The class objects within {@link #getAllEClasses()} which should have + * a corresponding initialiser interface. Currently, all of them. */ - public Collection> getAllInitialiserCandidates() { - var fullHierarchy = getAllPossibleTypes(); - - var intfcs = fullHierarchy.stream().filter((c) -> Commentable.class.isAssignableFrom(c)) - .filter((c) -> !c.getSimpleName().endsWith(this.getImplSuffix())).toArray(Class[]::new); - - return List.of(intfcs); + public Collection> getAllInitialiserCandidates() { + var result = new ArrayList>(); + this.getAllEClasses().stream().forEach((e) -> result.add(this.getInstanceClassOfEClassifier(e))); + return result; } /** - * @return The EObject types from {@link #getAllPossibleTypes()}, which should - * have a corresponding concrete initialiser that can instantiate the - * said type. + * Used to determine which EObject implementors should have a concrete + * initialiser implementation. + * + * @return The class objects within {@link #getAllEClasses()} which should have + * a corresponding concrete initialiser implementation. */ - public Collection> getAllConcreteInitialiserCandidates() { - var fullHierarchy = getAllPossibleTypes(); - - var intfcs = fullHierarchy.stream().filter((c) -> Commentable.class.isAssignableFrom(c)) - .filter((c) -> fullHierarchy.stream() - .anyMatch((c2) -> c2.getSimpleName().equals(c.getSimpleName() + this.getImplSuffix()))) - .toArray(Class[]::new); - - return List.of(intfcs); + public Collection> getAllConcreteInitialiserCandidates() { + var result = new ArrayList>(); + this.getAllEClasses().stream().filter((e) -> !e.isAbstract()) + .forEach((e) -> result.add(this.getInstanceClassOfEClassifier(e))); + return result; } } From 83188d2bdb4d15eca5ec2bb9ff42235e3c437908 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Tue, 4 Feb 2025 17:54:36 +0100 Subject: [PATCH 55/87] Edit commentary --- .../initialisers/IInitialiser.java | 39 +++++++++++++++---- .../IInitialiserAdapterStrategy.java | 5 ++- .../initialisers/IInitialiserBase.java | 8 +++- .../initialisers/IInitialiserPackage.java | 24 ++++++++---- .../initialisers/package-info.java | 15 ++++--- 5 files changed, 65 insertions(+), 26 deletions(-) diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java index 534de34a31..b038a1ea01 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiser.java @@ -38,7 +38,9 @@ * overriding behaviour easier, since default methods can be overridden in * interfaces. If initialisation of the designated objects is complex, consider * realising it in form of initialiser adaptation strategies (see the links - * below).
+ * below). Note that calling {@link #initialise(Object)} in addition to + * {@link #instantiate()} is necessary for the said initialiser strategies to be + * used.
*
* This interface also contains some static utility methods. * @@ -48,16 +50,27 @@ */ public interface IInitialiser { /** - * Can be used to create a (deep) copy of this. + * Can be used to create a copy of this.
+ *
+ * Note that the returned initialiser will not have the initialiser + * adaptation strategies this initialiser has. * * @return A fresh instance of this initialiser's class. + * + * @see {@link IInitialiserBase} + * @see {@link IInitialiserAdapterStrategy} */ public IInitialiser newInitialiser(); /** * Attempts to instantiate the class this {@link IInitialiser} is designated - * for. Depending on the returned object, additional initialisation may be - * necessary. + * for. Depending on the returned object, additional initialisation via + * {@link #initialise(Object)} may be necessary. Note that the said method must + * be called upon the return value, in order for the initialiser adaptation + * strategies to take effect. + * + * @see {@link IInitialiserBase} + * @see {@link IInitialiserAdapterStrategy} */ public Object instantiate(); @@ -65,9 +78,17 @@ public interface IInitialiser { * Attempts to initialise obj, so that it is "valid".
*
* It is recommended to only use this method where necessary, as it may - * introduce additional modifications that are not obvious from outside. + * introduce additional modifications that are not obvious from outside. The + * said modifications originate from initialiser adaptation strategies and they + * will not take effect, unless this method is called upon the object created + * via {@link #instantiate()}. * * @param obj The object that will be made valid + * + * @return Whether the initialisation of obj was successful. + * + * @see {@link IInitialiserBase} + * @see {@link IInitialiserAdapterStrategy} */ public boolean initialise(Object obj); @@ -165,8 +186,12 @@ public static boolean isInitialiserFor(Class initCls, Cl } /** - * A variant of {@link #isInitialiserFor(Class, Class)}, where initCls is - * extracted from init. Returns false, if any parameter is null. + * Returns whether the given initialiser init instantiates objects of type + * objClass.
+ *
+ * For the result to be true, init has to be able to instantiate + * exactly objClass, i.e. the return type of the instantiation + * method has to be exactly objClass. */ public static boolean isInitialiserFor(IInitialiser init, Class objClass) { return init != null && init.getInstanceClassOfInitialiser().equals(objClass); diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java index 480e88777c..32df15d328 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserAdapterStrategy.java @@ -16,9 +16,10 @@ public interface IInitialiserAdapterStrategy { /** * Applies the initialisation logic contained in this instance to the given - * object. + * object. Check the concrete class' documentation for more information, since + * the semantics of this method is tightly coupled with it. * - * @return Whether the method did what it was supposed to do. + * @return Whether this method did what it was supposed to do. */ public boolean apply(IInitialiser init, Object obj); diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java index d7629d4ac5..b821e99d7c 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserBase.java @@ -12,7 +12,7 @@ public interface IInitialiserBase extends IInitialiser { /** * Adds the given {@link IInitialiserAdapterStrategy} to this instance. Does not - * add null, if {@code strat == null}. + * add, if {@code strat == null}. */ public void addAdaptingStrategy(IInitialiserAdapterStrategy strat); @@ -69,6 +69,12 @@ public default boolean isAdapted() { * are meant to be used.
*
* {@inheritDoc} + * + * @return Whether all initialiser adaptation strategies in this were applied + * successfully. If there are no such strategies; returns true, since no + * strategy was attempted to be applied and failed. + * + * @see {@link IInitialiserAdapterStrategy} */ @Override public default boolean initialise(Object obj) { diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java index 9d1d64c5fd..84fcf6df64 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/IInitialiserPackage.java @@ -18,10 +18,11 @@ */ public interface IInitialiserPackage { /** - * @return {@link IInitialiser} instances that are contained in this instance. + * @return A freshly created instance of each {@link IInitialiser} sub-type, + * which this encompasses. * * @see {@link #getAllInitialiserInstances()} for all such initialisers that are - * accessible from this. + * accessible from sub-packages as well as this. */ public default Collection getInitialiserInstances() { return this.initCol(); @@ -29,7 +30,8 @@ public default Collection getInitialiserInstances() { /** * @return Class objects of {@link IInitialiser} types that are contained in - * this instance. + * this instance. Note that the returned types are not necessarily + * concrete, i.e. they can be interfaces and/or abstract classes. * * @see {@link #getAllInitialiserInterfaceTypes()} for all such initialiser * types that are accessible from this. @@ -39,13 +41,16 @@ public default Collection> getInitialiserInterface } /** - * @return All {@link IInitialiserPackage} instances nested in this. + * @return All {@link IInitialiserPackage} instances nested in this, i.e. the + * sub-packages of this. */ public default Collection getSubPackages() { return this.initCol(); } /** + * Meant to be used only by {@link IInitialiserPackage} implementors. + * * @return An empty collection that will be used to store objects of type T. */ public default Collection initCol() { @@ -53,6 +58,8 @@ public default Collection initCol() { } /** + * Meant to be used only by {@link IInitialiserPackage} implementors.
+ *
* A variant of {@link #initCol()} that also adds the given elems to the created * collection. * @@ -75,7 +82,7 @@ public default Collection initCol(T[] elems) { * @return All {@link IInitialiserPackage} instances accessible from this. * * @see {@link #getSubPackages()} for initialiser packages that are contained in - * this. + * this directly. */ public default Collection getAllSubPackages() { var result = this.getSubPackages(); @@ -91,10 +98,11 @@ public default Collection getAllSubPackages() { * Recursively discovers all nested {@link IInitialiserPackage} instances * reachable from this instance. * - * @return All {@link IInitialiser} instances accessible from this. + * @return Freshly created {@link IInitialiser} instances for each initialiser + * accessible from this. * * @see {@link #getInitialiserInstances()} for initialiser instances that are - * contained in this. + * contained in this directly. */ public default Collection getAllInitialiserInstances() { var result = this.getInitialiserInstances(); @@ -113,7 +121,7 @@ public default Collection getAllInitialiserInstances() { * @return All initialiser types that are accessible from this. * * @see {@link #getInitialiserInterfaceTypes()} for initialiser types that are - * contained in this. + * contained in this directly. */ public default Collection> getAllInitialiserInterfaceTypes() { var result = this.getInitialiserInterfaceTypes(); diff --git a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java index 5dadf2e394..6904c86108 100644 --- a/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java +++ b/commit-based-cipm/initialisers/cipm.consistency.initialisers/src/cipm/consistency/initialisers/package-info.java @@ -3,7 +3,12 @@ * {@link cipm.consistency.initialisers.IInitialiser} as well as for classes * that can be used to adapt them. Also has an interface * {@link cipm.consistency.initialisers.IInitialiserPackage}, which can be - * implemented to access initialiser types and instances easier.
+ * implemented to access initialiser types and instances easier. + * {@link cipm.consistency.initialisers.IInitialiserPackage} defines a nestable + * structure that enables finding the proper initialisers as well as certain + * groups of initialisers. It is recommended to implement that interface for + * each package containing initialisers and to add all initialisers to that + * implementation.
*
* Initialisers are classes/interfaces, whose purpose is to instantiate, * initialise and modify certain objects. Implementing initialisers similar to @@ -20,12 +25,6 @@ * cause of such exceptions is initialisers not setting the required attributes * while instantiating objects. In such cases, the said adapters can be used to * have them set those attributes, so that using the instances in tests do not - * throw exceptions, due to their essential attributes not being set.
- *
- * {@link cipm.consistency.initialisers.IInitialiserPackage} defines a nestable - * structure that enables finding the proper initialisers as well as certain - * groups of initialisers. It is recommended to implement that interface for - * each package containing initialisers and to add all initialisers to that - * implementation. + * throw exceptions, due to their essential attributes not being set. */ package cipm.consistency.initialisers; \ No newline at end of file From 5bff56e9755c874a03ad8747e0d4185e02cbf9c6 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 18:50:03 +0100 Subject: [PATCH 56/87] Create plug-in for first instance tests fitests --- .../cipm.consistency.fitests/.classpath | 11 ++++++++ .../cipm.consistency.fitests/.project | 28 +++++++++++++++++++ .../.settings/org.eclipse.jdt.core.prefs | 15 ++++++++++ .../META-INF/MANIFEST.MF | 21 ++++++++++++++ .../cipm.consistency.fitests/build.properties | 4 +++ 5 files changed, 79 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/.classpath create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/.project create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/.settings/org.eclipse.jdt.core.prefs create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/build.properties diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/.classpath b/commit-based-cipm/fi-tests/cipm.consistency.fitests/.classpath new file mode 100644 index 0000000000..f0d0c735ff --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/.project b/commit-based-cipm/fi-tests/cipm.consistency.fitests/.project new file mode 100644 index 0000000000..5cc3244b6e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/.project @@ -0,0 +1,28 @@ + + + cipm.consistency.fitests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/.settings/org.eclipse.jdt.core.prefs b/commit-based-cipm/fi-tests/cipm.consistency.fitests/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..cd8d089a19 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=11 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +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=disabled +org.eclipse.jdt.core.compiler.source=11 diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF b/commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..2d5f43ff4c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF @@ -0,0 +1,21 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: cipm.consistency.fitests +Bundle-SymbolicName: cipm.consistency.fitests +Bundle-Version: 1.0.0.qualifier +Automatic-Module-Name: cipm.consistency.fitests +Bundle-RequiredExecutionEnvironment: JavaSE-11 +Require-Bundle: org.junit, + org.junit.jupiter.api, + org.junit.jupiter.params, + org.eclipse.emf.common, + org.eclipse.emf.ecore, + org.eclipse.emf.compare, + org.eclipse.emf.ecore.xmi, + org.splevo.jamopp.diffing, + org.apache.log4j, + org.emftext.language.java, + jamopp.parser.jdt.singlefile, + jamopp.parser, + cipm.consistency.commitintegration.diff.util, + cipm.consistency.initialisers diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/build.properties b/commit-based-cipm/fi-tests/cipm.consistency.fitests/build.properties new file mode 100644 index 0000000000..34d2e4d2da --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . From 5f5a929085bfbbf65c6e65f8c665b0d042082859 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 18:52:11 +0100 Subject: [PATCH 57/87] Add interface to adapt similarity checking mechanisms --- .../ISimilarityCheckerContainer.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/ISimilarityCheckerContainer.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/ISimilarityCheckerContainer.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/ISimilarityCheckerContainer.java new file mode 100644 index 0000000000..a9ccffab2c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/ISimilarityCheckerContainer.java @@ -0,0 +1,46 @@ +package cipm.consistency.fitests.similarity; + +import java.util.Collection; + +/** + * An interface meant to be implemented by classes that store the similarity + * checker under test, in order to spare other test classes the need to add that + * similarity checker as a dependency.
+ *
+ * This interface contains dependencies to neither similarity checker interfaces + * nor to concrete implementations, because doing so would reduce the + * re-usability.
+ *
+ * The underlying similarity checking mechanism(s) can be reset by using the + * {@link #newSimilarityChecker()} method. The similarity checking mechanism(s) + * are not automatically re-created upon calling similarity checking methods in + * this interface, because it might be desirable to keep using them. + * + * @author Alp Torac Genc + */ +public interface ISimilarityCheckerContainer { + /** + * If there are no similarity checking mechanism(s) present, this method creates + * and sets them up. Otherwise, replaces the currently stored similarity + * checking mechanism(s) with new ones.
+ *
+ * The similarity checking mechanism(s) are not automatically re-created upon + * calling similarity checking methods, because it might be desirable to keep + * using the existing similarity checking mechanism(s). + */ + public void newSimilarityChecker(); + + /** + * Delegates similarity checking to the similarity checking mechanism(s) within. + * Calls {@link #newSimilarityChecker()} beforehand, if there are no similarity + * checking mechanism(s) present. + */ + public Boolean isSimilar(Object element1, Object element2); + + /** + * Delegates similarity checking to the similarity checking mechanism(s) within. + * Calls {@link #newSimilarityChecker()} beforehand, if there are no similarity + * checking mechanism(s) present. + */ + public Boolean areSimilar(Collection elements1, Collection elements2); +} From 700a1701c08ac27c916d1568de41216b3e1cd358 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 18:52:49 +0100 Subject: [PATCH 58/87] Add abstract class for similarity checking tests --- .../similarity/AbstractSimilarityTest.java | 212 ++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/AbstractSimilarityTest.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/AbstractSimilarityTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/AbstractSimilarityTest.java new file mode 100644 index 0000000000..93f9781b9d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/AbstractSimilarityTest.java @@ -0,0 +1,212 @@ +package cipm.consistency.fitests.similarity; + +import java.util.Collection; + +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInfo; + +/** + * An abstract class for similarity checking tests to extend.
+ *
+ * Contains methods that provide information on the next test method to be run + * and various delegation methods that spare call chains. + * + * @author Alp Torac Genc + */ +public abstract class AbstractSimilarityTest { + /** + * @see {@link #getSCC()} + */ + private ISimilarityCheckerContainer scc; + /** + * @see {@link #getCurrentTestInfo()} + */ + private TestInfo currentTestInfo; + + /** + * Sets up the necessary variables before tests are run. The {@link TestInfo} + * parameter is included, so that test-specific set up can be performed.
+ *
+ * It is suggested to have a call to {@code super.setUp()} as the FIRST + * statement in overriding implementations. Doing so circumvents potential + * errors caused by the order of set up operations. + * + * @param info An object that contains information about the current test to be + * run (ex: the test method instance, test class, ...) + */ + @BeforeEach + public void setUp(TestInfo info) { + this.setTestInfo(info); + + this.setUpLogger(); + + this.setSCC(this.initSCC()); + } + + /** + * Cleans up the variables set up with {@link #setUp(TestInfo)} and performs + * other necessary clean up operations.
+ *
+ * It is suggested to have a call to {@code super.tearDown()} as the LAST + * statement in overriding implementations. Doing so circumvents potential + * errors caused by the order of clean up operations. + */ + @AfterEach + public void tearDown() { + this.cleanUpSCC(); + this.cleanUpTestInfo(); + } + + /** + * Sets the {@link TestInfo} belonging to the currently running test method to + * null. Used by {@link #tearDown()}, in order to make sure that the underlying + * {@link TestInfo} does not get carried over. + */ + protected void cleanUpTestInfo() { + this.currentTestInfo = null; + } + + /** + * Sets the information object belonging to the currently running test method. + */ + protected void setTestInfo(TestInfo info) { + this.currentTestInfo = info; + } + + /** + * Provides the implementors access to the underlying + * {@link ISimilarityCheckerContainer} (SCC). + * + * @return The {@link ISimilarityCheckerContainer} (SCC) that will be used to + * store the similarity checker under test. + */ + protected ISimilarityCheckerContainer getSCC() { + return this.scc; + } + + /** + * Sets the used {@link ISimilarityCheckerContainer} to null. Used by + * {@link #tearDown()}, in order to ensure that each test method starts with a + * fresh {@link ISimilarityCheckerContainer}. + */ + protected void cleanUpSCC() { + this.scc = null; + } + + /** + * @return An object that contains information on the currently running test. + */ + protected TestInfo getCurrentTestInfo() { + return this.currentTestInfo; + } + + /** + * @param info An object that contains information on a test. + * + * @return The name of the test method, to whom the info parameter belongs. + * Returns an empty String, if info is null or info does not contain a + * test method. + */ + private String getCurrentTestMethodName(TestInfo info) { + if (info != null) { + var met = info.getTestMethod().orElseGet(() -> null); + + if (met != null) { + return met.getName(); + } + } + + return ""; + } + + /** + * @return The logger of the current test class. + */ + protected Logger getLogger() { + return Logger.getLogger("cipm." + this.getClass().getSimpleName()); + } + + /** + * Prepares loggers.
+ *
+ * Enabling too many loggers (without limiting the console size) can cause + * Java memory issues. + */ + protected void setUpLogger() { + Logger logger = Logger.getLogger("cipm"); + logger.setLevel(Level.ALL); + + // Enable to receive log messages from similarity switches + // logger = Logger.getLogger("javaswitch"); + // logger.setLevel(Level.ALL); + + // logger = Logger.getLogger("jamopp"); + // logger.setLevel(Level.ALL); + logger = Logger.getRootLogger(); + logger.removeAllAppenders(); + ConsoleAppender ap = new ConsoleAppender(new PatternLayout("[%d{DATE}] %-5p: %c - %m%n"), + ConsoleAppender.SYSTEM_OUT); + logger.addAppender(ap); + } + + /** + * Creates the concrete {@link ISimilarityCheckerContainer} that will be used to + * store the similarity checker under test.
+ *
+ * If necessary, it can be overridden in tests to change the said similarity + * checker during set up. + */ + protected abstract ISimilarityCheckerContainer initSCC(); + + /** + * Sets the used {@link ISimilarityCheckerContainer} to the given one.
+ *
+ * If necessary, it can be called in tests to change the used similarity checker + * container to the given one. + * + * @see {@link #initSCC()} for setting the {@link ISimilarityCheckerContainer} + * during set up. + */ + protected void setSCC(ISimilarityCheckerContainer scc) { + this.scc = scc; + } + + /** + * Delegates similarity checking to the underlying + * {@link ISimilarityCheckerContainer}. + */ + public Boolean isSimilar(Object element1, Object element2) { + return this.getSCC().isSimilar(element1, element2); + } + + /** + * Delegates similarity checking to the underlying + * {@link ISimilarityCheckerContainer}. + */ + public Boolean areSimilar(Collection elements1, Collection elements2) { + return this.getSCC().areSimilar(elements1, elements2); + } + + /** + * @return The prefix of the {@link Resource} file names created from within the + * current test class. Defaults to the name of the current test class. + * + * @see {@link #getResourceFileName()} + */ + public String getCurrentTestClassName() { + return this.getClass().getSimpleName(); + } + + /** + * @return The name of the currently running test method + */ + public String getCurrentTestMethodName() { + return this.getCurrentTestMethodName(this.getCurrentTestInfo()); + } + +} \ No newline at end of file From 8539cd41301bc5f5c03f7cead424c676c3528158 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 18:55:55 +0100 Subject: [PATCH 59/87] Add helper class for Resource operations --- .../similarity/eobject/ResourceHelper.java | 285 ++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/ResourceHelper.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/ResourceHelper.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/ResourceHelper.java new file mode 100644 index 0000000000..b9c0b86103 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/ResourceHelper.java @@ -0,0 +1,285 @@ +package cipm.consistency.fitests.similarity.eobject; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.log4j.Logger; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; + +/** + * A class that encapsulates the means to create {@link Resource} instances. + * + * @author Alp Torac Genc + */ +public class ResourceHelper { + private static final Logger LOGGER = Logger.getLogger("cipm." + ResourceHelper.class.getSimpleName()); + + /** + * The directory, where the created {@link Resource} instances will be stored, + * if they are saved. + */ + private String resourceSaveRootPath; + + /** + * The extension of {@link Resource} files, if they are saved. + */ + private String resourceFileExtension; + + /** + * The map that keeps track of the mapping inserted into + * {@link Resource.Factory.Registry}. Can be used to clean such mappings from + * the registry at the end of tests. + */ + private Map registryMappings = new HashMap(); + + /** + * The list of created {@link Resource} instances. Can be used to perform clean + * up after tests. + */ + private List createdResources = new ArrayList(); + + /** + * @return The {@link Logger} that can be used to log happenings in this + * instance. + */ + protected Logger getLogger() { + return LOGGER; + } + + /** + * Creates and returns a {@link Resource} instance, whose URI will be the given + * one.
+ *
+ * Does not save the created {@link Resource} instance. + */ + protected Resource initResource(URI resUri) { + ResourceSet rSet = new ResourceSetImpl(); + return rSet.createResource(resUri); + } + + /** + * Sets the directory, where the created {@link Resource} instances will be + * stored, if they are saved. + */ + public void setResourceSaveRootPath(String resourceSaveRootPath) { + this.resourceSaveRootPath = resourceSaveRootPath; + } + + /** + * Sets the extension of {@link Resource} files, if they are saved. + */ + public void setResourceFileExtension(String resourceFileExtension) { + this.removeFromRegistry(this.resourceFileExtension); + this.resourceFileExtension = resourceFileExtension; + this.setResourceRegistry(); + } + + /** + * @return The extension of the {@link Resource} files. + */ + public String getResourceFileExtension() { + return this.resourceFileExtension; + } + + /** + * @return The directory, where the created {@link Resource} instances will be + * stored, if they are saved. + */ + public String getResourceSaveRootPath() { + return resourceSaveRootPath; + } + + /** + * Complements {@link #getResourceSaveRootPath()} with the {@link Resource} file + * name and extension. The said file will only be created, if the + * {@link Resource} file is saved. + * + * @param resourceFileName The name of the file + * @param resourceFileExtension The extension of the file + * @return The {@link URI} for a {@link Resource} instance. + */ + protected URI createURI(String resourceFileName, String resourceFileExtension) { + return URI.createFileURI( + this.getResourceSaveRootPath() + File.separator + resourceFileName + "." + resourceFileExtension); + } + + /** + * The variant of {@link #createURI(String, String)}, which uses + * {@link #getResourceFileExtension()}. + */ + protected URI createURI(String resourceName) { + return this.createURI(resourceName, this.getResourceFileExtension()); + } + + /** + * @return The name of the {@link Resource} file with the count parameter added + * to it. + */ + protected String getResourceNameWithCount(String resourceName, int count) { + return resourceName + "-" + count; + } + + /** + * @return Computes a unique name for the {@link Resource} file, so that it is + * not overwritten if another resource file with the same name is to be + * created. + */ + protected String computeEffectiveResourceName(String resourceName) { + var resourceRoot = new File(this.getResourceSaveRootPath()); + + var count = 0; + + if (resourceRoot.exists()) { + var files = List.of( + List.of(resourceRoot.listFiles()).stream().map((file) -> file.getName()).toArray(String[]::new)); + + while (files.contains(this.getResourceNameWithCount(resourceName, count))) { + count++; + } + } + + return this.getResourceNameWithCount(resourceName, count); + } + + /** + * Creates a {@link Resource} instance for the given EObject instances. The + * Resource instances created with this method are tracked, so that they can be + * deleted later if necessary.
+ *
+ * !!! IMPORTANT !!!
+ *
+ * Using this method will cause the logger to log an error message, if some + * of the EObject instances (from eos) that are already in a Resource instance + * are attempted to be placed into another Resource. This should be avoided, + * since doing so will REMOVE the said EObject instances from their former + * Resource and cause side effects in tests. + */ + public Resource createResource(Collection eos, String resourceName) { + Resource res = this.initResource(this.createURI(this.computeEffectiveResourceName(resourceName))); + this.createdResources.add(res); + + if (eos != null) { + for (var eo : eos) { + + /* + * Make sure to not add an EObject, which has already been added to a Resource, + * to another Resource. Doing so will detach it from its former Resource and add + * it to the second one. + */ + if (eo.eResource() != null) { + this.getLogger().error("An EObject's resource was set and shifted during resource creation"); + } + res.getContents().add(eo); + } + } + + return res; + } + + /** + * Puts the necessary mapping for saving {@link Resource} files with the given + * file extension into {@link Resource.Factory.Registry}. The entry is also + * tracked so that it can be deleted later, if necessary. + */ + protected void setResourceRegistry() { + var resFileExtension = this.getResourceFileExtension(); + var fac = new XMIResourceFactoryImpl(); + + this.registryMappings.put(resFileExtension, fac); + Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(resFileExtension, fac); + } + + /** + * Unloads the given {@link Resource} instance. + */ + public void unloadResource(Resource res) { + res.unload(); + } + + /** + * Unloads and deletes all created {@link Resource} instances, if they are + * created with {@link #createResource(Collection)}. Stops tracking them as + * well. + */ + public void cleanAllResources() { + this.createdResources.forEach((r) -> { + this.unloadResource(r); + + try { + r.delete(null); + } catch (IOException e) { + this.getLogger().debug("Resource either was not created as a file or has already been deleted: " + + r.getURI().toString()); + } + }); + + this.createdResources.clear(); + } + + /** + * Deletes the directory that contains all {@link Resource} instances, if it is + * empty. + */ + public void deleteResourceDir() { + new File(this.getResourceSaveRootPath()).delete(); + } + + /** + * Removes the entry matching to the given {@code resourceFileExtension} from + * the resource factory, if it was added by this instance. Stops tracking the + * said entry. + */ + protected void removeFromRegistry(String resourceFileExtension) { + if (resourceFileExtension == null) + return; + + var reg = Resource.Factory.Registry.INSTANCE; + var regMap = reg.getExtensionToFactoryMap(); + + if (regMap.containsKey(resourceFileExtension)) { + var val = regMap.get(resourceFileExtension); + + if (this.registryMappings.containsKey(resourceFileExtension)) { + var valTracked = this.registryMappings.get(resourceFileExtension); + + if (val.equals(valTracked)) { + regMap.remove(val); + this.registryMappings.remove(valTracked); + } + } + } + } + + /** + * Cleans the mapping(s) in {@link Resource.Factory.Registry} inserted by + * {@link #setResourceRegistry(String)}. Stops tracking them as well. + */ + protected void cleanRegistry() { + Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE; + + for (var key : this.registryMappings.keySet()) { + reg.getExtensionToFactoryMap().remove(key); + } + + this.registryMappings.clear(); + } + + /** + * Cleans up the saved attributes and created {@link Resource} files. + */ + public void clean() { + this.cleanRegistry(); + this.cleanAllResources(); + this.deleteResourceDir(); + } +} From 9c606a4e5e22358faceda7b94e7e98ea2a081cbb Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 18:57:57 +0100 Subject: [PATCH 60/87] Add helper class for EcoreUtil Serves as a facade to some EcoreUtil methods Provides the means to clone EObject instances along with their container --- .../similarity/eobject/EcoreUtilHelper.java | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/EcoreUtilHelper.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/EcoreUtilHelper.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/EcoreUtilHelper.java new file mode 100644 index 0000000000..2aa29faefa --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/EcoreUtilHelper.java @@ -0,0 +1,114 @@ +package cipm.consistency.fitests.similarity.eobject; + +import java.util.Collection; +import java.util.List; + +import org.apache.log4j.Logger; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.util.EcoreUtil; + +/** + * A helper class that contains utility methods for {@link EObject}. This class + * encapsulates such methods, so that other classes can spare dependencies to + * various {@link EObject} related packages.
+ *
+ * Methods in this class include various cloning methods for {@link EObject} + * instances. Furthermore, there are methods that compare {@link EObject} + * instances at meta-metamodel level, without any other context (all their + * contents and attributes are checked). + * + * @author Alp Torac Genc + * @see {@link EcoreUtil} + */ +public class EcoreUtilHelper { + private final Logger LOGGER = Logger.getLogger("cipm." + EcoreUtilHelper.class.getSimpleName()); + + /** + * Creates a clone copy of the given obj and its contents.
+ *
+ * Note: DOES NOT clone the container {@code obj.eContainer()} of this + * object. Only copies the given object and the contents nested in it. + * + * @return A clone of obj without its container and clones of its contents. + * @see {@link EcoreUtil#copy(EObject)} + */ + public T cloneEObj(T obj) { + return EcoreUtil.copy(obj); + } + + /** + * Finds the topmost EObject (objTop) that can be reached from {@code obj}, + * clones objTop, finds the clone of {@code obj} among the contents of objTop + * and returns that clone. + * + * @return A clone of obj, which preserves obj's place in its hierarchy. The + * returned obj clone contains clones of original obj's contents. All + * objects containing obj are also implicitly cloned, so that obj + * clone's position (among object clones) matches to the original obj's + * position (among original objects). + * @see {@link EcoreUtil#copy(EObject)} + */ + @SuppressWarnings("unchecked") + public T cloneEObjWithContainers(T obj) { + if (obj.eContainer() == null) { + return this.cloneEObj(obj); + } + + EObject cObj = obj; + + while (cObj.eContainer() != null) { + cObj = cObj.eContainer(); + } + + EObject clone = this.cloneEObj(cObj); + var contents = clone.eAllContents(); + + while (contents.hasNext()) { + var cCloneObj = contents.next(); + if (this.getActualEquality(obj, cCloneObj)) { + return (T) cCloneObj; + } + } + + LOGGER.error("Cloning EObject with cloneEObjWithContainers failed"); + return null; + } + + /** + * Creates a clone copy of all given objs.
+ *
+ * Note: DOES NOT clone any containers {@code obj.eContainer()} of the + * objects. Only copies the given objects and the contents nested in them. + * + * @see {@link EcoreUtil#copyAll(Collection)} + */ + public Collection cloneEObjList(Collection objs) { + return EcoreUtil.copyAll(objs); + } + + /** + * Computes the equality of two {@link EObject} instances using + * {@link EcoreUtil}.
+ *
+ * Note: The equality here is not necessarily the same as similarity checking + * that is being tested. This form of equality is much stricter than similarity, + * since there might be some differences in attributes and/or nested content, + * which are irrelevant for similarity in certain cases. + */ + public boolean getActualEquality(EObject elem1, EObject elem2) { + return EcoreUtil.equals(elem1, elem2); + } + + /** + * Computes the equality of two lists of {@link EObject} using + * {@link EcoreUtil}.
+ *
+ * Note: The equality here is not necessarily the same as similarity checking + * that is being tested. This form of equality is much stricter than similarity, + * since there might be some differences in attributes and/or nested content, + * which are irrelevant for similarity in certain cases. + */ + public boolean getActualEquality(List elems1, List elems2) { + return EcoreUtil.equals(elems1, elems2); + } +} From 10f59c52e48fddecc32aabd7ef29c42adb81be02 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 18:59:32 +0100 Subject: [PATCH 61/87] Extend AbstractSimilarityTest for tests that work with Resource instances --- .../AbstractResourceSimilarityTest.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractResourceSimilarityTest.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractResourceSimilarityTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractResourceSimilarityTest.java new file mode 100644 index 0000000000..eb045fdeca --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractResourceSimilarityTest.java @@ -0,0 +1,102 @@ +package cipm.consistency.fitests.similarity.eobject; + +import java.util.Collection; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInfo; + +import cipm.consistency.fitests.similarity.AbstractSimilarityTest; + +/** + * An abstract class that extends {@link AbstractSimilarityTest} with additional + * methods regarding {@link Resource} instance creation. + * + * @author Alp Torac Genc + */ +public abstract class AbstractResourceSimilarityTest extends AbstractSimilarityTest { + /** + * @see {@link #getResourceHelper()} + */ + private ResourceHelper resHelper; + + @BeforeEach + @Override + public void setUp(TestInfo info) { + super.setUp(info); + + this.setResourceHelper(new ResourceHelper()); + + this.getResourceHelper().setResourceSaveRootPath(this.getAbsoluteResourceRootPath()); + this.getResourceHelper().setResourceFileExtension(this.getResourceFileExtension()); + } + + @AfterEach + @Override + public void tearDown() { + this.getResourceHelper().clean(); + this.cleanUpResourceHelper(); + + super.tearDown(); + } + + /** + * Sets the used {@link ResourceHelper} to null, in order to ensure that each + * test method has a fresh instance. + */ + protected void cleanUpResourceHelper() { + this.resHelper = null; + } + + /** + * Sets up the {@link ResourceHelper} instance that will be used with the given + * one. + */ + protected void setResourceHelper(ResourceHelper resHelper) { + this.resHelper = resHelper; + } + + /** + * The {@link ResourceHelper} instance that can be used for creating + * {@link Resource} instances. + */ + protected ResourceHelper getResourceHelper() { + return this.resHelper; + } + + /** + * Delegates the creation of a {@link Resource} instance to the underlying + * {@link ResourceHelper}.
+ *
+ * The name of the {@link Resource} instance will be the return value of + * {@link #getResourceFileName()}. + * + * @return A {@link Resource} instance with the given contents + */ + protected Resource createResource(Collection eos) { + return this.getResourceHelper().createResource(eos, this.getResourceFileName()); + } + + /** + * Uses the currently run test class and method to compute a name for the file + * of the {@link Resource} instance, should it be saved. + * + * @return A name for the file of the {@link Resource} instance. + */ + public String getResourceFileName() { + return this.getCurrentTestClassName() + "_" + this.getCurrentTestMethodName(); + } + + /** + * @return The absolute path, under which the {@link Resource} files will be + * saved. + */ + public abstract String getAbsoluteResourceRootPath(); + + /** + * @return The extension of the {@link Resource} files, if they are saved. + */ + public abstract String getResourceFileExtension(); +} From f33e06a38f7e4706967bd14be78fb6a50e0c32c9 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:01:45 +0100 Subject: [PATCH 62/87] Add an interface for storing expected similarity values Implementors of this interface can be used by tests to have centralised access to various expected similarity checking results. --- .../similarity/params/ISimilarityValues.java | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/ISimilarityValues.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/ISimilarityValues.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/ISimilarityValues.java new file mode 100644 index 0000000000..227a8b1f37 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/ISimilarityValues.java @@ -0,0 +1,169 @@ +package cipm.consistency.fitests.similarity.params; + +/** + * An interface for classes that contain expected similarity checking results + * for (class object, attribute object) pairs. An attribute object denotes an + * attribute within a class, rather than the value of an attribute.
+ *
+ * Variations of {@link #addSimilarityEntry(Class, Object, Boolean)} can be used + * to group entries better, while adding them. + * + * @see {@link #addSimilarityEntry(Class, Object, Boolean)} for more information + * on adding entries. + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking values. + * + * @author Alp Torac Genc + */ +public interface ISimilarityValues { + /** + * A variant of {@link #addSimilarityEntry(Class, Object, Boolean)}, where + * objCls is extracted from attr. + * + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking result. + * + * @see {@link #addSimilarityEntry(Class, Object, Boolean)} + */ + public void addSimilarityEntry(Object attr, Boolean expectedSimResult); + + /** + * Adds the (objCls, attr) pair, along with their expected similarity checking + * value to this instance. + * + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking result and which entry is chosen, if + * entries for super/sub-types of objCls exist. + * + * @see {@link #addSimilarityEntry(Class[], Object, Boolean)} + * @see {@link #addSimilarityEntry(Class[], Object[], Boolean[])} + */ + public void addSimilarityEntry(Class objCls, Object attr, Boolean expectedSimResult); + + /** + * A variant of {@link #addSimilarityEntry(Class, Object, Boolean)} for an array + * of class objects.
+ *
+ * Let + * {@code objClsArr = [cls1, cls2, ..., clsN], attr = a1, expectedSimResults = true}. + * Then this method is equivalent to: + *
    + *
  • addSimilarityEntry(cls1, a1, true) + *
  • addSimilarityEntry(cls2, a1, true) + *
  • ... + *
  • addSimilarityEntry(clsN, a1, true) + *
+ * + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking result. + * + * @see {@link #addSimilarityEntry(Class, Object, Boolean)} + * @see {@link #addSimilarityEntry(Class[], Object[], Boolean[])} + */ + public default void addSimilarityEntry(Class[] objClsArr, Object attr, Boolean expectedSimResult) { + if (objClsArr != null) { + for (var cls : objClsArr) { + this.addSimilarityEntry(cls, attr, expectedSimResult); + } + } + } + + /** + * A variant of {@link #addSimilarityEntry(Class, Object, Boolean)}.
+ *
+ * Combines objClsArr with (attrArr[i], expectedSimResults[i]) for all i:
+ *
+ * Let + * {@code objClsArr = [cls1, cls2, cls3], attrArr = [a1, a2], expectedSimResults = [true, false]}. + * Then this method is equivalent to: + *
    + *
  • addSimilarityEntry(objClsArr, a1, true) + *
  • addSimilarityEntry(objClsArr, a2, false) + *
+ * + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking result. + * + * @see {@link #addSimilarityEntry(Class[], Object, Boolean)} + * @see {@link #addSimilarityEntry(Class, Object, Boolean)} + */ + public default void addSimilarityEntry(Class[] objClsArr, Object[] attrArr, Boolean[] expectedSimResults) { + if (attrArr == null || expectedSimResults == null || objClsArr == null) { + return; + } + + if (attrArr.length != expectedSimResults.length) { + return; + } + + for (int i = 0; i < attrArr.length; i++) { + var attr = attrArr[i]; + var simRes = expectedSimResults[i]; + this.addSimilarityEntry(objClsArr, attr, simRes); + } + } + + /** + * Removes the (objCls, attr) pair from this instance. + * + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking result. + * + * @see {@link #addSimilarityEntry(Class, Object, Boolean)} + */ + public void removeSimilarityEntry(Class objCls, Object attr); + + /** + * Clears all entries stored in this instance.
+ *
+ * Resets this instance. + */ + public void clear(); + + /** + * Returns the expected result of similarity checking 2 object instances of the + * class objCls, where both are the same, except for their attribute attr. + * + * @return Let a and b be object instances of the same class, which are the + * same, except for their attr attribute, then: + *
    + *
  • True: Similarity checking a and b yields true, despite them being + * different regarding attr. + *
  • False: Similarity checking a and b yields false, as they have + * different attr. + *
  • Null: The result of similarity checking a and b is not defined, + * i.e. differences in attr play no decisive role. + *
+ * Note: If this instance does not have the entry for (objCls, attr), it + * checks whether there is an entry for a parent class parObjCls (of + * objCls) and attr (parObjCls, attr). If there is one such entry, the + * expected result of similarity checking for (parObjCls, attr) is + * returned. If there are still no matching entries, + * {@link #getDefaultSimilarityResult()} is returned. + */ + public Boolean getExpectedSimilarityResult(Class objCls, Object attr); + + /** + * A variant of {@link #getExpectedSimilarityResult(Class, Object)} that + * extracts objCls from attr. + * + * @see {@link #getExpectedSimilarityResult(Class, Object)} + */ + public Boolean getExpectedSimilarityResult(Object attr); + + /** + * Sets the default return value for + * {@link #getExpectedSimilarityResult(Class, Object)}, in cases where no + * entries for a given (objCls, attr) pair is found. + * + * @param defSimRes The default return value for + * {@link #getExpectedSimilarityResult(Class, Object)} + */ + public void setDefaultSimilarityResult(Boolean defSimRes); + + /** + * @return The default return value for + * {@link #getExpectedSimilarityResult(Class, Object)} + */ + public Boolean getDefaultSimilarityResult(); +} From 8f2912c82268dbf55c5613a95ad6a40b821b31d6 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:03:19 +0100 Subject: [PATCH 63/87] Add an abstract class for storing expected similarity values This abstract class, along with the interface it extends, provides the implementation of a storage for expected similarity values. --- .../params/AbstractSimilarityValues.java | 233 ++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/AbstractSimilarityValues.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/AbstractSimilarityValues.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/AbstractSimilarityValues.java new file mode 100644 index 0000000000..a1ce7a9069 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/AbstractSimilarityValues.java @@ -0,0 +1,233 @@ +package cipm.consistency.fitests.similarity.params; + +import java.util.HashMap; +import java.util.Map; + +/** + * An abstract class for classes to implement, which uses a {@link Map} to store + * mappings of (class object, attribute object) pairs to their expected + * similarity checking results. An attribute object denotes an attribute within + * a class (i.e. it serves as the identifier of the attribute), rather than the + * value of an attribute. + * + * @see {@link #addSimilarityEntry(Class, Object, Boolean)} for more information + * on adding entries. + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking results. + * + * @author Alp Torac Genc + */ +public abstract class AbstractSimilarityValues implements ISimilarityValues { + /** + * The expected similarity checking result for cases, where there is no matching + * {@link SimilarityEntry} in this instance. + * + * @see {@link #getExpectedSimilarityResult(Class, Object)} + */ + private Boolean defaultSimResult = null; + /** + * Maps {@link SimilarityEntry} to their expected similarity checking result. + * + * @see {@link #getExpectedSimilarityResult(Class, Object)} + */ + private Map similarityValues; + + /** + * Constructs an instance and initialises the internal data structure that + * stores expected similarity checking results. + * + * @see {@link #addSimilarityEntry(Class, Object, Boolean)} for more information + * on adding entries. + * @see {@link #getExpectedSimilarityResult(Class, Object)} for more information + * on expected similarity checking results. + */ + public AbstractSimilarityValues() { + this.similarityValues = this.initSimilarityValues(); + } + + /** + * @return Creates a {@link SimilarityEntry} with the given parameters. + */ + protected SimilarityEntry createEntry(Class objCls, Object attr) { + return new SimilarityEntry(objCls, attr); + } + + /** + * First, tries to find a direct match for the given parameters (see + * {@link #findDirectEntry(Class, Object)}). If there is no direct match, it + * relaxes objCls to super types of objCls and tries to find a match again (see + * {@link #findParentEntry(Class, Object)}). + * + * @param objCls The interface of the Object instance + * @param An attribute of the Object instance, which is the subject of the + * current similarity check + * @return The corresponding {@link SimilarityEntry} + */ + protected SimilarityEntry findEntry(Class objCls, Object attr) { + var directMatch = this.findDirectEntry(objCls, attr); + + return directMatch != null ? directMatch : this.findParentEntry(objCls, attr); + } + + /** + * Tries to find a directly matching entry (i.e. an entry with objCls-attr + * pair). Ignores entries belonging to super-types of objCls. + * + * @param objCls The interface of the Object instance + * @param attr An attribute of the Object instance, which is the subject of + * the current similarity check + * @return The corresponding {@link SimilarityEntry} + */ + protected SimilarityEntry findDirectEntry(Class objCls, Object attr) { + return this.similarityValues.keySet().stream() + .filter((se) -> se.getObjectClass().equals(objCls) && se.getAttribute().equals(attr)).findFirst() + .orElse(null); + } + + /** + * Tries to find an entry with a super-type of objCls using a depth-first + * recursion in the type hierarchy of objCls towards Object. If there is a + * direct entry (see {@link #findDirectEntry(Class, Object)}), returns it.
+ *
+ * + * @param objCls The interface of the Object instance + * @param attr An attribute of the Object instance, which is the subject of + * the current similarity check + * @return A corresponding {@link SimilarityEntry} + */ + protected SimilarityEntry findParentEntry(Class objCls, Object attr) { + var parents = objCls.getInterfaces(); + SimilarityEntry result = null; + + for (var p : parents) { + result = this.findDirectEntry(p, attr); + if (result != null) + return result; + + result = this.findParentEntry(p, attr); + if (result != null) + return result; + } + + return result; + } + + /** + * @return The map that will be used by this instance to store mappings of + * (object class, attribute object) pairs to their expected similarity + * value. + */ + protected Map initSimilarityValues() { + return new HashMap(); + } + + /** + * Adds the given {@link SimilarityEntry} along with its expected similarity + * result to this instance. + */ + protected void addEntry(SimilarityEntry se, Boolean expectedSimResult) { + this.similarityValues.put(se, expectedSimResult); + } + + @Override + public void addSimilarityEntry(Class objCls, Object attr, Boolean expectedSimResult) { + this.addEntry(this.createEntry(objCls, attr), expectedSimResult); + } + + @Override + public void removeSimilarityEntry(Class objCls, Object attr) { + var se = this.findEntry(objCls, attr); + + if (se != null) + this.similarityValues.remove(se); + } + + @Override + public Boolean getExpectedSimilarityResult(Class objCls, Object attr) { + var se = this.findEntry(objCls, attr); + + return se == null ? this.getDefaultSimilarityResult() : this.similarityValues.get(se); + } + + @Override + public void clear() { + this.similarityValues.clear(); + } + + @Override + public void setDefaultSimilarityResult(Boolean defSimRes) { + this.defaultSimResult = defSimRes; + } + + @Override + public Boolean getDefaultSimilarityResult() { + return this.defaultSimResult; + } + + /** + * Contains a class object and an attribute object of that class. An attribute + * object denotes an attribute within a class (i.e. it serves as the identifier + * of the attribute), rather than the value of an attribute. + * + * @author Alp Torac Genc + */ + protected class SimilarityEntry { + /** + * The class object. + */ + private final Class objCls; + /** + * An attribute object of {@link #objCls}. + */ + private final Object attr; + + /** + * @param objCls A class object + * @param attr An attribute object of {@link #objCls} + */ + private SimilarityEntry(Class objCls, Object attr) { + this.objCls = objCls; + this.attr = attr; + } + + /** + * @return The class object stored in this instance. + */ + public Class getObjectClass() { + return this.objCls; + } + + /** + * @return The attribute stored in this entry. + */ + public Object getAttribute() { + return this.attr; + } + + /** + * Compares two {@link SimilarityEntry} instances based on what they store. + */ + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + + if (obj == null || !(obj instanceof SimilarityEntry)) + return false; + + var castedO = (SimilarityEntry) obj; + + if (this.attr == null ^ castedO.attr == null) + return false; + + if (this.objCls == null ^ castedO.objCls == null) + return false; + + // Covers both members being null + if (this.attr == castedO.attr && this.objCls == castedO.objCls) + return true; + + return this.attr.equals(castedO.attr) && this.objCls.equals(castedO.objCls); + } + } +} From f6ca7660a906ba2a11022a2f3a3683637e4fc2ed Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:06:42 +0100 Subject: [PATCH 64/87] Implement an interface for adapting initialiser parameters Implementors of this interface encapsulate the means to adapt collections of initialisers. They can be used by parameterised tests to include adapted versions of initialisers. --- ...nitialiserParameterAdaptationStrategy.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameterAdaptationStrategy.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameterAdaptationStrategy.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameterAdaptationStrategy.java new file mode 100644 index 0000000000..edd3fbc23d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameterAdaptationStrategy.java @@ -0,0 +1,51 @@ +package cipm.consistency.fitests.similarity.params; + +import java.util.Collection; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserBase; + +/** + * An interface for classes that encapsulate the logic to adapt + * {@link IInitialiserBase} parameters for tests, so that the object instances + * they create conform certain requirements.
+ *
+ * Contains the means to adapt collections of {@link IInitialiser} instances and + * making necessary adaptations for convenience. + * + * @see {@link IInitialiserAdapterStrategy} + */ +public interface IInitialiserParameterAdaptationStrategy { + /** + * Adapts the given {@link IInitialiser} instances, if they can be adapted. + * + * @see {@link IInitialiserAdapterStrategy} + */ + public default void adaptInitialisers(Collection inits) { + inits.forEach((i) -> this.adaptInitialiser(i)); + } + + /** + * Adapts the given {@link IInitialiserBase} instances. + * + * @see {@link IInitialiserAdapterStrategy} + */ + public default void adaptAdaptableInitialisers(Collection inits) { + inits.forEach((i) -> this.adaptAdaptableInitialiser(i)); + } + + /** + * A variant of {@link #adaptAdaptableInitialiser(IInitialiserBase)} that adapts + * the given {@link IInitialiser} init, if init implements + * {@link IInitialiserBase}. + */ + public default void adaptInitialiser(IInitialiser init) { + if (init instanceof IInitialiserBase) + this.adaptAdaptableInitialiser((IInitialiserBase) init); + } + + /** + * Adapts the given {@link IInitialiserBase} instance. + */ + public void adaptAdaptableInitialiser(IInitialiserBase init); +} From 78961f30456b8b8bb88857db08a3eb7350988b80 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:08:09 +0100 Subject: [PATCH 65/87] Implement an interface to generate initialiser parameters Implementors of this interface can be used by parameterised tests as a source of initialisers. --- .../params/IInitialiserParameters.java | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameters.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameters.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameters.java new file mode 100644 index 0000000000..7dbc0db60f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/IInitialiserParameters.java @@ -0,0 +1,179 @@ +package cipm.consistency.fitests.similarity.params; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.function.Predicate; + +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.IInitialiserBase; +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * An interface meant for classes that generate {@link IInitialiser} instances + * for tests.
+ *
+ * Implementors of this interface can be used to supply parameterised tests with + * {@link IInitialiser} instances. + */ +public interface IInitialiserParameters { + /** + * @return The {@link IInitialiserPackage} that will be used to generate + * initialiser parameters for tests. + */ + public IInitialiserPackage getUsedInitialiserPackage(); + + /** + * @return An instance of all {@link IInitialiser}s this encompasses. The + * returned {@link IInitialiser}s are not adapted. + */ + public default Collection getAllNonAdaptedInitialisers() { + return this.getUsedInitialiserPackage().getAllInitialiserInstances(); + } + + /** + * @return An adapted instance of all adaptable initialisers this encompasses. + * Adaptation logic returned by {@link #getAdaptationStrategy()} is used + * to adapt the generated initialiser instances. Only returns + * initialisers that are adapted. + */ + public default Collection getAllAdaptedInitialisers() { + var result = new ArrayList(); + var inits = this.getEachInitialiserOnce(); + + inits.forEach((init) -> { + if (init instanceof IInitialiserBase && ((IInitialiserBase) init).isAdapted()) + result.add((IInitialiserBase) init); + }); + + return result; + } + + /** + * Shortcut for {@link #getAllNonAdaptedInitialisers()} and + * {@link #getAllAdaptedInitialisers()}.
+ *
+ * Note: If a certain initialiser type is adaptable, returns one non-adapted + * and one adapted instance. + * + * @see {@link #getEachInitialiserOnce()} + */ + public default Collection getAllInitialisers() { + var result = new ArrayList(); + result.addAll(this.getAllNonAdaptedInitialisers()); + result.addAll(this.getAllAdaptedInitialisers()); + return result; + } + + /** + * @return The {@link IInitialiserParameterAdaptationStrategy} responsible for + * adapting the generated initialisers for + * {@link #getAdaptedInitialisersBySuper(Class)}. + */ + public IInitialiserParameterAdaptationStrategy getAdaptationStrategy(); + + /** + * @return All {@link IInitialiser} instances generated by + * {@link #getAllNonAdaptedInitialisers()} that fulfil the given + * predicate. + */ + public default Collection getNonAdaptedInitialisersBy(Predicate pred) { + var result = new ArrayList(); + this.getAllNonAdaptedInitialisers().stream().filter(pred).forEach((i) -> result.add(i)); + return result; + } + + /** + * @return All {@link IInitialiser} instances generated by + * {@link #getAllAdaptedInitialisers()} that fulfil the given predicate. + */ + public default Collection getAdaptedInitialisersBy(Predicate pred) { + var result = new ArrayList(); + this.getAllAdaptedInitialisers().stream().filter(pred).forEach((i) -> result.add(i)); + return result; + } + + /** + * @return All {@link IInitialiser} instances generated by + * {@link #getAllInitialisers()} that fulfil the given predicate. + */ + public default Collection getAllInitialisersBy(Predicate pred) { + var result = new ArrayList(); + this.getAllInitialisers().stream().filter(pred).forEach((i) -> result.add(i)); + return result; + } + + /** + * @return All {@link IInitialiser} instances generated by + * {@link #getAllNonAdaptedInitialisers()} that extend the given class + * T. + */ + @SuppressWarnings("unchecked") + public default Collection getNonAdaptedInitialisersBySuper(Class cls) { + return (Collection) this.getNonAdaptedInitialisersBy((i) -> cls.isInstance(i)); + } + + /** + * @return Adapted versions of all {@link IInitialiser} instances generated by + * {@link #getAllAdaptedInitialisers()} that extend the given class T. + */ + @SuppressWarnings("unchecked") + public default Collection getAdaptedInitialisersBySuper(Class cls) { + return (Collection) this.getAdaptedInitialisersBy((i) -> cls.isInstance(i)); + } + + /** + * @return All {@link IInitialiser} instances generated by + * {@link #getAllInitialisers()} that extend the given class. + * + * @see {@link #getEachInitialiserOnceBySuper(Class)} + */ + @SuppressWarnings("unchecked") + public default Collection getAllInitialisersBySuper(Class cls) { + return (Collection) this.getAllInitialisersBy((i) -> cls.isInstance(i)); + } + + /** + * @return An instance of each {@link IInitialiser} from + * {@link #getAllNonAdaptedInitialisers()}. Use this method, if only one + * instance init of each initialiser is desired. If + * {@link #getAdaptationStrategy()} can adapt init, it will do so. + * + * @see {@link #getAllInitialisers()} + */ + public default Collection getEachInitialiserOnce() { + var result = this.getAllNonAdaptedInitialisers(); + this.adaptInitialisers(result); + return result; + } + + /** + * @return An instance of each {@link IInitialiser} from + * {@link #getEachInitialiserOnce()}. Use this method, if only one + * instance init of each initialiser is desired. If + * {@link #getAdaptationStrategy()} can adapt init, it will do so. + * + * @see {@link #getAllInitialisersBySuper(Class)} + */ + @SuppressWarnings("unchecked") + public default Collection getEachInitialiserOnceBySuper(Class cls) { + var result = new ArrayList(); + this.getEachInitialiserOnce().stream().filter((init) -> cls.isInstance(init)) + .forEach((init) -> result.add((T) init)); + + return result; + } + + /** + * Applies the adaptation logic encapsulated by + * {@link IInitialiserParameterAdaptationStrategy} returned by + * {@link #getAdaptationStrategy()}. Non-adaptable initialisers will be + * unaffected. + */ + public default void adaptInitialisers(Collection inits) { + var strat = this.getAdaptationStrategy(); + + if (strat != null) { + strat.adaptInitialisers(inits); + } + } +} From 18ef9b6e1ac933f4e0c5ba8ea3cf0882187f3eab Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:09:12 +0100 Subject: [PATCH 66/87] Add a singleton This singleton helps keep expected similarity values as well as initialiser parameters consistent across tests --- .../InitialiserTestSettingsProvider.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/InitialiserTestSettingsProvider.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/InitialiserTestSettingsProvider.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/InitialiserTestSettingsProvider.java new file mode 100644 index 0000000000..17b009a49d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/InitialiserTestSettingsProvider.java @@ -0,0 +1,108 @@ +package cipm.consistency.fitests.similarity.params; + +import cipm.consistency.initialisers.IInitialiserPackage; + +/** + * A singleton class that provides central access to + * {@link IInitialiserParameters} and {@link ISimilarityValues} instance + * required by tests. + * + * @author Alp Torac Genc + */ +public class InitialiserTestSettingsProvider { + /** + * The only instance of this class. + */ + private static InitialiserTestSettingsProvider instance; + + /** + * An {@link IInitialiserParameters} instance, which has the means to supply + * parameterised tests with initialiser instances. + */ + private IInitialiserParameters params; + + /** + * An {@link ISimilarityValues} instance, which contains expected similarity + * values required by similarity checking tests. + */ + private ISimilarityValues simVals; + + private InitialiserTestSettingsProvider() { + }; + + /** + * Creates an instance of this class, if there is none. + */ + public static void initialise() { + if (instance == null) + instance = new InitialiserTestSettingsProvider(); + } + + /** + * @return The only instance of this class. If there is no such instance, + * creates an instance first. That will be the only instance of this + * class. + */ + public static InitialiserTestSettingsProvider getInstance() { + initialise(); + return instance; + } + + /** + * @return An {@link ISimilarityValues} instance, which contains expected + * similarity values required by similarity checking tests. + */ + public ISimilarityValues getSimilarityValues() { + return this.simVals; + } + + /** + * @param similarityValues Sets the {@link ISimilarityValues} instance, which + * contains expected similarity values required by + * similarity checking tests. + */ + public void setSimilarityValues(ISimilarityValues similarityValues) { + this.simVals = similarityValues; + } + + /** + * @return An {@link IInitialiserParameters} instance, which has the means to + * supply parameterised tests with initialiser instances. + */ + public IInitialiserParameters getParameters() { + return this.params; + } + + /** + * Sets the {@link IInitialiserParameters} instance, which has the means to + * supply parameterised tests with initialiser instances. + */ + public void setParameters(IInitialiserParameters prms) { + this.params = prms; + } + + /** + * Change the stored {@link IInitialiserParameters} instance to change the + * return value. + * + * @return The {@link IInitialiserPackage} used in the stored + * {@link IInitialiserParameters} + */ + public IInitialiserPackage getUsedInitialiserPackage() { + var params = this.getParameters(); + + if (params != null) { + return params.getUsedInitialiserPackage(); + } + + return null; + } + + /** + * Sets everything provided by this class, except its only instance, to null. + */ + public void reset() { + this.params = null; + this.simVals = null; + } +} From ce50390a4e9632c247f5b06eb964f674f1cc7a28 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:09:22 +0100 Subject: [PATCH 67/87] Add package commentary --- .../fitests/similarity/params/package-info.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/package-info.java new file mode 100644 index 0000000000..8cac95229a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/params/package-info.java @@ -0,0 +1,14 @@ +/** + * Contains various utility classes/interfaces that can be used in tests that + * use initialisers. This includes elements that provide access to and adapt + * initialiser instances + * ({@link cipm.consistency.fitests.similarity.params.IInitialiserParameters}) + * and elements that help bundle test results + * ({@link cipm.consistency.fitests.similarity.params.ISimilarityValues}). + *
+ *
+ * The singleton + * {@link cipm.consistency.fitests.similarity.params.InitialiserTestSettingsProvider} + * can be used to configure the elements mentioned above for all tests. + */ +package cipm.consistency.fitests.similarity.params; \ No newline at end of file From 9351e9cfcc5950e57c88a4c1c378910332557c12 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:12:06 +0100 Subject: [PATCH 68/87] Extend AbstractResourceSimilarityTest for tests that work with EObject instances. This extension provides various methods that can be used in tests to perform similarity checking. It also integrates InitialiserTestSettingsProvider. --- .../AbstractEObjectSimilarityTest.java | 306 ++++++++++++++++++ 1 file changed, 306 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractEObjectSimilarityTest.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractEObjectSimilarityTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractEObjectSimilarityTest.java new file mode 100644 index 0000000000..add310bc50 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/AbstractEObjectSimilarityTest.java @@ -0,0 +1,306 @@ +package cipm.consistency.fitests.similarity.eobject; + +import java.util.Collection; +import java.util.List; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInfo; + +import cipm.consistency.initialisers.eobject.IEObjectInitialiser; +import cipm.consistency.initialisers.IInitialiserPackage; +import cipm.consistency.fitests.similarity.params.InitialiserTestSettingsProvider; + +/** + * An abstract class that extends {@link AbstractResourceSimilarityTest} with + * various methods that can be used to test the similarity checking of + * {@link EObject} instances.
+ *
+ * Integrates {@link InitialiserTestSettingsProvider}, in order to grant access + * to expected similarity values. + * + * @author Alp Torac Genc + * @see {@link InitialiserTestSettingsProvider#getSimilarityValues()} and + * further related methods and classes for more information on expected + * similarity values. + */ +public abstract class AbstractEObjectSimilarityTest extends AbstractResourceSimilarityTest { + /** + * @see {@link #getEcoreUtilHelper()} + */ + private EcoreUtilHelper ecoreHelper; + + @BeforeEach + @Override + public void setUp(TestInfo info) { + super.setUp(info); + + this.setEcoreUtilHelper(new EcoreUtilHelper()); + } + + @AfterEach + @Override + public void tearDown() { + this.cleanUpEcoreUtilHelper(); + + this.resetInitialiserTestSettingsProvider(); + + super.tearDown(); + } + + /** + * Consider adding default initialisation for + * {@link InitialiserTestSettingsProvider} if plausible to spare code + * duplication. + * + * @return The {@link InitialiserTestSettingsProvider} that will be used in + * tests. + */ + public abstract InitialiserTestSettingsProvider getInitialiserTestSettingsProvider(); + + /** + * Sets up the {@link EcoreUtilHelper} instance that will be used with the given + * one. + */ + protected void setEcoreUtilHelper(EcoreUtilHelper ecoreHelper) { + this.ecoreHelper = ecoreHelper; + } + + /** + * Sets the used {@link EcoreUtilHelper} to null, in order to make sure that + * each test method has a fresh instance. + */ + protected void cleanUpEcoreUtilHelper() { + this.ecoreHelper = null; + } + + /** + * @return A helper class instance that can be used to perform various + * operations on {@link EObject} instances. + */ + protected EcoreUtilHelper getEcoreUtilHelper() { + return this.ecoreHelper; + } + + /** + * Resets {@link #getInitialiserTestSettingsProvider()} after individual tests. + */ + protected void resetInitialiserTestSettingsProvider() { + this.getInitialiserTestSettingsProvider().reset(); + } + + /** + * @return The {@link IInitialiserPackage} that is used to generate initialiser + * parameters for tests. + */ + public IInitialiserPackage getUsedInitialiserPackage() { + return this.getInitialiserTestSettingsProvider().getUsedInitialiserPackage(); + } + + /** + * The variant of + * {@link #getExpectedSimilarityResult(Class, EStructuralFeature)} that uses the + * type, which introduces attrKey to the {@link EObject} hierarchy first. + */ + public Boolean getExpectedSimilarityResult(EStructuralFeature attrKey) { + return this.getInitialiserTestSettingsProvider().getSimilarityValues().getExpectedSimilarityResult(attrKey); + } + + /** + * @param objCls The type of the {@link EObject} instances being compared + * @param attrKey The attribute, based on which the said instances are compared + * @return The expected similarity value for cases, where 2 instances of objCls + * are compared, whose attribute (attrKey) is different. + */ + public Boolean getExpectedSimilarityResult(Class objCls, EStructuralFeature attrKey) { + return this.getInitialiserTestSettingsProvider().getSimilarityValues().getExpectedSimilarityResult(objCls, + attrKey); + } + + /** + * See {@link EcoreUtilHelper#cloneEObj(EObject)} + */ + public T cloneEObj(T obj) { + return this.getEcoreUtilHelper().cloneEObj(obj); + } + + /** + * See {@link EcoreUtilHelper#cloneEObjWithContainers(EObject)} + */ + public T cloneEObjWithContainers(T obj) { + var clone = this.getEcoreUtilHelper().cloneEObjWithContainers(obj); + if (clone != null) + return clone; + + Assertions.fail("Cloning with cloneEObjWithContainers failed"); + return null; + } + + /** + * See {@link EcoreUtilHelper#cloneEObjList(Collection)} + */ + public Collection cloneEObjList(Collection objs) { + return this.getEcoreUtilHelper().cloneEObjList(objs); + } + + /** + * See {@link EcoreUtilHelper#getActualEquality(EObject, EObject)} + */ + public boolean getActualEquality(EObject elem1, EObject elem2) { + return this.getEcoreUtilHelper().getActualEquality(elem1, elem2); + } + + /** + * See {@link EcoreUtilHelper#getActualEquality(List, List)} + */ + public boolean getActualEquality(List elems1, List elems2) { + return this.getEcoreUtilHelper().getActualEquality(elems1, elems2); + } + + /** + * Clones elem and compares it with its clone. They are expected to be similar. + */ + public void assertSimilar(EObject elem) { + this.assertSimilarityResult(elem, elem, Boolean.TRUE); + } + + /** + * Compares elem1 with elem2, expects the similarity result to be the same with + * the given expected value.
+ *
+ * Note: All given {@link EObject} instances will be cloned before tests to + * make sure that there are no side effects caused by the given {@link EObject} + * instances changing their container. + * {@link #cloneEObjWithContainers(EObject)} is used to make sure that all + * potentially relevant containers are cloned as well. + */ + public void assertSimilarityResult(EObject elem1, EObject elem2, Boolean expectedSimilarityResult) { + if (expectedSimilarityResult == null) { + this.getLogger().debug("No expected similarity result present"); + } else if ((!expectedSimilarityResult.booleanValue() && this.getActualEquality(elem1, elem2))) { + this.getLogger().debug("Elements are expected to be different" + " in " + this.getCurrentTestMethodName() + + " but are similar according to EcoreUtilHelper"); + } + + var objOne = this.cloneEObjWithContainers(elem1); + var objTwo = this.cloneEObjWithContainers(elem2); + + var resOne = this.createResource(List.of(objOne)); + var resTwo = this.createResource(List.of(objTwo)); + + Assertions.assertEquals(expectedSimilarityResult, this.areSimilar(resOne.getContents(), resTwo.getContents()), + "EcoreUtilHelper comparison result: " + this.getActualEquality(objOne, objTwo)); + } + + /** + * Tests the similarity as follows: + *
    + *
  1. Clones elem1 and compares it with its clone, + *
  2. Clones elem2 and compares it with its clone, + *
  3. Compares elem1 with elem2 + *
  4. Compares elem2 with elem1 + *
+ * + * Note: All given {@link EObject} instances will be cloned before tests to + * make sure that there are no side effects caused by the given {@link EObject} + * instances changing their container. + * {@link #cloneEObjWithContainers(EObject)} is used to make sure that all + * potentially relevant containers are cloned as well.
+ *
+ * + * @param expectedSimilarityValue The expected result of the similarity + * checking. + */ + public void testSimilarity(EObject elem1, EObject elem2, Boolean expectedSimilarityValue) { + this.assertSimilar(elem1); + this.assertSimilar(elem2); + + this.assertSimilarityResult(elem1, elem2, expectedSimilarityValue); + this.assertSimilarityResult(elem2, elem1, expectedSimilarityValue); + } + + /** + * A variant of {@link #testSimilarity(EObject, EObject, Boolean)}, where the + * last parameter is computed using the given attrKey. + * + * @see {@link #getExpectedSimilarityResult(Class, EStructuralFeature)} for + * objCls and attrKey. + */ + public void testSimilarity(EObject elem1, EObject elem2, Class objCls, + EStructuralFeature attrKey) { + this.testSimilarity(elem1, elem2, this.getExpectedSimilarityResult(objCls, (EStructuralFeature) attrKey)); + } + + /** + * The variant of + * {@link #testSimilarity(EObject, EObject, Class, EStructuralFeature)} that + * uses the same class as the given elems. + * + * @see {@link #getExpectedSimilarityResult(Class, EStructuralFeature)} for + * attrKey. + */ + @SuppressWarnings("unchecked") + public void testSimilarity(EObject elem1, EObject elem2, EStructuralFeature attrKey) { + this.testSimilarity(elem1, elem2, (Class) elem1.eClass().getInstanceClass(), attrKey); + } + + /** + * A variant of {@link #testSimilarity(EObject, EObject, Boolean)} that + * constructs a minimal second element with the given initialiser instance init + * and uses it as the second parameter in the said method.
+ *
+ * If initialiseSecondElement is set to true, constructs the second element with + * {@code init.initialise(init.instantiate())}. Otherwise uses + * {@code init.instantiate()}.
+ *
+ * Can be used to summarise the null check tests. + * + * @param init The initialiser used in the construction of + * the second element + * @param initialiseSecondElement Denotes whether {@code init.initialise(...)} + * will be used in the construction of the second + * element. + */ + public void testSimilarityNullCheck(EObject elem, IEObjectInitialiser init, boolean initialiseSecondElement, + Boolean expectedSimilarityValue) { + var elem2 = init.instantiate(); + + if (initialiseSecondElement) { + Assertions.assertTrue(init.initialise(elem2)); + } + + this.testSimilarity(elem, elem2, expectedSimilarityValue); + } + + /** + * A variant of + * {@link #testSimilarityNullCheck(EObject, IEObjectInitialiser, boolean, Boolean)}, + * where the last parameter is computed using the given attrKey. + * + * @see {@link #getExpectedSimilarityResult(Class, EStructuralFeature)} for + * objCls and attrKey. + */ + public void testSimilarityNullCheck(EObject elem, IEObjectInitialiser init, boolean initialiseSecondElement, + Class objCls, EStructuralFeature attrKey) { + this.testSimilarityNullCheck(elem, init, initialiseSecondElement, + this.getExpectedSimilarityResult(objCls, (EStructuralFeature) attrKey)); + } + + /** + * A variant of + * {@link #testSimilarityNullCheck(EObject, IEObjectInitialiser, boolean, Class, EStructuralFeature)} + * that computes the {@code objCls} parameter from the {@code elem} parameter. + * + * @see {@link #getExpectedSimilarityResult(Class, EStructuralFeature)} for + * attrKey. + */ + @SuppressWarnings("unchecked") + public void testSimilarityNullCheck(EObject elem, IEObjectInitialiser init, boolean initialiseSecondElement, + EStructuralFeature attrKey) { + this.testSimilarityNullCheck(elem, init, initialiseSecondElement, + (Class) elem.eClass().getInstanceClass(), attrKey); + } +} From c2d2a3c445bb17b8f442f8b9acd255433c390307 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:12:17 +0100 Subject: [PATCH 69/87] Add package commentary --- .../consistency/fitests/similarity/eobject/package-info.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/package-info.java new file mode 100644 index 0000000000..422e0aa10f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/eobject/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains {@link EObject} and {@link Resource} extensions for + * {@link cipm.consistency.fitests.similarity}. + */ +package cipm.consistency.fitests.similarity.eobject; \ No newline at end of file From 4c1ff11b02d872453f2cc1d5568b356cc460326e Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:24:47 +0100 Subject: [PATCH 70/87] Add class for storing Java similarity checker --- .../base/JavaSimilarityCheckerContainer.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/JavaSimilarityCheckerContainer.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/JavaSimilarityCheckerContainer.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/JavaSimilarityCheckerContainer.java new file mode 100644 index 0000000000..b40a0416a0 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/JavaSimilarityCheckerContainer.java @@ -0,0 +1,43 @@ +package cipm.consistency.fitests.similarity.base; + +import java.util.Collection; +import java.util.List; + +import org.eclipse.emf.ecore.EObject; +import org.splevo.jamopp.diffing.similarity.SimilarityChecker; + +import cipm.consistency.fitests.similarity.ISimilarityCheckerContainer; + +/** + * A concrete implementation of {@link ISimilarityCheckerContainer} that creates + * and works with {@link JavaSimilarityChecker} instances. + * + * @author Alp Torac Genc + */ +public class JavaSimilarityCheckerContainer implements ISimilarityCheckerContainer { + private SimilarityChecker sc; + + private SimilarityChecker getSimilarityChecker() { + if (this.sc == null) { + this.newSimilarityChecker(); + } + return this.sc; + } + + @Override + public void newSimilarityChecker() { + this.sc = new SimilarityChecker(); + } + + @Override + public Boolean isSimilar(Object element1, Object element2) { + return this.getSimilarityChecker().isSimilar((EObject) element1, (EObject) element2); + } + + @SuppressWarnings("unchecked") + @Override + public Boolean areSimilar(Collection elements1, Collection elements2) { + return this.getSimilarityChecker().areSimilar((List) elements1, + (List) elements2); + } +} From 34b1ba3c7aea27f195404a401cb69e060d7a0fba Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:26:41 +0100 Subject: [PATCH 71/87] Add initialiser parameter adaptation for JaMoPP-related initialisers --- ...nitialiserParameterAdaptationStrategy.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameterAdaptationStrategy.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameterAdaptationStrategy.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameterAdaptationStrategy.java new file mode 100644 index 0000000000..2169814275 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameterAdaptationStrategy.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.params; + +import cipm.consistency.initialisers.IInitialiserBase; +import cipm.consistency.initialisers.jamopp.classifiers.ClassInitialiser; +import cipm.consistency.initialisers.jamopp.classifiers.IConcreteClassifierInitialiser; +import cipm.consistency.initialisers.jamopp.commons.INamedElementInitialiser; +import cipm.consistency.initialisers.jamopp.containers.CompilationUnitInitialiser; +import cipm.consistency.initialisers.jamopp.initadapters.BlockContainerInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.initadapters.ClassMethodInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.initadapters.ConcreteClassifierInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.initadapters.IdentifierReferenceInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.initadapters.MemberInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.initadapters.NamedElementInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.initadapters.NewConstructorCallInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.instantiations.INewConstructorCallInitialiser; +import cipm.consistency.initialisers.jamopp.members.IClassMethodInitialiser; +import cipm.consistency.initialisers.jamopp.members.IMemberInitialiser; +import cipm.consistency.initialisers.jamopp.references.IIdentifierReferenceInitialiser; +import cipm.consistency.initialisers.jamopp.statements.BlockInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IBlockContainerInitialiser; +import cipm.consistency.initialisers.jamopp.types.ClassifierReferenceInitialiser; +import cipm.consistency.fitests.similarity.params.IInitialiserParameterAdaptationStrategy; + +/** + * A concrete implementation of {@link IInitialiserParameterAdaptationStrategy}. + *
+ *
+ * Adapts the given {@link IInitialiserBase} instances in a way that interface + * tests can run without exceptions being thrown, due to objects they + * instantiate missing certain components. + */ +public class JaMoPPInitialiserParameterAdaptationStrategy implements IInitialiserParameterAdaptationStrategy { + @Override + public void adaptAdaptableInitialiser(IInitialiserBase init) { + if (INamedElementInitialiser.class.isAssignableFrom(init.getClass())) { + init.addAdaptingStrategy(new NamedElementInitialiserAdapter()); + } + if (IBlockContainerInitialiser.class.isAssignableFrom(init.getClass())) { + init.addAdaptingStrategy(new BlockContainerInitialiserAdapter(new BlockInitialiser())); + } + if (IMemberInitialiser.class.isAssignableFrom(init.getClass())) { + init.addAdaptingStrategy(new MemberInitialiserAdapter(new ClassInitialiser())); + } + if (IConcreteClassifierInitialiser.class.isAssignableFrom(init.getClass())) { + init.addAdaptingStrategy(new ConcreteClassifierInitialiserAdapter(new CompilationUnitInitialiser())); + } + if (INewConstructorCallInitialiser.class.isAssignableFrom(init.getClass())) { + init.addAdaptingStrategy(new NewConstructorCallInitialiserAdapter(new ClassifierReferenceInitialiser(), + new ClassInitialiser())); + } + if (IClassMethodInitialiser.class.isAssignableFrom(init.getClass())) { + init.addAdaptingStrategy(new ClassMethodInitialiserAdapter(new BlockInitialiser())); + } + if (IIdentifierReferenceInitialiser.class.isAssignableFrom(init.getClass())) { + init.addAdaptingStrategy(new IdentifierReferenceInitialiserAdapter()); + } + } +} From 61c88162f69a3a2308bb762ea1b195df76951538 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:27:31 +0100 Subject: [PATCH 72/87] Add expected similarity values for JaMoPP-related similarity checking tests --- .../jamopp/params/JaMoPPSimilarityValues.java | 296 ++++++++++++++++++ 1 file changed, 296 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPSimilarityValues.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPSimilarityValues.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPSimilarityValues.java new file mode 100644 index 0000000000..c52d700499 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPSimilarityValues.java @@ -0,0 +1,296 @@ +package cipm.consistency.fitests.similarity.jamopp.params; + +import org.eclipse.emf.ecore.EStructuralFeature; +import org.emftext.language.java.annotations.AnnotationsPackage; +import org.emftext.language.java.arrays.ArrayInstantiation; +import org.emftext.language.java.arrays.ArraysPackage; +import org.emftext.language.java.classifiers.ClassifiersPackage; +import org.emftext.language.java.commons.CommonsPackage; +import org.emftext.language.java.containers.ContainersPackage; +import org.emftext.language.java.containers.Module; +import org.emftext.language.java.containers.EmptyModel; +import org.emftext.language.java.containers.Package; +import org.emftext.language.java.expressions.ExplicitlyTypedLambdaParameters; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.ImplicitlyTypedLambdaParameters; +import org.emftext.language.java.expressions.InstanceOfExpression; +import org.emftext.language.java.expressions.NestedExpression; +import org.emftext.language.java.expressions.SingleImplicitLambdaParameter; +import org.emftext.language.java.generics.GenericsPackage; +import org.emftext.language.java.generics.QualifiedTypeArgument; +import org.emftext.language.java.imports.ClassifierImport; +import org.emftext.language.java.imports.ImportsPackage; +import org.emftext.language.java.imports.PackageImport; +import org.emftext.language.java.imports.StaticClassifierImport; +import org.emftext.language.java.instantiations.Instantiation; +import org.emftext.language.java.instantiations.InstantiationsPackage; +import org.emftext.language.java.instantiations.NewConstructorCall; +import org.emftext.language.java.instantiations.NewConstructorCallWithInferredTypeArguments; +import org.emftext.language.java.members.AdditionalField; +import org.emftext.language.java.members.EnumConstant; +import org.emftext.language.java.members.MembersPackage; +import org.emftext.language.java.modifiers.ModifiersPackage; +import org.emftext.language.java.modules.ModulesPackage; +import org.emftext.language.java.modules.ProvidesModuleDirective; +import org.emftext.language.java.modules.UsesModuleDirective; +import org.emftext.language.java.parameters.ParametersPackage; +import org.emftext.language.java.references.MethodCall; +import org.emftext.language.java.references.PackageReference; +import org.emftext.language.java.references.PrimitiveTypeReference; +import org.emftext.language.java.references.ReferencesPackage; +import org.emftext.language.java.references.ReflectiveClassReference; +import org.emftext.language.java.references.SelfReference; +import org.emftext.language.java.references.StringReference; +import org.emftext.language.java.references.TextBlockReference; +import org.emftext.language.java.statements.Block; +import org.emftext.language.java.statements.StatementListContainer; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.types.InferableType; +import org.emftext.language.java.types.PrimitiveType; +import org.emftext.language.java.types.TypesPackage; +import org.emftext.language.java.variables.VariablesPackage; + +import cipm.consistency.fitests.similarity.params.AbstractSimilarityValues; +import cipm.consistency.fitests.similarity.params.ISimilarityValues; + +/** + * Contains expected similarity values for tests, in which a certain attribute + * is different.
+ *
+ * Entries for directly matching entries will take precedence over entries of + * their parent types. If the behaviour of a certain type differs from its + * parents' and/or sibling types, an entry can be created to account for it. + * This spares having to create explicit entries for everything in a part of the + * hierarchy, if there are small deviations.
+ *
+ * To spare creating entries for every possibility, a default similarity value + * can be defined by using {@link #setDefaultSimilarityResult(Boolean)}. If + * there are no entries for a specific attribute, the default similarity value + * will be assumed. The default value is null, if not explicitly defined. + * + * @see {@link ISimilarityValues} for more information on the methods used + * below. + * @see {@link AbstractSimilarityValues} + */ +public class JaMoPPSimilarityValues extends AbstractSimilarityValues { + public void addAnnotationsSimilarityEntries() { + this.addSimilarityEntry(AnnotationsPackage.Literals.ANNOTABLE__ANNOTATIONS, Boolean.TRUE); + this.addSimilarityEntry(AnnotationsPackage.Literals.ANNOTATION_ATTRIBUTE_SETTING__VALUE, Boolean.TRUE); + this.addSimilarityEntry(AnnotationsPackage.Literals.ANNOTATION_INSTANCE__PARAMETER, Boolean.TRUE); + this.addSimilarityEntry(AnnotationsPackage.Literals.ANNOTATION_PARAMETER_LIST__SETTINGS, Boolean.TRUE); + this.addSimilarityEntry(AnnotationsPackage.Literals.SINGLE_ANNOTATION_PARAMETER__VALUE, Boolean.TRUE); + } + + public void addArraysSimilarityEntries() { + this.addSimilarityEntry(ArraysPackage.Literals.ARRAY_INITIALIZER__INITIAL_VALUES, Boolean.TRUE); + this.addSimilarityEntry(ArraysPackage.Literals.ARRAY_INSTANTIATION_BY_SIZE__SIZES, Boolean.TRUE); + this.addSimilarityEntry(ArraysPackage.Literals.ARRAY_INSTANTIATION_BY_VALUES__ARRAY_INITIALIZER, Boolean.TRUE); + this.addSimilarityEntry(ArraysPackage.Literals.ARRAY_SELECTOR__POSITION, Boolean.TRUE); + this.addSimilarityEntry(ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_AFTER, Boolean.TRUE); + this.addSimilarityEntry(ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_BEFORE, Boolean.TRUE); + } + + public void addContainersSimilarityEntries() { + this.addSimilarityEntry(ContainersPackage.Literals.COMPILATION_UNIT__CLASSIFIERS, Boolean.TRUE); + this.addSimilarityEntry(ContainersPackage.Literals.MODULE__OPEN, Boolean.TRUE); + this.addSimilarityEntry(ContainersPackage.Literals.MODULE__PACKAGES, Boolean.TRUE); + this.addSimilarityEntry(ContainersPackage.Literals.MODULE__TARGET, Boolean.TRUE); + this.addSimilarityEntry(ContainersPackage.Literals.PACKAGE__CLASSIFIERS, Boolean.TRUE); + this.addSimilarityEntry(ContainersPackage.Literals.PACKAGE__MODULE, Boolean.TRUE); + this.addSimilarityEntry(ContainersPackage.Literals.JAVA_ROOT__ORIGIN, Boolean.TRUE); + } + + public void addCommonsSimilarityEntries() { + this.addSimilarityEntry(new Class[] { AdditionalField.class, Package.class, Block.class }, + CommonsPackage.Literals.NAMED_ELEMENT__NAME, Boolean.TRUE); + this.addSimilarityEntry(new Class[] { PackageImport.class, StaticClassifierImport.class, Module.class }, + CommonsPackage.Literals.NAMESPACE_AWARE_ELEMENT__NAMESPACES, Boolean.TRUE); + this.addSimilarityEntry(new Class[] { EmptyModel.class, PackageReference.class }, + new EStructuralFeature[] { CommonsPackage.Literals.NAMED_ELEMENT__NAME, + CommonsPackage.Literals.NAMESPACE_AWARE_ELEMENT__NAMESPACES }, + new Boolean[] { Boolean.TRUE, Boolean.TRUE }); + } + + public void addClassifiersSimilarityEntries() { + this.addSimilarityEntry(ClassifiersPackage.Literals.CLASS__DEFAULT_EXTENDS, Boolean.TRUE); + this.addSimilarityEntry(ClassifiersPackage.Literals.CLASS__EXTENDS, Boolean.TRUE); + this.addSimilarityEntry(ClassifiersPackage.Literals.CONCRETE_CLASSIFIER__PACKAGE, Boolean.TRUE); + this.addSimilarityEntry(ClassifiersPackage.Literals.ENUMERATION__CONSTANTS, Boolean.TRUE); + this.addSimilarityEntry(ClassifiersPackage.Literals.IMPLEMENTOR__IMPLEMENTS, Boolean.TRUE); + this.addSimilarityEntry(ClassifiersPackage.Literals.INTERFACE__DEFAULT_EXTENDS, Boolean.TRUE); + this.addSimilarityEntry(ClassifiersPackage.Literals.INTERFACE__EXTENDS, Boolean.TRUE); + } + + public void addExpressionsSimilarityEntries() { + this.addSimilarityEntry(ExpressionsPackage.Literals.CAST_EXPRESSION__ADDITIONAL_BOUNDS, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.CAST_EXPRESSION__GENERAL_CHILD, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__CHILD, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__EXPRESSION_IF, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__GENERAL_EXPRESSION_ELSE, + Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.EXCLUSIVE_OR_EXPRESSION__CHILDREN, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.EXPRESSION_LIST__EXPRESSIONS, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.INCLUSIVE_OR_EXPRESSION__CHILDREN, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__CHILDREN, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__MULTIPLICATIVE_OPERATORS, + Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.PRIMARY_EXPRESSION_REFERENCE_EXPRESSION__CHILD, + Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.PRIMARY_EXPRESSION_REFERENCE_EXPRESSION__METHOD_REFERENCE, + Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.SHIFT_EXPRESSION__CHILDREN, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.SHIFT_EXPRESSION__SHIFT_OPERATORS, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.UNARY_MODIFICATION_EXPRESSION__CHILD, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.UNARY_MODIFICATION_EXPRESSION__OPERATOR, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.LAMBDA_EXPRESSION__BODY, Boolean.TRUE); + this.addSimilarityEntry(ExpressionsPackage.Literals.LAMBDA_EXPRESSION__PARAMETERS, Boolean.TRUE); + } + + public void addGenericsSimilarityEntries() { + this.addSimilarityEntry(GenericsPackage.Literals.CALL_TYPE_ARGUMENTABLE__CALL_TYPE_ARGUMENTS, Boolean.TRUE); + this.addSimilarityEntry(GenericsPackage.Literals.TYPE_ARGUMENTABLE__TYPE_ARGUMENTS, Boolean.TRUE); + this.addSimilarityEntry(GenericsPackage.Literals.TYPE_PARAMETRIZABLE__TYPE_PARAMETERS, Boolean.TRUE); + } + + public void addInstantiationsSimilarityEntries() { + this.addSimilarityEntry(InstantiationsPackage.Literals.NEW_CONSTRUCTOR_CALL__ANONYMOUS_CLASS, Boolean.TRUE); + this.addSimilarityEntry(InstantiationsPackage.Literals.INITIALIZABLE__INITIAL_VALUE, Boolean.TRUE); + } + + public void addImportsSimilarityEntries() { + this.addSimilarityEntry(ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS, Boolean.TRUE); + this.addSimilarityEntry(ImportsPackage.Literals.IMPORT__CLASSIFIER, Boolean.TRUE); + this.addSimilarityEntry(ImportsPackage.Literals.STATIC_IMPORT__STATIC, Boolean.TRUE); + this.addSimilarityEntry(ClassifierImport.class, ImportsPackage.Literals.IMPORT__CLASSIFIER, Boolean.FALSE); + } + + public void addMembersSimilarityEntries() { + this.addSimilarityEntry(MembersPackage.Literals.ENUM_CONSTANT__ANONYMOUS_CLASS, Boolean.TRUE); + this.addSimilarityEntry(MembersPackage.Literals.FIELD__ADDITIONAL_FIELDS, Boolean.TRUE); + this.addSimilarityEntry(MembersPackage.Literals.INTERFACE_METHOD__DEFAULT_VALUE, Boolean.TRUE); + this.addSimilarityEntry(MembersPackage.Literals.EXCEPTION_THROWER__EXCEPTIONS, Boolean.TRUE); + this.addSimilarityEntry(MembersPackage.Literals.MEMBER_CONTAINER__MEMBERS, Boolean.TRUE); + this.addSimilarityEntry(MembersPackage.Literals.MEMBER_CONTAINER__DEFAULT_MEMBERS, Boolean.TRUE); + } + + public void addModifiersSimilarityEntries() { + this.addSimilarityEntry(ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS, + Boolean.TRUE); + this.addSimilarityEntry(ModifiersPackage.Literals.MODIFIABLE__MODIFIERS, Boolean.TRUE); + } + + public void addModulesSimilarityEntries() { + this.addSimilarityEntry(ModulesPackage.Literals.MODULE_REFERENCE__TARGET, Boolean.TRUE); + this.addSimilarityEntry(ModulesPackage.Literals.PROVIDES_MODULE_DIRECTIVE__SERVICE_PROVIDERS, Boolean.TRUE); + this.addSimilarityEntry(ModulesPackage.Literals.REQUIRES_MODULE_DIRECTIVE__MODIFIER, Boolean.TRUE); + this.addSimilarityEntry(ModulesPackage.Literals.ACCESS_PROVIDING_MODULE_DIRECTIVE__ACCESSABLE_PACKAGE, + Boolean.TRUE); + this.addSimilarityEntry(ModulesPackage.Literals.ACCESS_PROVIDING_MODULE_DIRECTIVE__MODULES, Boolean.TRUE); + } + + public void addStatementsSimilarityEntries() { + this.addSimilarityEntry(StatementsPackage.Literals.ASSERT__ERROR_MESSAGE, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.CONDITION__ELSE_STATEMENT, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.FOR_EACH_LOOP__COLLECTION, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.FOR_EACH_LOOP__NEXT, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.FOR_LOOP__INIT, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.FOR_LOOP__UPDATES, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.NORMAL_SWITCH_CASE__ADDITIONAL_CONDITIONS, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.NORMAL_SWITCH_RULE__ADDITIONAL_CONDITIONS, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.SWITCH__CASES, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.THROW__THROWABLE, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.TRY_BLOCK__CATCH_BLOCKS, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.TRY_BLOCK__FINALLY_BLOCK, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.TRY_BLOCK__RESOURCES, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.YIELD_STATEMENT__YIELD_EXPRESSION, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.BLOCK_CONTAINER__BLOCK, Boolean.TRUE); + this.addSimilarityEntry(StatementsPackage.Literals.STATEMENT_CONTAINER__STATEMENT, Boolean.TRUE); + this.addSimilarityEntry(StatementListContainer.class, StatementsPackage.Literals.BLOCK__STATEMENTS, + Boolean.TRUE); + } + + public void addParametersSimilarityEntries() { + this.addSimilarityEntry(ParametersPackage.Literals.CATCH_PARAMETER__TYPE_REFERENCES, Boolean.TRUE); + this.addSimilarityEntry(ParametersPackage.Literals.RECEIVER_PARAMETER__THIS_REFERENCE, Boolean.TRUE); + this.addSimilarityEntry(ParametersPackage.Literals.RECEIVER_PARAMETER__OUTER_TYPE_REFERENCE, Boolean.TRUE); + this.addSimilarityEntry( + new Class[] { ExplicitlyTypedLambdaParameters.class, ImplicitlyTypedLambdaParameters.class, + SingleImplicitLambdaParameter.class }, + ParametersPackage.Literals.PARAMETRIZABLE__PARAMETERS, Boolean.TRUE); + } + + public void addReferencesSimilarityEntries() { + this.addSimilarityEntry(ReferencesPackage.Literals.PRIMITIVE_TYPE_REFERENCE__PRIMITIVE_TYPE, Boolean.TRUE); + this.addSimilarityEntry(ReferencesPackage.Literals.SELF_REFERENCE__SELF, Boolean.TRUE); + this.addSimilarityEntry(ReferencesPackage.Literals.TEXT_BLOCK_REFERENCE__VALUE, Boolean.TRUE); + this.addSimilarityEntry(ReferencesPackage.Literals.ELEMENT_REFERENCE__CONTAINED_TARGET, Boolean.TRUE); + this.addSimilarityEntry(EnumConstant.class, ReferencesPackage.Literals.ARGUMENTABLE__ARGUMENTS, Boolean.TRUE); + this.addSimilarityEntry(MethodCall.class, ReferencesPackage.Literals.REFERENCE__ARRAY_SELECTORS, Boolean.TRUE); + this.addSimilarityEntry( + new Class[] { ArrayInstantiation.class, NestedExpression.class, Instantiation.class, + PrimitiveTypeReference.class, ReflectiveClassReference.class, SelfReference.class, + StringReference.class, TextBlockReference.class }, + new EStructuralFeature[] { ReferencesPackage.Literals.REFERENCE__NEXT, + ReferencesPackage.Literals.REFERENCE__ARRAY_SELECTORS }, + new Boolean[] { Boolean.TRUE, Boolean.TRUE }); + } + + public void addTypesSimilarityEntries() { + this.addSimilarityEntry(new Class[] { InferableType.class, PrimitiveType.class }, + TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET, Boolean.TRUE); + this.addSimilarityEntry(TypesPackage.Literals.TYPED_ELEMENT_EXTENSION__ACTUAL_TARGETS, Boolean.TRUE); + this.addSimilarityEntry(TypesPackage.Literals.TYPED_ELEMENT__TYPE_REFERENCE, Boolean.TRUE); + this.addSimilarityEntry( + new Class[] { InstanceOfExpression.class, QualifiedTypeArgument.class, NewConstructorCall.class, + NewConstructorCallWithInferredTypeArguments.class, ProvidesModuleDirective.class, + UsesModuleDirective.class }, + TypesPackage.Literals.TYPED_ELEMENT__TYPE_REFERENCE, Boolean.FALSE); + } + + public void addVariablesSimilarityEntries() { + this.addSimilarityEntry(VariablesPackage.Literals.LOCAL_VARIABLE__ADDITIONAL_LOCAL_VARIABLES, Boolean.TRUE); + } + + public void setDefaultSimilarityResult() { + this.setDefaultSimilarityResult(Boolean.FALSE); + } + + public JaMoPPSimilarityValues() { + this.setDefaultSimilarityResult(); + + this.addAnnotationsSimilarityEntries(); + this.addArraysSimilarityEntries(); + this.addContainersSimilarityEntries(); + this.addCommonsSimilarityEntries(); + this.addClassifiersSimilarityEntries(); + this.addExpressionsSimilarityEntries(); + this.addGenericsSimilarityEntries(); + this.addInstantiationsSimilarityEntries(); + this.addImportsSimilarityEntries(); + this.addMembersSimilarityEntries(); + this.addModifiersSimilarityEntries(); + this.addModulesSimilarityEntries(); + this.addStatementsSimilarityEntries(); + this.addParametersSimilarityEntries(); + this.addReferencesSimilarityEntries(); + this.addTypesSimilarityEntries(); + this.addVariablesSimilarityEntries(); + } + + /** + * @return The type of the class that has the attribute attr. + */ + protected Class getClassFromStructuralFeature(Object attr) { + return (Class) ((EStructuralFeature) attr).getContainerClass(); + } + + @Override + public void addSimilarityEntry(Object attr, Boolean expectedSimResult) { + this.addSimilarityEntry(this.getClassFromStructuralFeature(attr), attr, expectedSimResult); + } + + @Override + public Boolean getExpectedSimilarityResult(Object attr) { + return this.getExpectedSimilarityResult(this.getClassFromStructuralFeature(attr), attr); + } +} \ No newline at end of file From 83a19e24bf9a2c5f0e30d63cd4197f6d679704b0 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:28:33 +0100 Subject: [PATCH 73/87] Add IInitialiserParameters implementation for JaMoPP-related similarity checking tests --- .../params/JaMoPPInitialiserParameters.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameters.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameters.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameters.java new file mode 100644 index 0000000000..40a26892e0 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/JaMoPPInitialiserParameters.java @@ -0,0 +1,23 @@ +package cipm.consistency.fitests.similarity.jamopp.params; + +import cipm.consistency.initialisers.IInitialiserPackage; +import cipm.consistency.initialisers.jamopp.JaMoPPInitialiserPackage; +import cipm.consistency.fitests.similarity.params.IInitialiserParameterAdaptationStrategy; +import cipm.consistency.fitests.similarity.params.IInitialiserParameters; + +/** + * A class that provides central access to concrete initialiser instances. + * + * @author Alp Torac Genc + */ +public class JaMoPPInitialiserParameters implements IInitialiserParameters { + @Override + public IInitialiserPackage getUsedInitialiserPackage() { + return new JaMoPPInitialiserPackage(); + } + + @Override + public IInitialiserParameterAdaptationStrategy getAdaptationStrategy() { + return new JaMoPPInitialiserParameterAdaptationStrategy(); + } +} From c8c727c05185ac993d89b346ed5848e56bb76a17 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:28:41 +0100 Subject: [PATCH 74/87] Add package commentary --- .../fitests/similarity/jamopp/params/package-info.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/package-info.java new file mode 100644 index 0000000000..b1dac455c5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/params/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains implementations of interfaces from + * {@link cipm.consistency.fitests.similarity.params} for JaMoPP. + */ +package cipm.consistency.fitests.similarity.jamopp.params; \ No newline at end of file From d9d6d5632be65578a0a6d9bd110c49883a5815b6 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:31:30 +0100 Subject: [PATCH 75/87] Extend AbstractEObjectSimilarityTest for JaMoPP-related similarity checking tests Integrates Java similarity checker Provides static methods for retrieving certain groups of initialisers in similarity checking tests. They can be used within static methods of the said tests as MethodSources. --- .../jamopp/AbstractJaMoPPSimilarityTest.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/AbstractJaMoPPSimilarityTest.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/AbstractJaMoPPSimilarityTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/AbstractJaMoPPSimilarityTest.java new file mode 100644 index 0000000000..720aabc9ed --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/AbstractJaMoPPSimilarityTest.java @@ -0,0 +1,105 @@ +package cipm.consistency.fitests.similarity.jamopp; + +import java.io.File; +import java.util.stream.Stream; + +import org.junit.jupiter.params.provider.Arguments; + +import cipm.consistency.fitests.similarity.ISimilarityCheckerContainer; +import cipm.consistency.fitests.similarity.base.JavaSimilarityCheckerContainer; +import cipm.consistency.fitests.similarity.eobject.AbstractEObjectSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.params.JaMoPPInitialiserParameters; +import cipm.consistency.fitests.similarity.jamopp.params.JaMoPPSimilarityValues; +import cipm.consistency.fitests.similarity.params.IInitialiserParameters; +import cipm.consistency.fitests.similarity.params.InitialiserTestSettingsProvider; +import cipm.consistency.initialisers.jamopp.IJaMoPPEObjectInitialiser; + +/** + * An abstract test class that extends {@link AbstractEObjectSimilarityTest} + * with concrete method implementations for JaMoPP context, as well as static + * methods that can be used in parameterised tests to generate initialiser + * instances. + * + * @author Alp Torac Genc + */ +public abstract class AbstractJaMoPPSimilarityTest extends AbstractEObjectSimilarityTest { + @Override + protected ISimilarityCheckerContainer initSCC() { + return new JavaSimilarityCheckerContainer(); + } + + @Override + public String getAbsoluteResourceRootPath() { + return new File("").getAbsoluteFile().getAbsolutePath() + File.separator + "testModels"; + } + + @Override + public String getResourceFileExtension() { + return "javaxmi"; + } + + /** + * @return The {@link InitialiserTestSettingsProvider} that will be used in + * tests. Initialises the instance to be returned, if not properly + * initialised. + */ + public static InitialiserTestSettingsProvider getClassesInitialiserTestSettingsProvider() { + var instance = InitialiserTestSettingsProvider.getInstance(); + + if (instance == null) { + InitialiserTestSettingsProvider.initialise(); + instance = InitialiserTestSettingsProvider.getInstance(); + } + + if (instance.getParameters() == null) { + instance.setParameters(new JaMoPPInitialiserParameters()); + } + + if (instance.getSimilarityValues() == null) { + instance.setSimilarityValues(new JaMoPPSimilarityValues()); + } + + return instance; + } + + @Override + public InitialiserTestSettingsProvider getInitialiserTestSettingsProvider() { + return getClassesInitialiserTestSettingsProvider(); + } + + /** + * @see {@link IInitialiserParameters#getEachInitialiserOnceBySuper(Class)} + */ + public static Stream getEachInitialiserArgumentsOnceFor( + Class superType) { + return getClassesInitialiserTestSettingsProvider().getParameters().getEachInitialiserOnceBySuper(superType) + .stream().map((i) -> Arguments.of(i)); + } + + /** + * @see {@link IInitialiserParameters#getAllInitialisersBySuper(Class)} + */ + public static Stream getAllInitialiserArgumentsFor( + Class superType) { + return getClassesInitialiserTestSettingsProvider().getParameters().getAllInitialisersBySuper(superType).stream() + .map((i) -> Arguments.of(i)); + } + + /** + * @see {@link IInitialiserParameters#getAdaptedInitialisersBySuper(Class)} + */ + public static Stream getAdaptedInitialiserArgumentsFor( + Class superType) { + return getClassesInitialiserTestSettingsProvider().getParameters().getAdaptedInitialisersBySuper(superType) + .stream().map((i) -> Arguments.of(i)); + } + + /** + * @see {@link IInitialiserParameters#getNonAdaptedInitialisersBySuper(Class)} + */ + public static Stream getNonAdaptedInitialiserArgumentsFor( + Class superType) { + return getClassesInitialiserTestSettingsProvider().getParameters().getNonAdaptedInitialisersBySuper(superType) + .stream().map((i) -> Arguments.of(i)); + } +} From be94d861931845cc429e8d2b5dd8b7ca2517300a Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:37:21 +0100 Subject: [PATCH 76/87] Add similarity checking tests for some SPLevo models --- .../classextends/a/AddExtendsClass.java | 3 + .../classextends/a/ChangedExtendsClass.java | 3 + .../classextends/a/DeleteExtendsClass.java | 3 + .../classextends/b/AddExtendsClass.java | 3 + .../classextends/b/ChangedExtendsClass.java | 3 + .../classextends/b/DeleteExtendsClass.java | 3 + .../interfaceextends/a/AddExtends.java | 3 + .../interfaceextends/a/ChangedExtends.java | 3 + .../interfaceextends/a/DeleteExtends.java | 3 + .../interfaceextends/b/AddExtends.java | 3 + .../interfaceextends/b/ChangedExtends.java | 3 + .../interfaceextends/b/DeleteExtends.java | 3 + .../classimplements/a/AddExtendsClass.java | 3 + .../a/ChangedExtendsClass.java | 3 + .../classimplements/a/DeleteExtendsClass.java | 3 + .../classimplements/a/InterfaceA.java | 3 + .../classimplements/a/InterfaceB.java | 3 + .../classimplements/b/AddExtendsClass.java | 3 + .../b/ChangedExtendsClass.java | 3 + .../classimplements/b/DeleteExtendsClass.java | 3 + .../classimplements/b/InterfaceA.java | 3 + .../classimplements/b/InterfaceB.java | 3 + .../a/MyClass.java | 7 + .../b/MyClass.java | 7 + .../MethodsWithChangedBody/a/MyClass.java | 7 + .../MethodsWithChangedBody/b/MyClass.java | 7 + .../NotMatchingStatements/a/MyClass.java | 7 + .../NotMatchingStatements/b/MyClass.java | 9 + .../access/a/ExternalTypeAccess.java | 35 ++ .../access/b/ExternalTypeAccess.java | 35 ++ .../calculator/a/lib/jscience.jar | Bin 0 -> 681880 bytes .../examples/calculator/CalculatorGCD.java | 26 ++ .../examples/calculator/CalculatorSqrt.java | 26 ++ .../examples/calculator/CalculatorTool.java | 33 ++ .../examples/calculator/CalculatorGCD.java | 24 ++ .../examples/calculator/CalculatorSqrt.java | 25 ++ .../examples/calculator/CalculatorTool.java | 33 ++ .../tests/fielddeclaration/EnumClass.java | 10 + .../tests/fielddeclaration/package-info.java | 4 + .../AddedClassDeclaration.java | 8 + .../tests/fielddeclaration/EnumClass.java | 11 + .../newpackage/NewPackageClass.java | 5 + .../newpackage/package-info.java | 4 + .../newpackage/sub/NewSubPackageClass.java | 5 + .../newpackage/sub/package-info.java | 4 + .../tests/fielddeclaration/package-info.java | 4 + .../a/de/splevo/test/BaseClass.java | 5 + .../b/de/splevo/test/BaseClass.java | 5 + .../b/de/splevo/test/BaseClassCustom.java | 4 + .../a/de/splevo/test/BaseClass.java | 8 + .../b/de/splevo/test/BaseClass.java | 8 + .../b/de/splevo/test/BaseClassCustom.java | 4 + .../a/de/splevo/test/BaseClass.java | 12 + .../b/de/splevo/test/BaseClass.java | 12 + .../b/de/splevo/test/BaseClassCustom.java | 8 + .../a/de/splevo/test/BaseClass.java | 7 + .../b/de/splevo/test/BaseClass.java | 7 + .../b/de/splevo/test/BaseClassCustom.java | 4 + .../a/de/splevo/test/BaseClass.java | 10 + .../b/de/splevo/test/BaseClass.java | 10 + .../b/de/splevo/test/BaseClassCustom.java | 8 + .../a/ArrayFieldDeclarationChange.java | 10 + .../fielddeclaration/a/NewInTheMiddle.java | 13 + .../a/RemovedFromTheMiddle.java | 16 + .../b/ArrayFieldDeclarationChange.java | 11 + .../fielddeclaration/b/NewInTheMiddle.java | 16 + .../b/RemovedFromTheMiddle.java | 13 + .../import/a/ImportDiffing.java | 10 + .../import/b/ImportDiffing.java | 10 + .../a/org/splevo/test/InitClassDiagram.java | 4 + .../a/org/splevo/test/InitUmlUI.java | 4 + .../a/org/splevo/test/InitUseCaseDiagram.java | 4 + .../a/org/splevo/test/SubsystemUtility.java | 5 + .../a/org/splevo/test/TestClass.java | 11 + .../b/org/splevo/test/InitClassDiagram.java | 4 + .../b/org/splevo/test/InitUmlUI.java | 4 + .../b/org/splevo/test/InitUseCaseDiagram.java | 4 + .../b/org/splevo/test/SubsystemUtility.java | 5 + .../b/org/splevo/test/TestClass.java | 14 + .../methoddeclaration/a/ClassA.java | 24 ++ .../methoddeclaration/a/Constructor.java | 10 + .../methoddeclaration/b/ClassA.java | 26 ++ .../methoddeclaration/b/Constructor.java | 10 + .../primitives/a/Primitives.java | 12 + .../primitives/b/Primitives.java | 12 + .../renaming/a/de/splevo/test/DummyClass.java | 3 + .../renaming/a/de/splevo/test/Test.java | 11 + .../b/de/splevo/cust/test/DummyClass.java | 3 + .../b/de/splevo/cust/test/TestCust.java | 11 + .../a/org/splevo/test/DummyClass.java | 5 + .../a/org/splevo/test/sub/DummyClass.java | 5 + .../b/org/splevo/test/DummyClass.java | 5 + .../b/org/splevo/test/sub/DummyClass.java | 5 + .../statements/a/ArrayAccesses.java | 19 + .../statements/a/ArrayItemAccess.java | 13 + ...ItemAccessWithSameContainerIdentifier.java | 11 + .../a/ChangeInsideSiblingBlock.java | 20 + .../statements/a/ClassStatementInsert.java | 29 ++ .../a/ConditionMatchAndExpression.java | 18 + .../a/ConditionMatchInstanceOfExpression.java | 15 + .../a/ConditionMatchOrExpression.java | 18 + .../a/ConditionMatchRelationExpression.java | 18 + .../a/ConditionMatchUnaryExpression.java | 18 + .../statements/a/EnumAccesses.java | 16 + .../statements/a/ForLoopWithIterator.java | 12 + .../a/IfElseMultipleStatements.java | 19 + .../statements/a/IfElseStatements.java | 13 + .../statements/a/IfIfStatements.java | 10 + .../statements/a/IfStatements.java | 66 ++++ .../statements/a/LoopStatements.java | 55 +++ .../statements/a/ReturnStatementChanges.java | 22 ++ .../statements/a/StaticInitialization.java | 16 + .../statements/a/Synchronized.java | 14 + .../statements/a/ThrowStatements.java | 28 ++ .../implementation/statements/a/TryCatch.java | 23 ++ .../a/VariableDeclarationStatements.java | 9 + .../statements/b/ArrayAccesses.java | 20 + .../statements/b/ArrayItemAccess.java | 14 + ...ItemAccessWithSameContainerIdentifier.java | 11 + .../b/ChangeInsideSiblingBlock.java | 22 ++ .../statements/b/ClassStatementInsert.java | 29 ++ .../b/ConditionMatchAndExpression.java | 22 ++ .../b/ConditionMatchInstanceOfExpression.java | 19 + .../b/ConditionMatchOrExpression.java | 22 ++ .../b/ConditionMatchRelationExpression.java | 22 ++ .../b/ConditionMatchUnaryExpression.java | 22 ++ .../statements/b/EnumAccesses.java | 16 + .../statements/b/ForLoopWithIterator.java | 12 + .../b/IfElseMultipleStatements.java | 22 ++ .../statements/b/IfElseStatements.java | 16 + .../statements/b/IfIfStatements.java | 13 + .../statements/b/IfStatements.java | 64 +++ .../statements/b/LoopStatements.java | 55 +++ .../statements/b/ReturnStatementChanges.java | 26 ++ .../statements/b/StaticInitialization.java | 21 + .../statements/b/Synchronized.java | 16 + .../statements/b/ThrowStatements.java | 28 ++ .../implementation/statements/b/TryCatch.java | 23 ++ .../b/VariableDeclarationStatements.java | 9 + .../variabledeclaration/a/A.java | 11 + .../a/MultipleVariables.java | 9 + .../a/StringInitialization.java | 27 ++ .../variabledeclaration/b/A.java | 11 + .../b/MultipleVariables.java | 10 + .../b/StringInitialization.java | 27 ++ .../jamopp/SPLevoModelsSimilarityTest.java | 373 ++++++++++++++++++ 146 files changed, 2288 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/AddExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/ChangedExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/DeleteExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/AddExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/ChangedExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/DeleteExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/AddExtends.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/ChangedExtends.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/DeleteExtends.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/AddExtends.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/ChangedExtends.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/DeleteExtends.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/AddExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/ChangedExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/DeleteExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceA.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceB.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/AddExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/ChangedExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/DeleteExtendsClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceA.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceB.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/a/MyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/b/MyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/a/MyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/b/MyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/a/MyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/b/MyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/a/ExternalTypeAccess.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/b/ExternalTypeAccess.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/lib/jscience.jar create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorGCD.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorSqrt.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorTool.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorGCD.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorSqrt.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorTool.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/EnumClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/package-info.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/AddedClassDeclaration.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/EnumClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/NewPackageClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/package-info.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/NewSubPackageClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/package-info.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/package-info.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/a/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClassCustom.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/a/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClassCustom.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/a/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClassCustom.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/a/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClassCustom.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/a/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClassCustom.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/ArrayFieldDeclarationChange.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/NewInTheMiddle.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/RemovedFromTheMiddle.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/ArrayFieldDeclarationChange.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/NewInTheMiddle.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/RemovedFromTheMiddle.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/a/ImportDiffing.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/b/ImportDiffing.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitClassDiagram.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUmlUI.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUseCaseDiagram.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/SubsystemUtility.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/TestClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitClassDiagram.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUmlUI.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUseCaseDiagram.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/SubsystemUtility.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/TestClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/ClassA.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/Constructor.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/ClassA.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/Constructor.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/a/Primitives.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/b/Primitives.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/DummyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/Test.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/DummyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/TestCust.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/DummyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/sub/DummyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/DummyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/sub/DummyClass.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayAccesses.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccess.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccessWithSameContainerIdentifier.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ChangeInsideSiblingBlock.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ClassStatementInsert.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchAndExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchInstanceOfExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchOrExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchRelationExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchUnaryExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/EnumAccesses.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ForLoopWithIterator.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseMultipleStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfIfStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/LoopStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ReturnStatementChanges.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/StaticInitialization.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/Synchronized.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ThrowStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/TryCatch.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/VariableDeclarationStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayAccesses.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccess.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccessWithSameContainerIdentifier.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ChangeInsideSiblingBlock.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ClassStatementInsert.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchAndExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchInstanceOfExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchOrExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchRelationExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchUnaryExpression.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/EnumAccesses.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ForLoopWithIterator.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseMultipleStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfIfStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/LoopStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ReturnStatementChanges.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/StaticInitialization.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/Synchronized.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ThrowStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/TryCatch.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/VariableDeclarationStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/A.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/MultipleVariables.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/StringInitialization.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/A.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/MultipleVariables.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/StringInitialization.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/SPLevoModelsSimilarityTest.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/AddExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/AddExtendsClass.java new file mode 100644 index 0000000000..07c5cdd012 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/AddExtendsClass.java @@ -0,0 +1,3 @@ +public class AddExtendsClass { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/ChangedExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/ChangedExtendsClass.java new file mode 100644 index 0000000000..76e978341f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/ChangedExtendsClass.java @@ -0,0 +1,3 @@ +public class ChangedExtendsClass extends Integer { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/DeleteExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/DeleteExtendsClass.java new file mode 100644 index 0000000000..2613e4a68e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/a/DeleteExtendsClass.java @@ -0,0 +1,3 @@ +public class DeleteExtendsClass extends Integer { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/AddExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/AddExtendsClass.java new file mode 100644 index 0000000000..1874bf8058 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/AddExtendsClass.java @@ -0,0 +1,3 @@ +public class AddExtendsClass extends String { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/ChangedExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/ChangedExtendsClass.java new file mode 100644 index 0000000000..b98f57d98a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/ChangedExtendsClass.java @@ -0,0 +1,3 @@ +public class ChangedExtendsClass extends String { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/DeleteExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/DeleteExtendsClass.java new file mode 100644 index 0000000000..c7be3efb37 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/classextends/b/DeleteExtendsClass.java @@ -0,0 +1,3 @@ +public class DeleteExtendsClass { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/AddExtends.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/AddExtends.java new file mode 100644 index 0000000000..104ec5c69a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/AddExtends.java @@ -0,0 +1,3 @@ +public interface AddExtends { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/ChangedExtends.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/ChangedExtends.java new file mode 100644 index 0000000000..13d85ad96c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/ChangedExtends.java @@ -0,0 +1,3 @@ +public interface ChangedExtends extends Cloneable { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/DeleteExtends.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/DeleteExtends.java new file mode 100644 index 0000000000..17410f6353 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/a/DeleteExtends.java @@ -0,0 +1,3 @@ +public interface DeleteExtends extends Cloneable { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/AddExtends.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/AddExtends.java new file mode 100644 index 0000000000..38382913b4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/AddExtends.java @@ -0,0 +1,3 @@ +public interface AddExtends extends Runnable { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/ChangedExtends.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/ChangedExtends.java new file mode 100644 index 0000000000..5397108edb --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/ChangedExtends.java @@ -0,0 +1,3 @@ +public interface ChangedExtends extends Runnable { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/DeleteExtends.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/DeleteExtends.java new file mode 100644 index 0000000000..60a4ed8fea --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ExtendsChange/interfaceextends/b/DeleteExtends.java @@ -0,0 +1,3 @@ +public interface DeleteExtends { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/AddExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/AddExtendsClass.java new file mode 100644 index 0000000000..07c5cdd012 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/AddExtendsClass.java @@ -0,0 +1,3 @@ +public class AddExtendsClass { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/ChangedExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/ChangedExtendsClass.java new file mode 100644 index 0000000000..6a46d289da --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/ChangedExtendsClass.java @@ -0,0 +1,3 @@ +public class ChangedExtendsClass implements InterfaceB { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/DeleteExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/DeleteExtendsClass.java new file mode 100644 index 0000000000..84bd2beda1 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/DeleteExtendsClass.java @@ -0,0 +1,3 @@ +public class DeleteExtendsClass implements InterfaceB { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceA.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceA.java new file mode 100644 index 0000000000..1b719f4c24 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceA.java @@ -0,0 +1,3 @@ +public interface InterfaceA { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceB.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceB.java new file mode 100644 index 0000000000..aebd65024e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/a/InterfaceB.java @@ -0,0 +1,3 @@ +public interface InterfaceB { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/AddExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/AddExtendsClass.java new file mode 100644 index 0000000000..c70764165b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/AddExtendsClass.java @@ -0,0 +1,3 @@ +public class AddExtendsClass implements InterfaceA { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/ChangedExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/ChangedExtendsClass.java new file mode 100644 index 0000000000..9621ef269f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/ChangedExtendsClass.java @@ -0,0 +1,3 @@ +public class ChangedExtendsClass implements InterfaceA { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/DeleteExtendsClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/DeleteExtendsClass.java new file mode 100644 index 0000000000..c7be3efb37 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/DeleteExtendsClass.java @@ -0,0 +1,3 @@ +public class DeleteExtendsClass { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceA.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceA.java new file mode 100644 index 0000000000..1b719f4c24 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceA.java @@ -0,0 +1,3 @@ +public interface InterfaceA { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceB.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceB.java new file mode 100644 index 0000000000..aebd65024e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/ImplementsChange/classimplements/b/InterfaceB.java @@ -0,0 +1,3 @@ +public interface InterfaceB { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/a/MyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/a/MyClass.java new file mode 100644 index 0000000000..718a36cf53 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/a/MyClass.java @@ -0,0 +1,7 @@ +public class MyClass { + + private void someMethod() { + System.out.println(1); + System.out.println(2); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/b/MyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/b/MyClass.java new file mode 100644 index 0000000000..261cb7b633 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MatchWithDifferentNeighbors/b/MyClass.java @@ -0,0 +1,7 @@ +public class MyClass { + + private void someMethod() { + System.out.println(2); + System.out.println(1); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/a/MyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/a/MyClass.java new file mode 100644 index 0000000000..927ee607f2 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/a/MyClass.java @@ -0,0 +1,7 @@ +public class MyClass { + + public void doSth() { + int a = 0; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/b/MyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/b/MyClass.java new file mode 100644 index 0000000000..b84df8188f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/MethodsWithChangedBody/b/MyClass.java @@ -0,0 +1,7 @@ +public class MyClass { + + public void doSth() { + int a = 1; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/a/MyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/a/MyClass.java new file mode 100644 index 0000000000..9d34a4f0a7 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/a/MyClass.java @@ -0,0 +1,7 @@ +public class MyClass { + + public void doSth() { + System.out.println(1); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/b/MyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/b/MyClass.java new file mode 100644 index 0000000000..21162812ef --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/JaMoPPElementComparison/NotMatchingStatements/b/MyClass.java @@ -0,0 +1,9 @@ +public class MyClass { + + public void doSth() { + if(true) { + System.out.println(1); + } + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/a/ExternalTypeAccess.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/a/ExternalTypeAccess.java new file mode 100644 index 0000000000..c6d0d8ed19 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/a/ExternalTypeAccess.java @@ -0,0 +1,35 @@ +package org.splevo.jamopp.diffing.tests.access; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPath; + +public class ExternalTypeAccess { + + @SuppressWarnings("unused") + private XPath path; + + public void typeAsListType() { + List paths = new ArrayList(); + System.out.println(paths); + } + + public void typeAsArrayParameter(XPath[] extents){ + System.out.println(extents); + } + + /** + * An unresolveable reference in a java doc comment tag that is not changed. + * + * @see org.netbeans.lib.jmi.xmi.XmiContext#XmiContext(javax.xml.xpath.XPath[], org.netbeans.api.xmi.XMIInputConfig) + */ + public void typeInJavaDocTag(){ + } + + @SuppressWarnings("unused") + public void typeInMethod(){ + XPath path; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/b/ExternalTypeAccess.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/b/ExternalTypeAccess.java new file mode 100644 index 0000000000..d328f0dc8d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/access/b/ExternalTypeAccess.java @@ -0,0 +1,35 @@ +package org.splevo.jamopp.diffing.tests.access; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.xpath.XPath; + +public class ExternalTypeAccess { + + @SuppressWarnings("unused") + private XPath path; + + public void typeAsListType() { + List paths = new ArrayList(); + System.out.println(paths); + } + + public void typeAsArrayParameter(XPath[] extents){ + System.out.println(extents); + } + + /** + * An unresolveable reference in a java doc comment tag that is not changed. + * + * @see org.netbeans.lib.jmi.xmi.XmiContext#XmiContext(javax.xml.xpath.XPath[], org.netbeans.api.xmi.XMIInputConfig) + */ + public void typeInJavaDocTag(){ + } + + @SuppressWarnings("unused") + public void typeInMethod(){ + XPath path; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/lib/jscience.jar b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/lib/jscience.jar new file mode 100644 index 0000000000000000000000000000000000000000..4712f3a9df700f923a152674fc01b70505164326 GIT binary patch literal 681880 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 gHc#S)RjLBpD*6m9lB*hi!tr~@#k%W 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 z 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

{aKNph!~)<1VW3zh+khDg0mu%2tC1Q=ewH3s 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\-J_VPAo6er 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

GB94ky@b9MwQK))uFAIi~FQc~trj#st6Tah4j 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

-ZI;0|}0*^&PIX*_ykn&*fkKG6Kd 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

m!5ZBSgzfjE090y<~JSB=om^ zbn8yRY~+?M{nqBib5w)7#C&lJF8P&8oaZA$>1Q`WXc{$VkH zSZ(4I7W43XVSrM*HI|ZT0^NoRjlC2BcOhK8Rp|zCx~YqB89fRucTQN4mBAHHMwFbWjq|du5g00zK8WsSUj-QUW~{*Miq@?5-SOb-GC<3 z0M{hK3nl!u6dkNp0A&xW4v00JkZa_&KYzfWCc&OIEgsc)#lT`EJX3UHq-^-n%j8ly zt|26*s_Vm=DmZv}P|m-gP#O52jY^NCN$Fon1%RFfFw@y~2l9E2THo)szlaJ$zbTGG zh7`00>;u%Y6~2?zAFq)rz82FS;k`(4ndq-r=#MJibg6a8&)`av;S=jZYT7{upxgrS z?uDwH5x}U=?j|MqqT%Q_tYFIdyZNF5n$uLhaYxCqjPpa8l%!iN1|+)a&QFJwDO9Di zJ$nCM6HU??Jc%HAZx&+PgOV7YMPk>v-9?G*@_6;3=vaa{zNV%Wofg3&(2Ogg8}3Pf z<-_MNJzCK{9=w#l9AWqNohluwl{=K4ffoV%vFG_U5~&NbA3V@ZD~|azd{T^tu6;I` zAVIfB(2d{>ibk(XrqKRD*xjeC&j-ks^vkpSs@b=PNwfdin+4l@!tzFwLZ_G#UL3J5 zQWx8Wy@A=$VHZ`3B^^!?eH<~kR2#}jNHXc(RwE~DXOs>sB;5d$% za^PM+l5VZv3^MgKpGGkU_R7A~X7ovKShEt|5D(lo&WX@xp!iuhQFiBtud3R2l-226 zfl;^VmCPOQ zMN~h1|62=h@DTYk69^E{-Ouvv{||B{WNhPT{NGFgO4gPOd>nD1@7l?buU|>^Jw7?mrn! zqt7ARRqKfr%TK}l$9u7ZJ=hh? zZCY1kt%9Q>J7|(LxqSvU|Bgq$cWxG>g3e$pF>9JGVW5>YP}o>*UyD_PBQk#rKm_*k zz2-S}$pPq<%#9Mx3Ae0`0gf3rm!EbB?)j(ZVUyC8HfIKAOR|ONfpxT;o&wJOf)Few z7#5gMvlP!bR(kV+=eg0C5Rz&xwSR>TSmxFB)ZXzRV4fLa)8SIHrFNZBx{LbTIK&x7 zd#vx&NJP_5G+vJh34{pI!rv%oALnHKbPObQf$Fv9q&zEz_3%dM?4ph2IaggX$<{F; z^w91L@6&UcUV$A((;qR1C|x2q-W7p(Nr5Vnf%4hG+@#jHppMlDMia{*}~?Q9FY- zgQwh?P>8Sc<5#%qa(voyyw2|O{nGgamlI_c0+#*71s&IWkKq23P0G+i87v@Ze&~W( z-!w@Syphcw2jeJRbh!M`NPX$L6%DCwhSj@IWRvtywkPwvJP;V>kXA#o1O1*jF3`&Y zYdy>(OilqBGs|H)$tY1QpOGT7Znk?N%*x(W`QMs^VTsRBfQ5GmIFgEk=)s^b-RvTZ zDIsyYFyQi*5qD6_HQ)9U*BDugL+Q_?wnf=&oh+UGS>kLQ-P&k(h7qpaG`HErl6MML zPzY(004{lr>Y>OQCod|+r+UN+v4pF}ob#kOCU7{g3MS9g+}?rke`<{jkdK5SL5?|tWb*Kl`DDUxkKZo*{NMzu{t&BN zxN=&!WU)C!Irktk;k*cGzN&9Q6YwlTPakN#bFlt%sk!yCpfO+PK4BY|dmSCL(e=r- zTz4_IMu8?HJcSJc$cLgi>cm!H_X8~~-Mas+EU|@&1FGZ4udw%ng#JH0UjL7=_)jWS z?OgH4t?;cKKiO9g-~l3<%U6KqkIc>I8W2T^$|t9jv!M6p{J2i%ZfUFH;Pj5#L6Rs~tg`tw$D@W&Vib_mZu16w8FO7!iDr0wS ztR`R;5k?eQh@#aaOdlDhuQft5>L$YvHZ|g=Gh__j=B?XU(r}K_{}zpSDZmit5Lt*h zn^4?8oGEtP^LshVMcOrf$qiaizJ=b%LS}3aCTLgza+oaz!&J_&c(lq)puyUPF;hoQ z*-~^4D?D-Agf-Q(l@MgDe8c)I6~nLr%y|7F#3Wn)oX=*~ ziuMMn7zUu;ub3XueA%i*6kE(rVdM3tg?(@P{4TqI2B#|6oXr}hTTYrbfHyr-k&x<~ zPRfUinWKkVmAyYay0DtWgLxd`zH#On20IZaDgv5Ya5X?;czTlDMm=!|^W_j)gK&@& z0<&9_ZDf@q$x>v%ASP5{(qQ(+QyIVLzQM=_jyfxgN7BStcK1XIxWT#Va&i*hbiQY&R`%@`kYt>rKTxHXMM*O1{J) z1r9K9Y$x5@GSbIhm7i>@GqsJs1^H!W>C>~+p@$Y}Z5(>g78h%~hgTX3)`J=}!Gn zxCLb?|D7iyOwCeJirkMTq$G4(9!}{dJ#-G(>d9c(Qn+Q=lE0^s3s!?iIHGTb(wTS=yeBpAp5VZR+S(%rr>} zj8TsEMw-tcSqxhZwKxImTFvH8iYX!J=p6c?%%pwXtgZbo>F!0$$5m&Nh?mVD-dkL| zhlR%ex!;e+n&rp^RxSZ!?-V;y1}~g?qlYo8WaR+eu=vufF?NhO(eQfu;(0X_q>ch5 z17hISKyhIj*()&vu8Ctic108Lk!4zRfKjkV*+zB@{_%U;^bu;e6)lFB_@xB1{CKp_ zY;Hj@S-4x28}d~Q*=F_+VtLxNrq2|dJ@*}bbqNkg2N#pBsRJ*@YwB)pxKF5(!m~FF za3x|@=!^5ieksu6gPiQ>1naEeB?%+^ykOSQ;rU$RoAlAA%A6WL2ab4ioDrV9#Y1dg zi@aR`243?#27-W!|DS=1Ef6LHvRQ3-vGh>1a2i30p!R>E;Gs*Ozqe67TnU&Z`6;-< z_~gp70&xy0xm2CT+SyaW_v-Otec$Jj~~t@^N9 zbG0?OBRG!5E7s_eaTkD4iXQ)=^MV$BLJ^swq}`8i?`K~6r%6$*UNdwZFz9a?iWo;( zQro!78)ZC+B%L&t%M=vPqidMURQrTg?mtIORYMIcr9Y@$3G-G`YXMc{tqNkbxBai? z#Vj+k2QyFkgzNm@0$>7iP(X!1Nv7apC9;2WnpJD5zFis&~L$VuA&M;o}7VI#7^1yp= zocuyagrz99NDPu*89*Wtn?$PWE*r;2BA`Ek?FdZ?tX&*{bj2_$vxiZwa3C|&4I(91 zmQ5@}yxUc|WlbLr40VFDhZJeN)0_R)l46uBlz5;#v`B&i z6D9w9ln0C9d}Iv@5KtW_5D@+U4~NA6byND!J-#Nim(pU|x6D!6C@f?QWH2!X0)Z4# zpP=Y(g3ehzHzGukIRY5E)QN!!;$GE?C5?^p$3^8t05~&`T?7ErB@OU0sfQ}b21 z+Gf*|wR6X2v&H$+r|)qlJ7ZcP9r9@(?eUi975nyU_xE$RANtqRz`PKXG?SYdn|DvY z@7;|i{NdcS+slkFp8JS6o{{0(Kd#19pX=i9qcq-wneQ1q?FX{%ue6XD#}nkYg`ZsU z8HqPa_?+9De^SS`o!^cy{;4CwTpx(Efjb10*a1oAE^-egxi9a19rF~H+1pGBDY92nka4qX7*6l$yIN~~M|><;5inzG zIA|nie+QP~HIQ91OJb~z@HAL|oQ!qCEHwqCe~dGT<~A`wgu8&qNo7fp*_E}PgaeI5M5}P&wQ@AD{@EQ4 zcije;(F=_a)B_C$-`zFTie+f59H|Zpq-ZeL!EzO=)i78|kj_&BDqZJ3Ve`8>Dg;aD z%Xq2-(E#f_zWa7PO%$c+3QbU_WT-K13`kK!KRc_RSX1s3{72Ehhj7_yb<%Q%>W2Hb zF%d&+YZ(|V_3In$4i=#54XP3!>>gwm@3@>auIO zlKe?&X27PQ2v%e(I98CshP8p=QU|?PXdkui)RON;MB4ni1T;2L&W_J5REBc*ijY0_0(E+tK$2il5+0f*rgaALW5opEqmJOYJVFW( z!G*;M1Vgb8OL8uK+8TnGoZ?oZ_@w04Z>K`7-JQOcW^$$uBe8Uo>$s6+UiAj+7MO%q z#tG-dgallXVjf)xWz8fLlypD0d=*vJk+@&Pp;=-no#No8WTBNuRLo6QbPT`9%ANhE zChRn|cC0chi1|?i--Yvfp2XN@s7lMJ6nW}ff@3M$2T8XO2`w%!8*tRk9 z%qDj>x;OAr$n zBsU<5uEogk(+z(3Qb!XWfY^-mGO%oB4btw4fD5fkH95S?Pw-nfyr&d)-zEo5K*6+Mj zU1q*&vsSlw;(94Q$rHSL=QM`cKcJVS?MrIZwTbiFb{UVAPfuy}?>zGOPe*a9-2h)g zHlLy*9aa{dHK0e=!{8AM`}xyRKaJ-ulaEZE=zGZ4f<$NH}KB5bZNkr_L;ctslvB&iU_tp#Pxc_+Ur6e-%uHFm~xI zl8=3I?&y6+hUDUynYpAVlS(_$3?da+(wtc?iJAq}JjD+Ggj1M0nzy1-zYL?85t=rI ziDrIqwPP52a%oY^+-413?Fo4MRKD$v9dsA)?J0l6RLLV+RROq(8O?tEFw%YLEXk3k zfuCBadHZaBS8DOP+dR)!V~WqH>#|y-E|o*rpwx|ukD5VP!ytR4RTfDyh_!unscCtP zxUMMQLY0D-Z3yNaPa?fi=D zaO%1yb)5)R%Zaeb7fIbxKD1ebWTt7DvsBYfD@~s!-w}myM3GV6^L!VY^XXI4zyhWJ;0KvsR5|*(fQj|J=cS@Ngn0eKutcpB7c^Ke=qA# zYq@fkTLsXn@Up;1MAOT)zD}5J2HdMfxZ0a>v&Qzkk7wBOmhfSB{HexEeg{QL5Z*4k z0Qp#LOYBq`l8tE>~)-Oc($>SD$`!Ru0+ayxr(zv64K|m!o9A1e#Gp`Vc!R7 z&Lz3J`UBM=DZJngX$qsz$u}cc+|63vD_0@u zJiz1orA#G~?897bW?tIk8VdCk3z0IrdAE0!rwE4;mg%sFJ6cub!dFdRUB|u6V$O39`gg7Mm<0BWr69QI4-HuEv zaV0*mp#vyyUf+p?OI>{tcqafH!Rm+#V3=FLrLNTpcnU;PBnI39udD_9riSldgXhZ> z?K$G@HR%rEvyVN>x8}rKhCZ=3v~4IP0oX!g^#0PgA=Jn>w5RZDRR*WwO`31f%X5Jg z0p2Rhf(iCmj&_Ag_63bv->aPwU70+#QqsUeK*Nt$99Ve(8*JTb9b+SYLJ?be-?}>X z?&3QjM{ozJ=L!S*L{Xk~H3#R8l6!}#8g%}}O*YH+tMk>||F$g(JSqx_K*X^7sSUFy ziN2OZzgFHbcdH3o)(~dq*bK%8WX%eT5m7~gtvNDFQE5Z6WQmkXcTU(a@u&+<#j9-g zr6z%y2RAMLBxL7JH1;7!p7bNN^8tkLG$QsEOlUSGGFg`2$ZA$2yX?^6uVRutcP(zw zp% zH7TpE=;Ms}Pl*Wyg?DsP+Z$}_Z3f+P3&K|nLF_-+d#+%KeQm@1{hgt5|C?T|>$#!! zL5y>>Gyv!mtyCHQLb*)CnMMOZo_`~tjV7SqLkqLX3Xd;!MzEwLc=DM<6Kc(>U!d89 zVCh)9#ND;ZFDqtU_W5kzCwE_PQV%1gSPy236pPPSInILXUqCr;;G-|-4UbUsXBV&o z216-`1JeaNoKaLL|kSZ57NoS;o$jj&b?@H{{ZtsoMCk-HmMQ9%5hANnrAw!9JGnBu zS>oMdbHa?HTV4rJBFP}*GbuVFP~GCHc|TUbnfneXpyluvn=xd9lky>-b8-aE+aEQr z&MBn@4p`>qWAXOx@EYFGM|+FaFUY|i4 zWavL?SxBUOKdn8l`T>uTe||%uBI$oCWUUy4Cw`YIgNbAol1zu3(IiC~_0du`;+$=g z?x)1;U&V%8?r)gkB;s;!R) z6-9KXf1w~os}NeGg+pINVh1sgc);3L&h>QHSy>z4m zYRL;tXM8CXh$tP=Ssn)$MQ;alwaWvjzQLe?j+wzF!~2dd8)L=&t}BB!W1~Fi-lCaP z=izZuR;deEb?pt+-@IIm1dk3vXh@ec#t_C4GGmAxW%I`$M%$SJ)$G$mzw<4l5H zK}QjkW?`-IDq$672`>O<{%Y$z%LTvV@!BUqoo0SB>{K!=db@1qE)%ss`Z9zOWCOFdHO~K>zMa&-m?kyN>l}){W9350|vaK$zB}VSsCsS2sy(WZ+y$(;8C1Sx&{;iaGL+ARH>i2>PJrpOeavj}7Uh+Uk!` zYpsplUCHPr&ep7};thdgd5(zntF+=3P5|SY4(OD68Ssq<+c#|OkgY;oDmYTb!iEI;52)QVJ(E6m}Tf2Cdy{iP6zK892S#MXFnb_!7Bb~cN^71qxp z*eeBCY~B^f1Pm-!ySk)jd0&2ZkT;^1U+*1wO3WNL;kZ;9bwSbatMF)4Hhgf!9s{WQXZiJ~4Tq4)UpHMTcWpKc2kJFQux&HMu`_ zzklf%Y88lp^;K(I-k&_rJ1bz~j38ce-;mJGinx8PXrSLxIg#1v!kSBXVL_VG7GrZI z+PNwK`T3YZvn8#-Z(J8K4tO(ZZpcClv1U=@<}U8>TcE(p%W+8|+W+m2K7UN@0JD4! z4NxG{?$Lv&XMX3$1>1#~=Hu)?;YvKO%+gx9e5DHke;EhS2tq3YPUp=yD;jF`uujI> zAE{e@8PZ8uvnjYfU2tLa)-7p1m(ybwv(^=ymV_oRrZj?bB2>{PbiVNSSufn$R9M&I zCBJI#&Eoj?=eXj>Gh3DkvN$Dkq2%#RaO4v>Bs91Q-^5BCywv(fZ_tr;=h#Y>r~vzY zhWH<{c1%Nr427xp>ZP0@p7`s4$Fl`c~OR-LRKwHor#XhK^ zTze^v8IF)`l7EcI))ze#!PVH&$=~<@nPb9BxCrJ}90@imNJX5oEQrEW+9kbG<;$T5 z-JZ<|(nmXo{YA!ih{QExR8jM4z6>=j#BZRM%zX)C_({Xt4qjifCVHf40vIoN=jmre ze_xnAh8hma4=gl*z(Xwkb%{Og36^dqaWIcgED?KAVS= za{4w>3ak)asD78Pu$u~FZV@r32JD}uh=!mE2($$Kol=H_vgYk>gP}c9P8-#xsj0kz z6`|K(V7Lhzf2ZltMz7nYgWeQVN2X_l0YmE#CHeltX228s>R8>C1{3;N+VW1RQ1NRJ zgX`EgZ>$uuok3=vRHxYTeoP4Qt~L3xd!%a;7RXeL31*N!(K*XAUFEU{md^4?*PQ-Z zx5U&U>YWF4ZOA93<@FqmbS=7P$VcZ`W5BvU3D=Gl5`@Pm zqEq@K+|2lGj=>Vuu6zy+!4g+9e-F-rC2V->6A4voDul>fyCortODd<#D;LCTGMZK8 zT}b7>mi@?cGI$O{VkBR;!Sl6pcn;rV1luh2n3BEinVw*!+P05_CVq(d8T@4UMSL64 zw=-FrLAlXQ5!;6Z?Aba}?>6jcqG#$~iZt(giO=&HzGUxflD1h=+Lr}}=^Nn#rWK~< zhmaS5*M`OO2Nyh@hJ^exzD_vy@+)4Nnt-8nCpYK$nv*}$ontp1f%U0&OZM*GS&#)Z zzENM=wmj&|R9)&^9KTiJ`cV^JV|cX8Hkv+RMA$% z{_zOO)YsNp1sQ}5Y6xdELqftTl~(07uJ}h4S3!YP;a%2O>eH_dUKAJUcwQDU>NpQ& zY&A2=oSj5^T*}UV>v>NR1o8<;57DP_zh^sc-FHsA^G>bueto^F0wMo~8L%7t8(aZ? zL|3!Fi7SQ07G~LnGa-J;{p*^Dw&iUm^lL_@>S(*{Gq? zPIsE+k`RhZYVtIwHC>v>tK zGq8Y^XV8>`hxG?A0aN&c!K|;p7zj(q-deE_jSNXu7WISNK#EMkqnb^+L*Wn*>@i$vBdl+UJgJpJ{^X$j?MAqYVY&V+U`knO+}BC+%B_bW`XwFGl3DY1mu#7)XwnO5 z+FyH7ts-C|P)Toi>N&)lA$f;z+SRac<7XJPv4X~UuYyqC5gN*YXd4^WbK_^hwOz%G z>mx`FMKwAus@vjk9cd=;6rwSs;OeyFb4gC3z!bpJ+$SuLlo;EV3}-HG4!Qr~6w3eQ z#8U~j_0azx-k+G_Yyqx3l)>@(Y4;tJ=(;Ft%N^9tVuW^j|7G@XaAU>O(KzJ9zzIb{ zv4iys;a3(Pfx_^U>lxf@L0O82IO{5ocE3P@6a}P$#x6_IDREAUF|2KGF~xAbNCwNG z_{NXeP;D>SBJhrUWv6MOX>-A~TRghNFGP>>@N9rb%D>rx0#n~QQ?D4of4SF7xvwZ8 zKA!nNB%`WH6;t^TwtIA>_L%j(6bta*jRG~~&*pHvVgryDJnR5kV@U{*{?CQ=m`8;3Kg zOq2S5%3k~V(B`#fLwSXdq+bGMRc{U6U*?@Zpx+?fSv1E?NdovTiA`j_+#f43vwd_4)Uu4Vbb zwCKV9=O^F)vG*uy{;wdYtF>uK zo8o0Zl$L@VLJp|+j4yHaDiw1h;%X54@dfL#mm>`$uaEB=NN$)lG^q`Ct06%^z4%^r zkY}rHUT8R)@-OCJ&cS`rWZX^Tu~kZ(Fl}8sa&!|d+!Wa{!POr+q-!s z-^g?&Z#n}&;O}LLgd6wnD3Ah~E(lMV{0ANa?R}UIi|E8$tPatE75+1;=nP0%D>Sy; zgITG3k!On@>0=iVU5soJ=^g+mF?o|x8s$5lriCy2n|z_k6~ ztED#XV3Kkxa4TFl?$Jf^!aZG!kRCh=+Sq7pF_LKIz16+99aqk>xeXGZb9{`TYBP5a z18BvL3=YinN95Bt{)5pi#=N)QJXmN)m`9Z3lUP{n3_BPmt9D;UmgG7ELqy4iRV7zH z{ZC(RIzAoEG81i^p?>=9-?}hCN=~B7#h%i0t{Pklx0A)yRbP$?1bE?MrHMhzv$?LO z0>17V3r3$dBMxGWQA;vCJh5@TVDUj1AHfmCmtnt-rbjwW$VR$( z1#i5=d$>q)Pl-We#7)J}&++20iN0BZDTjRfdTLS)jrUUQ%+49A|59HduUqszg?crn zs8{$3n?&|qc#tX`{S-r1s6~{a*l6CY& zE(>gkF2DhG1kz}AfBBNN%m+!NOA}(7+v4U}%+2HH;t{aonGle$1T&e8#`M`$NB3z@_pN6x(`VW5?oZ6Wq#rauyuo9uTtptz;aiTt z3wxPn+0Xm$z?FUQLid97_x@%&5Bo(>CvK}TsvxN`1oUjQMmnexKE%Q3ATRVjgy}iq zN6dBCk5C^lyy%m{1a}cYKXiq`dMutTq#r@uXG(q>ak_5U(Xx-$)BYvU*=_XARXE-? zcrCaf7T3G$5EE6@A6A*-1a`_e8DSZCVxr8bV#Z&=i}`t8vU_G@wGNnyg2##eRdr5B zW(RI8*>sBbjD2Z_q!~h7*zD#*KmFcw`o;A}Jgc_m$R2pC2}gg^>g%zR+aBwsMe;?K z&gkJtq$R3TJ(`-x072H%*nB2=Y$Yo z9~^mOVn#YOc;vI1f{t+A;p#;&Tak%ut0@y{7HGCitvPzCYKoy#K_1dOt_$W@LU#xm zhF2;()d##nGASKOM`L(;$kd@Iv6Sd}3Nl_P=%Z-YEzu9m(OG^rkT-{S_pq>DM9?#k zN<9`7FUIerAwdf`z*b!*+7Y<{b88tE=1rM1$?`-LC8ivgP;s-RPLWV$mx`6HL|IYT zjHt0~^%=!vV|{}icmahc)*d#1e;oEtS6V$T+KZlBZLULcsmA$NdVtz*ts zLNS~ul8Ef|1@xS2liG+P8HAFVIh+Ut6vGjRK2eJ$!5OL36(z)7ut({cy~VA*HLeUh zak}WY!Qo!1*!S*u2B=wD4Jj!=BYM{omTZ?rMI$Rb&>NBx5|EpBph}$#P9Z`;1nyb= z{4fCREJYwEK4-F13UCIGXgG=@RHKl|W8CV!6|vfLYrtkTgwW|l^@{$i%53`u=L|?` z+lO>-1?9V>qUebciOJ*7s^wTMv`z=Dd%Z~ey=a#ufZJGGm5Ak1w;BDq5_q^0sWKJB zt|;-iJ|l8?SUT+T#3jJq9fLFXs^JB6=~Nt8U?H(;3CC_JKXPlUFo4Qcxxw|fBu?k| zM&cAqLF4k_f|vOTL^(YjTxg+Svp)#a3^|OF6a&o?uKm(*G%rQ;Na8IeWI^%G^=?mC z{f+iZ4P|GDJPAUD3p|!cTl6Zg_LZ`rmoOZkXas~LV|bvH@^D|(pV{@+&DbGW8|jsB z8lFHQ@@?n3rOV3bjxXw`(HyJba~!X`nEYucTXcUo>{yAz5Asugn{m37ONUrb5{m8* z5DZE>mkOy9f&F@YrHx=8ZrO81niuCHe5 z_TPLvO^UzDoM%9poF_t?C4cj|ChV@UM2vl;JFm*a z9Y)d|4y8tdno1j%F8!z`ZugXqY!q95wWaA@Jv5S+W^^?vZ;h8~mhe?^AIm?^(nSOl zm-Btq(e&_b>AjPb-=OMu9Q3M6Xl#;<8vyKXR{L4Gc-ao`6Ja}WiL3Og?giAWh6{*c z#3&^yxNwCUaoKa?PSS|&Tr3DTl&V&`D{jGXrwU55>zvc4j( zu2QY^58r%cor~0|4G32nnTC_>qfN}RMHD$0r3`G7&OXp7N8dbb7!1YUEo{568M0sP zD-!|E)`5=1#SwR`?naTInTGLMxpT%%!g?|t)`_OM8LRj&j12$+^N5VmC5LB-Al|(2 zzXh(j2KaV6QRZLg!PH?w$L5lFfi+d8*LXo*!$@`Fe@nf?HROKp5q#|s?ZK^egSx`+ zCDzvpY7_HpxsTt=J~O0nY!f;2h;ABozFRrd3!@hW(5WCVnKBBLDbg2pGUue)1txN& z!|ibfGu32v9aWPvJ)Gy7H8p^I>;Be!gkM}Q*B@#mjG@#w~)~h~kEt z6_Sx*Sd1;JuAVqveh2eoWO5YCv&c&p=8go-Lmrb0e-#UfhkTg7^y70465ySQM_7v* z^unK4!y_=NPE;ut6>E+a4N~HDOAgAfXzbK|F~s1BxXt7=X1!5UsbyQvF!?K`EY#{0 zXty^(AS-?;K7wXKfsu&DE_s^v+X?h<${J?7&*MSlZlPpp<7S!~q$$nAAV#{}sra(T z=o>@CAdybH@b80=K7xmX=z3U-^}i)9B(c~oKaa>$-`6oSADbVwGa(qfv1a&Vx>MVs zBy*#76Anqeu)6h;821}(J7U=LStuve#mMN6*!~=nOtmBGKGFgRMQVxCw!j_}jT=(O zM!|!+!Kl;NLy(KimIZnZ46u8Lp|?_pSpWVqw^cjt&iL~O0sp+r{ck7^5i47LCl;pv zb9M8y5!7-b!ja{{>A@U= z=87Q-*7OIIi`pUmE{&w<#hMJrw4s49VY>G+eA#I#2lsj@BMLvsO~BdMPw{XSNr!yv z(wiU@S27#1SG_FjMJ}N022|}45cGg#tNTI`(PaW}|7d0yTA>!Bf*D(e$cw6lU{Rnj znJhDwj0cVjyG_qkY9zH}odP;+a>H=VrEC89%JU3}>(ZtAgZyHQZkTB|xL8E%$GmY4 zShpCn9$26wfmq|fg9s8A%-k2qg~v+}W@x3{>N6VVX*LGV$Ar|;rq4k?)I2h4!%u#? zpMc2|{2b^n*JU;x97rCrDCK!t_)eozXVT|b7ekJAuVzOd$!@^5Kc=Vlg@*=>g%K(P zCNo|7!Vw z`-m=VO;bx3TR5rX3Isz)LTB{jYi9JbmTxJdIKBp zLncEnP*rE=8$+KPshZ9^ObTg_z!ap|&$~UUph@#aS+FF1gZ}#}G%(=R`X{>i-!dWp zz6$?8+0FkjA>u5nMlj7wZ^}L8M+7KN(8&bN55<`9h+U<~z_ujw_-S-m@vEzIUzA;S zxjS$-qT!}22#t_`s3tNQue0wnR~wGsV`;a4In7SVjYK1}GAh|o3c|D~Ziw5ba(99l5Z3;fmyF$@A1CDMJRT+QM(NBO+O8OU?H?!PjA(-3znl=%f1HqdZ&kN4 zk9Mm=Jpb7J$Ni&OrSE055K+fj zMJ~OSi;30AE0;_e9#h2ZnbKv1917|)vS^D0E}7&b)TU5Vy`0gq-vwQ`!pS>;uT|#1 zR*CDytq!PO$@}&?j#QPl>KK)Hvw@g=fS5}B4$**HKU5#5#imHVJKiiXoIzA2JzivLR{<<%y z4p8NXFC;H7_zP%(0C0#vOd4h;0K~e9O$rnplf=m+K#%sx;QDz<2hZF7RZq2ycy38U z_id(H*_TiEO?K^y5dsYXKd%Cg-86^${la^y<@w9x?tPng3s5e$h8UcUye~Gvoha+i z4RSWBeF$y#?f^XA)E)os03E9wai)k;KnMav0eV6$2#0RW{jNF!eRW!#-tVa*aohuT z2ofru6)!Qn&BQQAL@zdS1C2rGz?H=<`}~$`T&poLa_%XyblS2r!i zOB&&({Ua$TL7g5R3o@7f1$2iFBzn!9sCYDXEA;eL1Vt*z26UO4^KxcHR#CzIf^L+!GZm#hhv_@WnZiQ1}powXjL}zf%yG5723EC+OBN zl^xFZvc4h3mRe(CQqY!>CH7af?9P8+1LA`s`*^eI@&q8ck=vx7mfuOHq+!7UZ(Pv?*M%t40 z)AS{YswwIKh8A8qs+`shIg$kDMG~YB*^34dHLk%2SkFr?uB=ScckSF@xGGqDoLtMr zf}Ms?HZ!gRlFGIk3Fh07B5_n4Si2b$%%jpC{@V)y`EM@-OqX}*%&AWoncA> zoupe#ng}=TVJtVrVNEy9VNN&IVNbW5JeCTp@t0qC5ierHBQHT6uS&!GOyR9W`;1;R z`%qrw`;;_I`{1`H!!#=DvKIrlkVD9ZOrN+Ud?`xa5CdZLE@b0D^h%Y_yRDdq|Mg^) zPFaR%6Vo%J5?KFv!xn+?0oGbut^O(`1_P5(y({r}D^>Je9WA^L$k?L70p{V;5Z3~Q zEQn^#&bId_hT;JxsZO7e(_d(5h*UE!ehiGAZD<)Dj#DdtJ5t)1zshHggf^uR^9#@t zK?V4Z8fGN%-nkY{u`8Y~Hz_eJRb>zv1j#hC6T!s}67yBk=PVQ_P#dzD?KrrJ_FDw* zq@R?d{KTJOKGaumo;E9ZYZ%z|0@) zh#hx-jXC`N1(z3pq&3B6G{pKX)ew5LcD*Cf?~NtUu!9odc;gm)#vZ1V=LOrQ)5jai zRkPzf&3^~EJqMbCWW*^1xhKp+Ibd=mNKP4=^IDf-EgE-e7tm4!xD)57O2f?Aa;N~c zNjnm+A@0CFH{hhodRG_e!ZMc!m(WaPy(o23+o&8?sSw5`pi0mzwSNn2-YRV#H_QC; z`;I>!3p8O=SD-W~Gw?E`mjb_zo6N{lzW<3@uyTPN(3jYSs(13MP`jL&GRY%?s4&xR@@BWUAHxw$0q6&0aENi2_%YwbS`; zNHyj>MIgKiVZTdJAgH|X#k{~p!hTHnBKOQ}>3R{hi{CW0Bw7ZOt$#J_qnq@TafY!i zN8m2NZRS2G&wFhvk$h`uz-|%5PV$RS3I%T9=cL&rELkUE+>l4WA0fG7Y86R{AHHAc zONhPP5J$2I+Wl~a#0*-6ik76^$NQA;mIV=MD>+ZkbjeDTf^;I{?nJDWfGsMzoiK3n z*-1B5tR9;sln(_o?aS~;Puyv6Eb=&AIa&C=WN)(C{qN50COJ@=4kn~YfMopm8Ng

0B3Nuc$#*>yUPS@

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 literal 0 HcmV?d00001 diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorGCD.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorGCD.java new file mode 100644 index 0000000000..090a39047e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorGCD.java @@ -0,0 +1,26 @@ +package org.splevo.examples.calculator; + +import org.jscience.mathematics.number.LargeInteger; + +/** + * The calculator to perform numeric calculations. + * This makes use of the LargeInteger class of the + * JScience mathematics library (www.jscience.org) + */ +public class CalculatorGCD { + + /** + * Calculate the greatest common denominator (divider) (GCD) of an integer + * @param value1 The first number to get the gcd. + * @param value2 The second number to get the gcd. + * @return + */ + public String gcd(String value1, String value2){ + + LargeInteger integerValue1 = LargeInteger.valueOf(value1); + LargeInteger integerValue2 = LargeInteger.valueOf(value2); + LargeInteger gcd = integerValue1.gcd(integerValue2); + + return gcd.toString(); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorSqrt.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorSqrt.java new file mode 100644 index 0000000000..5263fbd725 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorSqrt.java @@ -0,0 +1,26 @@ +package org.splevo.examples.calculator; + +import org.jscience.mathematics.number.FloatingPoint; + +/** + * Calculator to get the positive square root of + * a floating point number. + * This makes use of the FloatingPoint class of the + * JScience mathematics library (www.jscience.org) + */ +public class CalculatorSqrt { + + /** + * Calculate the square root (sqrt) of a floating point number. + * @param value1 The number to get the square root for. + * @return The calculated square root. + */ + public String sqrt(String value1){ + + FloatingPoint floatingPointValue = FloatingPoint.valueOf(value1); + FloatingPoint sqrt = floatingPointValue.sqrt(); + + return sqrt.toString(); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorTool.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorTool.java new file mode 100644 index 0000000000..1dd4590769 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/a/src/org/splevo/examples/calculator/CalculatorTool.java @@ -0,0 +1,33 @@ +package org.splevo.examples.calculator; + +/** + * The command line tool to run the calculator. + */ +public class CalculatorTool { + + /** + * Executing the calculator tool. + * + * @param args The command line args provided to the tooling. + */ + public static void main(String[] args) { + + if(args.length > 0 && args[0] == "sqrt"){ + String value = "13.25"; + + CalculatorSqrt calculator = new CalculatorSqrt(); + String sqrt = calculator.sqrt(value); + + System.out.println(sqrt); + + } else { + String value1 = "9876543210987654321098765432109876543210"; + String value2 = "1234567891234567891234567891234567891234"; + + CalculatorGCD calculator = new CalculatorGCD(); + String gcd = calculator.gcd(value1, value2); + + System.out.println(gcd); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorGCD.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorGCD.java new file mode 100644 index 0000000000..89d26f042a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorGCD.java @@ -0,0 +1,24 @@ +package org.splevo.examples.calculator; + +import java.math.BigInteger; + +/** + * The calculator to perform numeric calculations. + */ +public class CalculatorGCD { + + /** + * Calculate the greatest common denominator (divider) (GCD) of an integer + * @param value1 The first number to get the gcd. + * @param value2 The second number to get the gcd. + * @return + */ + public String gcd(String value1, String value2){ + + BigInteger integerValue1 = new BigInteger(value1); + BigInteger integerValue2 = new BigInteger(value2); + BigInteger gcd = integerValue1.gcd(integerValue2); + + return gcd.toString(); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorSqrt.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorSqrt.java new file mode 100644 index 0000000000..d17351bb69 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorSqrt.java @@ -0,0 +1,25 @@ +package org.splevo.examples.calculator; + + +/** + * Calculator to get the positive square root of + * a floating point number. + * This makes use of the FloatingPoint class of the + * JScience mathematics library (www.jscience.org) + */ +public class CalculatorSqrt { + + /** + * Calculate the square root (sqrt) of a floating point number. + * @param value1 The number to get the square root for. + * @return The calculated square root. + */ + public String sqrt(String value1){ + + Double floatingPointValue = Double.valueOf(value1); + Double sqrt = Math.sqrt(floatingPointValue); + + return sqrt.toString(); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorTool.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorTool.java new file mode 100644 index 0000000000..1dd4590769 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/calculator/b/src/org/splevo/examples/calculator/CalculatorTool.java @@ -0,0 +1,33 @@ +package org.splevo.examples.calculator; + +/** + * The command line tool to run the calculator. + */ +public class CalculatorTool { + + /** + * Executing the calculator tool. + * + * @param args The command line args provided to the tooling. + */ + public static void main(String[] args) { + + if(args.length > 0 && args[0] == "sqrt"){ + String value = "13.25"; + + CalculatorSqrt calculator = new CalculatorSqrt(); + String sqrt = calculator.sqrt(value); + + System.out.println(sqrt); + + } else { + String value1 = "9876543210987654321098765432109876543210"; + String value2 = "1234567891234567891234567891234567891234"; + + CalculatorGCD calculator = new CalculatorGCD(); + String gcd = calculator.gcd(value1, value2); + + System.out.println(gcd); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/EnumClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/EnumClass.java new file mode 100644 index 0000000000..a86502c7b6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/EnumClass.java @@ -0,0 +1,10 @@ +package org.splevo.tests.fielddeclaration; + +public class EnumClass { + + public enum EnumChange { + A, + B + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/package-info.java new file mode 100644 index 0000000000..8f2747cde6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/a/src/org/splevo/tests/fielddeclaration/package-info.java @@ -0,0 +1,4 @@ +/** + * Class declaration diffing test code. + */ +package org.splevo.tests.fielddeclaration; \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/AddedClassDeclaration.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/AddedClassDeclaration.java new file mode 100644 index 0000000000..68056c9e40 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/AddedClassDeclaration.java @@ -0,0 +1,8 @@ +package org.splevo.tests.fielddeclaration; + +public class AddedClassDeclaration { + + public void doSth(){ + + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/EnumClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/EnumClass.java new file mode 100644 index 0000000000..823f32646a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/EnumClass.java @@ -0,0 +1,11 @@ +package org.splevo.tests.fielddeclaration; + +public class EnumClass { + + public enum EnumChange { + A, + NEW, + B + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/NewPackageClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/NewPackageClass.java new file mode 100644 index 0000000000..a08c381306 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/NewPackageClass.java @@ -0,0 +1,5 @@ +package org.splevo.tests.fielddeclaration.newpackage; + +public class NewPackageClass { + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/package-info.java new file mode 100644 index 0000000000..d768683954 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/package-info.java @@ -0,0 +1,4 @@ +/** + * An added package. + */ +package org.splevo.tests.fielddeclaration.newpackage; \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/NewSubPackageClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/NewSubPackageClass.java new file mode 100644 index 0000000000..fd38724614 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/NewSubPackageClass.java @@ -0,0 +1,5 @@ +package org.splevo.tests.fielddeclaration.newpackage.sub; + +public class NewSubPackageClass { + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/package-info.java new file mode 100644 index 0000000000..d47e026405 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/newpackage/sub/package-info.java @@ -0,0 +1,4 @@ +/** + * An added sub package. + */ +package org.splevo.tests.fielddeclaration.newpackage.sub; \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/package-info.java new file mode 100644 index 0000000000..8f2747cde6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/classdeclaration/b/src/org/splevo/tests/fielddeclaration/package-info.java @@ -0,0 +1,4 @@ +/** + * Class declaration diffing test code. + */ +package org.splevo.tests.fielddeclaration; \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/a/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/a/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..f03e0fa57b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/a/de/splevo/test/BaseClass.java @@ -0,0 +1,5 @@ +package de.splevo.test; + +public class BaseClass { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..f03e0fa57b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClass.java @@ -0,0 +1,5 @@ +package de.splevo.test; + +public class BaseClass { + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClassCustom.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClassCustom.java new file mode 100644 index 0000000000..68456e0445 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopy/b/de/splevo/test/BaseClassCustom.java @@ -0,0 +1,4 @@ +package de.splevo.test; + +public class BaseClassCustom extends BaseClass { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/a/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/a/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..b69c4d358f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/a/de/splevo/test/BaseClass.java @@ -0,0 +1,8 @@ +package de.splevo.test; + +public class BaseClass { + + public BaseClass() { + return; + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..b69c4d358f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClass.java @@ -0,0 +1,8 @@ +package de.splevo.test; + +public class BaseClass { + + public BaseClass() { + return; + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClassCustom.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClassCustom.java new file mode 100644 index 0000000000..68456e0445 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyconstructor/b/de/splevo/test/BaseClassCustom.java @@ -0,0 +1,4 @@ +package de.splevo.test; + +public class BaseClassCustom extends BaseClass { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/a/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/a/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..054224d33b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/a/de/splevo/test/BaseClass.java @@ -0,0 +1,12 @@ +package de.splevo.test; + +public class BaseClass { + + public int field; + + private int oldField; + + public void doSth(){} + + public void hookMethod(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..054224d33b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClass.java @@ -0,0 +1,12 @@ +package de.splevo.test; + +public class BaseClass { + + public int field; + + private int oldField; + + public void doSth(){} + + public void hookMethod(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClassCustom.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClassCustom.java new file mode 100644 index 0000000000..1357771355 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyfield/b/de/splevo/test/BaseClassCustom.java @@ -0,0 +1,8 @@ +package de.splevo.test; + +public class BaseClassCustom extends BaseClass { + + public int newField; + + public void hookMethod(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/a/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/a/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..e7f5a2af71 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/a/de/splevo/test/BaseClass.java @@ -0,0 +1,7 @@ +package de.splevo.test; + +import java.lang.Math; +import java.util.List; + +public class BaseClass { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..e7f5a2af71 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClass.java @@ -0,0 +1,7 @@ +package de.splevo.test; + +import java.lang.Math; +import java.util.List; + +public class BaseClass { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClassCustom.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClassCustom.java new file mode 100644 index 0000000000..68456e0445 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopyimport/b/de/splevo/test/BaseClassCustom.java @@ -0,0 +1,4 @@ +package de.splevo.test; + +public class BaseClassCustom extends BaseClass { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/a/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/a/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..cb05bfc24c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/a/de/splevo/test/BaseClass.java @@ -0,0 +1,10 @@ +package de.splevo.test; + +public class BaseClass { + + public void doPublic(){} + + private void doPrivate(){} + + public void hookMethod(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClass.java new file mode 100644 index 0000000000..cb05bfc24c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClass.java @@ -0,0 +1,10 @@ +package de.splevo.test; + +public class BaseClass { + + public void doPublic(){} + + private void doPrivate(){} + + public void hookMethod(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClassCustom.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClassCustom.java new file mode 100644 index 0000000000..02fd69c4b3 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/derivedcopymethod/b/de/splevo/test/BaseClassCustom.java @@ -0,0 +1,8 @@ +package de.splevo.test; + +public class BaseClassCustom extends BaseClass { + + public void hookMethod(){ + System.out.println("Hello World"); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/ArrayFieldDeclarationChange.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/ArrayFieldDeclarationChange.java new file mode 100644 index 0000000000..180121b1b5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/ArrayFieldDeclarationChange.java @@ -0,0 +1,10 @@ +package org.splevo.tests.fielddeclaration; + +public class ArrayFieldDeclarationChange { + + public Object[] newValueArray = new Object[]{ + "value1", + "value2" + }; + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/NewInTheMiddle.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/NewInTheMiddle.java new file mode 100644 index 0000000000..4ac5adbffd --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/NewInTheMiddle.java @@ -0,0 +1,13 @@ +package org.splevo.tests.fielddeclaration; + +/** + * Class with new field declaration surrounded by two unchanged ones. + */ +public class NewInTheMiddle { + + /** Field not to change. */ + private String similar1 = "similar1"; + + /** Field not to change. */ + private String similar2 = "similar2"; +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/RemovedFromTheMiddle.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/RemovedFromTheMiddle.java new file mode 100644 index 0000000000..13fe986bc5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/a/RemovedFromTheMiddle.java @@ -0,0 +1,16 @@ +package org.splevo.tests.fielddeclaration; + +/** + * Class with new field declaration surrounded by two unchanged ones. + */ +public class RemovedFromTheMiddle { + + /** Field not to change. */ + private String similar1 = "similar1"; + + /** Remove Field. */ + private String removeField = "removeField"; + + /** Field not to change. */ + private String similar2 = "similar2"; +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/ArrayFieldDeclarationChange.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/ArrayFieldDeclarationChange.java new file mode 100644 index 0000000000..260453996a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/ArrayFieldDeclarationChange.java @@ -0,0 +1,11 @@ +package org.splevo.tests.fielddeclaration; + +public class ArrayFieldDeclarationChange { + + public Object[] newValueArray = new Object[]{ + "value1", + "valueInTheMiddle", + "value2" + }; + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/NewInTheMiddle.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/NewInTheMiddle.java new file mode 100644 index 0000000000..87fa764f56 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/NewInTheMiddle.java @@ -0,0 +1,16 @@ +package org.splevo.tests.fielddeclaration; + +/** + * Class with new field declaration surrounded by two unchanged ones. + */ +public class NewInTheMiddle { + + /** Field not to change. */ + private String similar1 = "similar1"; + + /** New Field. */ + private String newField = "newField"; + + /** Field not to change. */ + private String similar2 = "similar2"; +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/RemovedFromTheMiddle.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/RemovedFromTheMiddle.java new file mode 100644 index 0000000000..72e437a2c5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/fielddeclaration/b/RemovedFromTheMiddle.java @@ -0,0 +1,13 @@ +package org.splevo.tests.fielddeclaration; + +/** + * Class with new field declaration surrounded by two unchanged ones. + */ +public class RemovedFromTheMiddle { + + /** Field not to change. */ + private String similar1 = "similar1"; + + /** Field not to change. */ + private String similar2 = "similar2"; +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/a/ImportDiffing.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/a/ImportDiffing.java new file mode 100644 index 0000000000..38cb4bfd2e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/a/ImportDiffing.java @@ -0,0 +1,10 @@ +package org.splevo.tests.importdeclaration; + +import java.math.BigInteger; + +public class ImportDiffing { + + public void helloWorld(){ + + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/b/ImportDiffing.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/b/ImportDiffing.java new file mode 100644 index 0000000000..677c700523 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/import/b/ImportDiffing.java @@ -0,0 +1,10 @@ +package org.splevo.tests.importdeclaration; + +import java.math.BigDecimal; + +public class ImportDiffing { + + public void helloWorld(){ + + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitClassDiagram.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitClassDiagram.java new file mode 100644 index 0000000000..0d41902a1b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitClassDiagram.java @@ -0,0 +1,4 @@ +package org.splevo.test; + +public class InitClassDiagram { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUmlUI.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUmlUI.java new file mode 100644 index 0000000000..dda43b6e56 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUmlUI.java @@ -0,0 +1,4 @@ +package org.splevo.test; + +public class InitUmlUI { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUseCaseDiagram.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUseCaseDiagram.java new file mode 100644 index 0000000000..52b488c543 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/InitUseCaseDiagram.java @@ -0,0 +1,4 @@ +package org.splevo.test; + +public class InitUseCaseDiagram { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/SubsystemUtility.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/SubsystemUtility.java new file mode 100644 index 0000000000..acf804dd74 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/SubsystemUtility.java @@ -0,0 +1,5 @@ +package org.splevo.test; + +public class SubsystemUtility { + public static void initSubsystem(Object targetObject){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/TestClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/TestClass.java new file mode 100644 index 0000000000..b7f0f8271f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/a/org/splevo/test/TestClass.java @@ -0,0 +1,11 @@ +package org.splevo.test; + +public class TestClass { + private static void initializeSubsystems() { + + SubsystemUtility.initSubsystem(new InitClassDiagram()); + + SubsystemUtility.initSubsystem(new InitUmlUI()); + + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitClassDiagram.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitClassDiagram.java new file mode 100644 index 0000000000..0d41902a1b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitClassDiagram.java @@ -0,0 +1,4 @@ +package org.splevo.test; + +public class InitClassDiagram { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUmlUI.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUmlUI.java new file mode 100644 index 0000000000..dda43b6e56 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUmlUI.java @@ -0,0 +1,4 @@ +package org.splevo.test; + +public class InitUmlUI { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUseCaseDiagram.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUseCaseDiagram.java new file mode 100644 index 0000000000..52b488c543 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/InitUseCaseDiagram.java @@ -0,0 +1,4 @@ +package org.splevo.test; + +public class InitUseCaseDiagram { +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/SubsystemUtility.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/SubsystemUtility.java new file mode 100644 index 0000000000..acf804dd74 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/SubsystemUtility.java @@ -0,0 +1,5 @@ +package org.splevo.test; + +public class SubsystemUtility { + public static void initSubsystem(Object targetObject){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/TestClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/TestClass.java new file mode 100644 index 0000000000..7900416ca6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methodcalls/b/org/splevo/test/TestClass.java @@ -0,0 +1,14 @@ +package org.splevo.test; + +public class TestClass { + private static void initializeSubsystems() { + + SubsystemUtility.initSubsystem(new InitClassDiagram()); + + //@#$LPS-USECASEDIAGRAM:GranularityType:Statement + SubsystemUtility.initSubsystem(new InitUseCaseDiagram()); + + SubsystemUtility.initSubsystem(new InitUmlUI()); + + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/ClassA.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/ClassA.java new file mode 100644 index 0000000000..12ed02ab53 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/ClassA.java @@ -0,0 +1,24 @@ +package org.splevo.tests.methoddeclaration; + + +public class ClassA { + + + /** + * Method to check the matching of an invocation of + * an anonymous' class method. + */ + public void anonymousClassMethodInvocation(){ + + Comparable comp = new Comparable() { + @Override + public int compareTo(String arg0) { + return 0; + } + }; + + comp.compareTo("Hello"); + + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/Constructor.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/Constructor.java new file mode 100644 index 0000000000..3f88e2622a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/a/Constructor.java @@ -0,0 +1,10 @@ +package org.splevo.tests.methoddeclaration; + + +public class Constructor { + + public Constructor(){ + + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/ClassA.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/ClassA.java new file mode 100644 index 0000000000..f704ea3de6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/ClassA.java @@ -0,0 +1,26 @@ +package org.splevo.tests.methoddeclaration; + +public class ClassA { + + public void newMethod(){ + System.out.println("a"); + } + + /** + * Method to check the matching of an invocation of + * an anonymous' class method. + */ + public void anonymousClassMethodInvocation(){ + + Comparable comp = new Comparable() { + @Override + public int compareTo(String arg0) { + return 0; + } + }; + + comp.compareTo("Hello"); + + } + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/Constructor.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/Constructor.java new file mode 100644 index 0000000000..0a5b27e597 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/methoddeclaration/b/Constructor.java @@ -0,0 +1,10 @@ +package org.splevo.tests.methoddeclaration; + + +public class Constructor { + + public Constructor(String newParam){ + + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/a/Primitives.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/a/Primitives.java new file mode 100644 index 0000000000..edfd5fcd8c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/a/Primitives.java @@ -0,0 +1,12 @@ +package org.splevo.tests.importdeclaration; + +public class Primitives { + + public void doVoid() { + int a = 1; + } + + public int doNumeric() { + return 1; + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/b/Primitives.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/b/Primitives.java new file mode 100644 index 0000000000..02c8e01e96 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/primitives/b/Primitives.java @@ -0,0 +1,12 @@ +package org.splevo.tests.importdeclaration; + +public class Primitives { + + public void doVoid() { + double a = 1; + } + + public double doNumeric() { + return 1; + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/DummyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/DummyClass.java new file mode 100644 index 0000000000..42502b938b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/DummyClass.java @@ -0,0 +1,3 @@ +public DummyClass { + public void doSth(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/Test.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/Test.java new file mode 100644 index 0000000000..8a1d741683 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/a/de/splevo/test/Test.java @@ -0,0 +1,11 @@ +package de.splevo.test; + +/** + * Testcode to test mapping configurations. + */ +public class Test { + + public void doSth(){ + + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/DummyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/DummyClass.java new file mode 100644 index 0000000000..42502b938b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/DummyClass.java @@ -0,0 +1,3 @@ +public DummyClass { + public void doSth(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/TestCust.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/TestCust.java new file mode 100644 index 0000000000..11c7e8359c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/renaming/b/de/splevo/cust/test/TestCust.java @@ -0,0 +1,11 @@ +package de.splevo.cust.test; + +/** + * Testcode to test mapping configurations. + */ +public class Test { + + public void doSth(){ + + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/DummyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/DummyClass.java new file mode 100644 index 0000000000..d45c39ba5f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/DummyClass.java @@ -0,0 +1,5 @@ +package org.splevo.test; + +public DummyClass { + public void doSth(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/sub/DummyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/sub/DummyClass.java new file mode 100644 index 0000000000..3c003474b4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/a/org/splevo/test/sub/DummyClass.java @@ -0,0 +1,5 @@ +package org.splevo.test.sub; + +public DummyClass { + public void doSth(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/DummyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/DummyClass.java new file mode 100644 index 0000000000..d45c39ba5f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/DummyClass.java @@ -0,0 +1,5 @@ +package org.splevo.test; + +public DummyClass { + public void doSth(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/sub/DummyClass.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/sub/DummyClass.java new file mode 100644 index 0000000000..3c003474b4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/similarclasses-differentpackages/b/org/splevo/test/sub/DummyClass.java @@ -0,0 +1,5 @@ +package org.splevo.test.sub; + +public DummyClass { + public void doSth(){} +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayAccesses.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayAccesses.java new file mode 100644 index 0000000000..ae0c1ae46b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayAccesses.java @@ -0,0 +1,19 @@ +package org.splevo.tests.statements; + +public class ArrayAccesses { + + public static void main(String[] args) { + + @SuppressWarnings("unused") + String projectName; + for(int i = 0; i < args.length; i++){ + if (args[i].equalsIgnoreCase("-print") + && i + 1 < args.length) { + projectName = args[++i]; + } + } + + Object[] elements = new Object[args.length][2]; + + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccess.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccess.java new file mode 100644 index 0000000000..78ceb822e6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccess.java @@ -0,0 +1,13 @@ +package org.splevo.tests.statements; + +public class ClassArrayItemAccess { + + public void newStatement(){ + + String[] = new String[4]; + + String[0] = new String("0"); + String[1] = new String("1"); + String[2] = new String("2"); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccessWithSameContainerIdentifier.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccessWithSameContainerIdentifier.java new file mode 100644 index 0000000000..74170de443 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ArrayItemAccessWithSameContainerIdentifier.java @@ -0,0 +1,11 @@ +package a; + +public class Loop { + + public void print() { + Object[] cache; + for (int i = 0; cache[i] != null; i++) { + } + } + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ChangeInsideSiblingBlock.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ChangeInsideSiblingBlock.java new file mode 100644 index 0000000000..fcd23e703e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ChangeInsideSiblingBlock.java @@ -0,0 +1,20 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ChangeInsideSiblingBlock { + + protected void doSth() { + + if(true) { + 1 + 1; + + if(true) { + 3 + 3; + } + } + + } + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ClassStatementInsert.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ClassStatementInsert.java new file mode 100644 index 0000000000..0979786e4a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ClassStatementInsert.java @@ -0,0 +1,29 @@ +package org.splevo.tests.statements; + +public class ClassStatementInsert { + + public void newStatement(){ + + System.out.println(new Integer(0)); + + + + System.out.println(new Double(0)); + + Boolean f = null; + f = super.equals(new Object()); + + int i = 0; + int j = Integer.valueOf("0") + (i++); + } + + public void statementOrder(){ + + int x, y; + + x = 3; + x = 5; + y = 10; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchAndExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchAndExpression.java new file mode 100644 index 0000000000..ad3e7ccf84 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchAndExpression.java @@ -0,0 +1,18 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ConditionMatchAndExpression { + + public String doSth(String[] a) { + + if (a.length() > 0 && true) { + return "existing conditional"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchInstanceOfExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchInstanceOfExpression.java new file mode 100644 index 0000000000..31eba93ed2 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchInstanceOfExpression.java @@ -0,0 +1,15 @@ +package org.splevo.tests.statements; + +public class ConditionMatchInstanceOfExpression { + + public String doSth(Object a) { + + if(a instanceof Integer) { + return "existing instanceof"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchOrExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchOrExpression.java new file mode 100644 index 0000000000..d95c52bb4a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchOrExpression.java @@ -0,0 +1,18 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ConditionMatchOrExpression { + + public String doSth(String[] a) { + + if (a.length() > 0 || true) { + return "existing conditional"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchRelationExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchRelationExpression.java new file mode 100644 index 0000000000..e4a95861f9 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchRelationExpression.java @@ -0,0 +1,18 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ConditionMatchRelationExpression { + + public String doSth(String[] a) { + + if (a.length() > 0) { + return "existing conditional"; + } + + for (int i = 0; i < 10; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchUnaryExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchUnaryExpression.java new file mode 100644 index 0000000000..6b8271a9d0 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ConditionMatchUnaryExpression.java @@ -0,0 +1,18 @@ +package org.splevo.tests.statements; + +import java.util.List; + +public class ConditionMatchUnaryExpression { + + public String doSth(List a) { + + if(!(String.CASE_INSENSITIVE_ORDER.equals(a.iterator().next()) + && a.size() == ("test".length() + 1))) { + return "existing conditional"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/EnumAccesses.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/EnumAccesses.java new file mode 100644 index 0000000000..ab3b92c2dc --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/EnumAccesses.java @@ -0,0 +1,16 @@ +package org.splevo.tests.statements; + +public class EnumAccesses { + + public void doSth() { + Container.TestEnum var = Container.TestEnum.EnumItem1; + } +} + +class Container { + + public enum TestEnum { + EnumItem1, + EnumItem2 + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ForLoopWithIterator.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ForLoopWithIterator.java new file mode 100644 index 0000000000..afee1595fc --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ForLoopWithIterator.java @@ -0,0 +1,12 @@ +package org.splevo.tests.statements; + +public class ConditionalVariable { + + protected void doSth(Collection c) { + for (Iterator i = c.iterator(); i.hasNext(); ) { + Object o = i.next(); + System.out.println(o); + } + } + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseMultipleStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseMultipleStatements.java new file mode 100644 index 0000000000..507fda681e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseMultipleStatements.java @@ -0,0 +1,19 @@ +package org.splevo.tests.statements; + +public class IfElseMultipleStatements { + + public int elseIf(int a) { + if (a == 0) { + return 0 + 0; + + } else if (a == 1) { + return 1 + 1; + + } else if (a == 2) { + return 2 + 2; + + } else if (a == 3) { + return 3 + 3; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseStatements.java new file mode 100644 index 0000000000..c443851838 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfElseStatements.java @@ -0,0 +1,13 @@ +package org.splevo.tests.statements; + +public class IfElseStatements { + + public void elseIf(int a) { + if (a == 1) { + 1 + 1; + + } else if (a == 2) { + 2 + 2; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfIfStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfIfStatements.java new file mode 100644 index 0000000000..b44eb2d39b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfIfStatements.java @@ -0,0 +1,10 @@ +package org.splevo.tests.statements; + +public class IfIfStatements { + + public void ifIf() { + if (toString().equals("a")) { + 2 + 2; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfStatements.java new file mode 100644 index 0000000000..01931188db --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/IfStatements.java @@ -0,0 +1,66 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class IfStatements { + + public void newIfStatementTest(String a) { + + if (a.length() > 1) { + System.out.println(); + } + } + + public void changedConditionIfStatementTest(String a) { + + if ("value1" == null) { + return; + } + + if ("valueA" == null) { + return; + } + } + + public void unChangedConditionIfStatementTest(String a) { + + if (true && (toString() instanceof Object)) { + return; + } + + for (int i = 0; i < a.toCharArray().length; i++) { + System.out.println(i); + } + + boolean result = true; + if (!result) { + System.out.println(result); + } + + int pos = 1; + if (pos == -1) { + return; + } + + if (new Object() == this) { + return; + } + + if (new Object() == String.class) { + + } + + LinkedList umlPredecessors = new LinkedList(); + Iterator it; + it = (umlPredecessors != null) ? umlPredecessors.iterator() : null; + } + + public void elseIf(int a) { + if (a == 1) { + System.out.println("1"); + } else if (a == 2) { + System.out.println("2"); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/LoopStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/LoopStatements.java new file mode 100644 index 0000000000..1f78fab814 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/LoopStatements.java @@ -0,0 +1,55 @@ +package org.splevo.tests.statements; + +import java.util.ArrayList; + +public class LoopStatements { + + public LoopStatements() { + } + + public void ForUnchanged(){ + + for (int i = 0; i < 10; i++) { + System.out.println(""+i); + } + } + + public void ForChanged(){ + + for (int i = 0; i < 10; i++) { + System.out.println(""+i); + } + } + + public void EnhancedForUnchanged(){ + + ArrayList items = new ArrayList(); + for (String item : items) { + System.out.println(item); + } + } + + public void EnhancedForChanged(){ + + ArrayList items = new ArrayList(); + ArrayList items2 = new ArrayList(); + for (String item : items) { + System.out.println(item); + } + } + + public void WhileUnchanged(int a){ + + while(a < 10){ + System.out.println("endlessLoop"); + } + } + + public void WhileChanged(int a){ + + while(a < 10){ + System.out.println("endlessLoop"); + } + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ReturnStatementChanges.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ReturnStatementChanges.java new file mode 100644 index 0000000000..59645626f5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ReturnStatementChanges.java @@ -0,0 +1,22 @@ +package org.splevo.tests.statements; + +public class ReturnStatementChanges { + + public void doSth(String a){ + + return; + } + + public void noReturn(){ + + } + + public String returnWithExpression(){ + return "Hello"; + } + + public String returnWithExpressionEqual(){ + return "Good Morning"; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/StaticInitialization.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/StaticInitialization.java new file mode 100644 index 0000000000..187cfc6f7e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/StaticInitialization.java @@ -0,0 +1,16 @@ +package org.splevo.tests.statements; + +public class StaticInitialization { + + public static final String ID1 = "ID1"; + + static{ + + putDefaultShortcut(ID1, null, new String()); + + } + + private static void putDefaultShortcut(String id, Object defaultValue, Object action){ + + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/Synchronized.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/Synchronized.java new file mode 100644 index 0000000000..2d5872b1eb --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/Synchronized.java @@ -0,0 +1,14 @@ +package org.splevo.tests.statements; + +public class Synchronized { + + private Object synchronizationObject = new Byte[0]; + + public void synchronizeOnField() { + + + synchronized (synchronizationObject) { + return "synchronizeOnField"; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ThrowStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ThrowStatements.java new file mode 100644 index 0000000000..f442487481 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/ThrowStatements.java @@ -0,0 +1,28 @@ +package org.splevo.tests.statements; + +/** + * Class with methods containing different throw variations. + */ +public class ThrowStatements { + + public static void similarThrow(){ + throw new IllegalArgumentException(); + } + + public static void similarThrowWithParameter(){ + throw new IllegalArgumentException("Error"); + } + + public static void changedThrow(){ + throw new IllegalArgumentException(); + } + + public static void changedThrowWithParameter(){ + throw new IllegalArgumentException("Error"); + } + + public static void throwWithChangedParameter(){ + throw new IllegalArgumentException("Error"); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/TryCatch.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/TryCatch.java new file mode 100644 index 0000000000..79796dfb58 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/TryCatch.java @@ -0,0 +1,23 @@ +package org.splevo.tests.statements; + +public class TryCatch { + + public String similarTryCatch(){ + try{ + return "hello"; + } catch (RuntimeException e){ + return "e"; + } catch (Exception iea){ + return "iea"; + } + } + + public String changedTryCatch(){ + try{ + return "hello"; + } catch (Exception iea){ + return "iea"; + } + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/VariableDeclarationStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/VariableDeclarationStatements.java new file mode 100644 index 0000000000..9a531bc59b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/a/VariableDeclarationStatements.java @@ -0,0 +1,9 @@ +package org.splevo.tests.statements; + +public class VariableDeclarationStatements { + + public void doSth(){ + String var1, var2 = "Hello"; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayAccesses.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayAccesses.java new file mode 100644 index 0000000000..46d4c2b1bf --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayAccesses.java @@ -0,0 +1,20 @@ +package org.splevo.tests.statements; + +public class ArrayAccesses { + + public static void main(String[] args) { + + @SuppressWarnings("unused") + String projectName; + for(int i = 0; i < args.length; i++){ + if (args[i].equalsIgnoreCase("-print") + && i + 1 < args.length) { + projectName = args[++i]; + } + } + + Object[] elements = new Object[args.length][2]; + + + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccess.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccess.java new file mode 100644 index 0000000000..9008e333dd --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccess.java @@ -0,0 +1,14 @@ +package org.splevo.tests.statements; + +public class ClassArrayItemAccess { + + public void newStatement(){ + + String[] = new String[4]; + + String[0] = new String("0"); + String[1] = new String("1"); + String[3] = new String("3"); + String[2] = new String("2"); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccessWithSameContainerIdentifier.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccessWithSameContainerIdentifier.java new file mode 100644 index 0000000000..7a3c91d18f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ArrayItemAccessWithSameContainerIdentifier.java @@ -0,0 +1,11 @@ +package a; + +public class Loop { + + public void print() { + Object[] cache; + for (int i = 0; cache[i] != null; i++) { + } + } + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ChangeInsideSiblingBlock.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ChangeInsideSiblingBlock.java new file mode 100644 index 0000000000..6f3eab0d12 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ChangeInsideSiblingBlock.java @@ -0,0 +1,22 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ChangeInsideSiblingBlock { + + protected void doSth() { + + if(true) { + 1 + 1; + 2 + 2; // added + + if(true) { + 3 + 3; + 4 + 4; // added + } + } + + } + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ClassStatementInsert.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ClassStatementInsert.java new file mode 100644 index 0000000000..e69edf7fb4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ClassStatementInsert.java @@ -0,0 +1,29 @@ +package org.splevo.tests.statements; + +public class ClassStatementInsert { + + public void newStatement(){ + + System.out.println(new Integer(0)); + + System.out.println(new String()); + + System.out.println(new Double(0)); + + Boolean f = null; + f = super.equals(new Object()); + + int i = 0; + int j = Integer.valueOf("0") + (i++); + } + + public void statementOrder(){ + + int x, y; + + y = 10; + x = 5; + x = 3; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchAndExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchAndExpression.java new file mode 100644 index 0000000000..173ecbccfd --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchAndExpression.java @@ -0,0 +1,22 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ConditionMatchAndExpression { + + public String doSth(String[] a) { + + if(true && a.length() > 0) { + return "new conditional"; + } + + if (a.length() > 0 && true) { + return "existing conditional"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchInstanceOfExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchInstanceOfExpression.java new file mode 100644 index 0000000000..7b6a6dee98 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchInstanceOfExpression.java @@ -0,0 +1,19 @@ +package org.splevo.tests.statements; + +public class ConditionMatchInstanceOfExpression { + + public String doSth(Object a) { + + if(a instanceof String) { + return "new instanceof conditional"; + } + + if(a instanceof Integer) { + return "existing instanceof"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchOrExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchOrExpression.java new file mode 100644 index 0000000000..37bd143c9c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchOrExpression.java @@ -0,0 +1,22 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ConditionMatchOrExpression { + + public String doSth(String[] a) { + + if(true || a.length() > 0) { + return "new conditional"; + } + + if (a.length() > 0 || true) { + return "existing conditional"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchRelationExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchRelationExpression.java new file mode 100644 index 0000000000..938bb77d03 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchRelationExpression.java @@ -0,0 +1,22 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class ConditionMatchRelationExpression { + + public String doSth(String[] a) { + + if(getClass().getName().length() + a.length > 0) { + return "new conditional"; + } + + if (a.length() > 0) { + return "existing conditional"; + } + + for (int i = 0; i < 10; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchUnaryExpression.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchUnaryExpression.java new file mode 100644 index 0000000000..8d9a2152bd --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ConditionMatchUnaryExpression.java @@ -0,0 +1,22 @@ +package org.splevo.tests.statements; + +import java.util.List; + +public class ConditionMatchUnaryExpression { + + public String doSth(List a) { + + if(!String.CASE_INSENSITIVE_ORDER.equals(a.iterator().next())) { + return "new unary conditional"; + } + + if(!(String.CASE_INSENSITIVE_ORDER.equals(a.iterator().next()) + && a.size() == ("test".length() + 1))) { + return "existing conditional"; + } + + for (int i = 0; i < 10 && i >= 0; i++) { + System.out.println(""+i); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/EnumAccesses.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/EnumAccesses.java new file mode 100644 index 0000000000..ab3b92c2dc --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/EnumAccesses.java @@ -0,0 +1,16 @@ +package org.splevo.tests.statements; + +public class EnumAccesses { + + public void doSth() { + Container.TestEnum var = Container.TestEnum.EnumItem1; + } +} + +class Container { + + public enum TestEnum { + EnumItem1, + EnumItem2 + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ForLoopWithIterator.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ForLoopWithIterator.java new file mode 100644 index 0000000000..afee1595fc --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ForLoopWithIterator.java @@ -0,0 +1,12 @@ +package org.splevo.tests.statements; + +public class ConditionalVariable { + + protected void doSth(Collection c) { + for (Iterator i = c.iterator(); i.hasNext(); ) { + Object o = i.next(); + System.out.println(o); + } + } + +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseMultipleStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseMultipleStatements.java new file mode 100644 index 0000000000..ec6e025c03 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseMultipleStatements.java @@ -0,0 +1,22 @@ +package org.splevo.tests.statements; + +public class IfElseMultipleStatements { + + public int elseIf(int a) { + if (a == 0) { + return 0 + 0; + + } else if (a == 1) { + return 1 + 1; + + } else if (a == 54) { + return 54 + 54; + + } else if (a == 2) { + return 2 + 2; + + } else if (a == 3) { + return 3 + 3; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseStatements.java new file mode 100644 index 0000000000..8d0b508fae --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfElseStatements.java @@ -0,0 +1,16 @@ +package org.splevo.tests.statements; + +public class IfElseStatements { + + public void elseIf(int a) { + if (a == 1) { + 1 + 1; + + } else if (a == 54) { + 54 + 54; + + } else if (a == 2) { + 2 + 2; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfIfStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfIfStatements.java new file mode 100644 index 0000000000..fd5acb4baf --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfIfStatements.java @@ -0,0 +1,13 @@ +package org.splevo.tests.statements; + +public class IfIfStatements { + + public void ifIf() { + if (toString().equals("b")) { + 1 + 1; + } + if (toString().equals("a")) { + 2 + 2; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfStatements.java new file mode 100644 index 0000000000..fa7c42bdf4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/IfStatements.java @@ -0,0 +1,64 @@ +package org.splevo.tests.statements; + +import java.util.Iterator; +import java.util.LinkedList; + +public class IfStatements { + + public void newIfStatementTest(String a) { + + // new if statement before + if (a == null) { + return; + } + + if (a.length() > 1) { + System.out.println(); + } + } + + public void changedConditionIfStatementTest(String a) { + + if ("value1" == null) { + return; + } + + if ("valueB" == null) { + return; + } + } + + public void unChangedConditionIfStatementTest(String a) { + + if (true && (toString() instanceof Object)) { + return; + } + + for (int i = 0; i < a.toCharArray().length; i++) { + System.out.println(i); + } + + boolean result = true; + if (!result) { + System.out.println(result); + } + + int pos = 1; + if (pos == -1) { + return; + } + + if (new Object() == this) { + return; + } + + if (new Object() == String.class) { + + } + + LinkedList umlPredecessors = new LinkedList(); + Iterator it; + it = (umlPredecessors != null) ? umlPredecessors.iterator() : null; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/LoopStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/LoopStatements.java new file mode 100644 index 0000000000..e53d22c384 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/LoopStatements.java @@ -0,0 +1,55 @@ +package org.splevo.tests.statements; + +import java.util.ArrayList; + +public class LoopStatements { + + public LoopStatements() { + } + + public void ForUnchanged(){ + + for (int i = 0; i < 10; i++) { + System.out.println(""+i); + } + } + + public void ForChanged(){ + + for (int i = 5; i < 10; i++) { + System.out.println(""+i); + } + } + + public void EnhancedForUnchanged(){ + + ArrayList items = new ArrayList(); + for (String item : items) { + System.out.println(item); + } + } + + public void EnhancedForChanged(){ + + ArrayList items = new ArrayList(); + ArrayList items2 = new ArrayList(); + for (String item : items2) { + System.out.println(item); + } + } + + public void WhileUnchanged(int a){ + + while(a < 10){ + System.out.println("endlessLoop"); + } + } + + public void WhileChanged(int a){ + + while(a < 10 && a > 5){ + System.out.println("endlessLoop"); + } + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ReturnStatementChanges.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ReturnStatementChanges.java new file mode 100644 index 0000000000..27dcea25fa --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ReturnStatementChanges.java @@ -0,0 +1,26 @@ +package org.splevo.tests.statements; + +public class ReturnStatementChanges { + + public void doSth(String a){ + + if(a == null){ + return; + } + + return; + } + + public void noReturn(){ + return; + } + + public String returnWithExpression(){ + return "Good Bye"; + } + + public String returnWithExpressionEqual(){ + return "Good Morning"; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/StaticInitialization.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/StaticInitialization.java new file mode 100644 index 0000000000..76578a3baa --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/StaticInitialization.java @@ -0,0 +1,21 @@ +package org.splevo.tests.statements; + +public class StaticInitialization { + + public static final String ID0 = "ID0"; + + public static final String ID1 = "ID1"; + + + static{ + + putDefaultShortcut(ID2, null, new String()); + + putDefaultShortcut(ID1, null, new String()); + + } + + private static void putDefaultShortcut(String id, Object defaultValue, Object action){ + + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/Synchronized.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/Synchronized.java new file mode 100644 index 0000000000..2bd0e11bd8 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/Synchronized.java @@ -0,0 +1,16 @@ +package org.splevo.tests.statements; + +public class Synchronized { + + private Object synchronizationObject = new Byte[0]; + + public void synchronizeOnField() { + + + System.out.println("dummy change"); + + synchronized (synchronizationObject) { + return "synchronizeOnField"; + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ThrowStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ThrowStatements.java new file mode 100644 index 0000000000..edc5504924 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/ThrowStatements.java @@ -0,0 +1,28 @@ +package org.splevo.tests.statements; + +/** + * Class with methods containing different throw variations. + */ +public class ThrowStatements { + + public static void similarThrow(){ + throw new IllegalArgumentException(); + } + + public static void similarThrowWithParameter(){ + throw new IllegalArgumentException("Error"); + } + + public static void changedThrow(){ + throw new RuntimeException(); + } + + public static void changedThrowWithParameter(){ + throw new RuntimeException("Error"); + } + + public static void throwWithChangedParameter(){ + throw new IllegalArgumentException("Another Error"); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/TryCatch.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/TryCatch.java new file mode 100644 index 0000000000..e4a1a03e32 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/TryCatch.java @@ -0,0 +1,23 @@ +package org.splevo.tests.statements; + +public class TryCatch { + + public String similarTryCatch(){ + try{ + return "hello"; + } catch (RuntimeException e){ + return "e"; + } catch (Exception iea){ + return "iea"; + } + } + + public String changedTryCatch(){ + try{ + return "hello"; + } catch (RuntimeException e){ + return "e"; + } + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/VariableDeclarationStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/VariableDeclarationStatements.java new file mode 100644 index 0000000000..905b9355a3 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/statements/b/VariableDeclarationStatements.java @@ -0,0 +1,9 @@ +package org.splevo.tests.statements; + +public class VariableDeclarationStatements { + + public void doSth(){ + String var1, var3 = "Hello"; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/A.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/A.java new file mode 100644 index 0000000000..0c0e747850 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/A.java @@ -0,0 +1,11 @@ +package org.splevo.tests.variabledeclaration; + +import java.math.BigInteger; + +public class A { + + public void methodA() { + BigInteger integerValue1 = new BigInteger("1"); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/MultipleVariables.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/MultipleVariables.java new file mode 100644 index 0000000000..dc10e4a777 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/MultipleVariables.java @@ -0,0 +1,9 @@ +package org.splevo.tests; + +public class MultipleVariables { + + public void methodA() { + String varA = new String("1"); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/StringInitialization.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/StringInitialization.java new file mode 100644 index 0000000000..0607e7ab3a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/a/StringInitialization.java @@ -0,0 +1,27 @@ +package org.splevo.tests.variabledeclaration; + +public class StringInitialization { + + private static final String EXPORTER_NAME = "Test Exporter"; + private static final String EXPORTER_VERSION = "1.4"; + private static final String UML_VERSION = "1.4"; + + private String version = "1"; + + public void doSth() { + String header = + " \n" + + " ArgoUML" + + " (using " + EXPORTER_NAME + + " version " + EXPORTER_VERSION + + ")\n" + + " " + version + + " revised on " + + "$Date: 2010-09-26 00:23:13 +0200 (Sun, 26 Sep 2010) $ " + + "\n" + + " \n" + + " "; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/A.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/A.java new file mode 100644 index 0000000000..7c5bf63ed6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/A.java @@ -0,0 +1,11 @@ +package org.splevo.tests.variabledeclaration; + +import java.math.BigDecimal; + +public class A { + + public void methodA() { + BigDecimal integerValue1 = new BigDecimal("1"); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/MultipleVariables.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/MultipleVariables.java new file mode 100644 index 0000000000..7ee41b1781 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/MultipleVariables.java @@ -0,0 +1,10 @@ +package org.splevo.tests; + +public class MultipleVariables { + + public void methodA() { + String newVarA = new String("0"); + String varA = new String("1"); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/StringInitialization.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/StringInitialization.java new file mode 100644 index 0000000000..0607e7ab3a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/splevo-testmodels/implementation/variabledeclaration/b/StringInitialization.java @@ -0,0 +1,27 @@ +package org.splevo.tests.variabledeclaration; + +public class StringInitialization { + + private static final String EXPORTER_NAME = "Test Exporter"; + private static final String EXPORTER_VERSION = "1.4"; + private static final String UML_VERSION = "1.4"; + + private String version = "1"; + + public void doSth() { + String header = + " \n" + + " ArgoUML" + + " (using " + EXPORTER_NAME + + " version " + EXPORTER_VERSION + + ")\n" + + " " + version + + " revised on " + + "$Date: 2010-09-26 00:23:13 +0200 (Sun, 26 Sep 2010) $ " + + "\n" + + " \n" + + " "; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/SPLevoModelsSimilarityTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/SPLevoModelsSimilarityTest.java new file mode 100644 index 0000000000..835b9207a6 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/SPLevoModelsSimilarityTest.java @@ -0,0 +1,373 @@ +package cipm.consistency.fitests.similarity.jamopp; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Collection; +import java.util.TreeSet; +import java.util.stream.Stream; + +import org.apache.log4j.Logger; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import jamopp.options.ParserOptions; +import jamopp.parser.jdt.singlefile.JaMoPPJDTSingleFileParser; + +/** + * A test class that attempts to parse and check similarity of {@link Resource} + * files. + * + * @author Alp Torac Genc + */ +public class SPLevoModelsSimilarityTest extends AbstractJaMoPPSimilarityTest { + private static final Logger LOGGER = Logger.getLogger("cipm." + SPLevoModelsSimilarityTest.class.getSimpleName()); + + /** + * The name of the root directory of the models from SPLevo + */ + private static final String splevoModelImplDirName = "splevo-testmodels"; + /** + * Path to the root folder of the models from SPLevo + */ + private static final String splevoModelImplPath = new File("").getAbsoluteFile().getAbsolutePath() + File.separator + + splevoModelImplDirName; + + /** + * List of the parent directory of the directories {@link #model1Name} and + * {@link #model2Name}. + */ + private static final Collection modelDirs = new ArrayList(); + + /** + * The first model to parse. + */ + private static final String model1Name = "a"; + /** + * The second model to parse. + */ + private static final String model2Name = "b"; + + /** + * The path, at which the resource file's URI will point at. + */ + private static Path targetPath = Path + .of(new File("").getAbsoluteFile().getAbsolutePath() + File.separator + "testModels"); + + /** + * Discovers the sub-directories under the root folder of SPLevo tests, which + * contain Java source files in folders with certain names, and adds them to a + * list. + */ + @BeforeAll + public static void setUpBeforeAll() { + modelDirs.addAll(discoverFiles(new File(splevoModelImplPath))); + } + + /** + * Reads the given file and removes line breaks and whitespaces. + */ + private static String readEffectiveCode(File f) throws IOException { + var content = Files.readString(f.toPath()); + + return content.replaceAll("\\n", "").replaceAll("\\r", "").replaceAll("\\s", ""); + } + + /** + * Compares the equality of the given files based on their effective content. + * + * @see {@link #readEffectiveCode(File)} + */ + private static boolean filesEqual(File f1, File f2) throws IOException { + var f1Content = readEffectiveCode(f1); + var f2Content = readEffectiveCode(f2); + + return f1Content.equals(f2Content); + } + + /** + * Recursively checks the equality of the given directories, based on their + * content (i.e. the files/sub-directories they contain and the contents of + * those files). + * + * @see {@link #filesEqual(File, File)}, {@link #readEffectiveCode(File)} + */ + private static boolean dirsEqual(File dir1, File dir2) throws IOException { + LOGGER.debug("Comparing: " + dir1.getName() + " and " + dir2.getName()); + + // There cannot be 2 files with the same path, name and extension + // so using TreeSet, which sorts the files spares doing so here + var files1 = new TreeSet(); + var files2 = new TreeSet(); + + for (var f : dir1.listFiles()) { + files1.add(f); + } + + for (var f : dir2.listFiles()) { + files2.add(f); + } + + if (files1.size() != files2.size()) { + return false; + } + + var fileIter1 = files1.iterator(); + var fileIter2 = files2.iterator(); + + for (int i = 0; i < files1.size(); i++) { + var f1 = fileIter1.next(); + var f2 = fileIter2.next(); + + if (f1.isDirectory() && f2.isDirectory()) { + if (!dirsEqual(f1, f2)) { + LOGGER.debug("Directories " + f1.getName() + " and " + f2.getName() + " are not equal"); + return false; + } + } else if (f1.isFile() && f2.isFile()) { + if (!filesEqual(f1, f2)) { + LOGGER.debug("Files " + f1.getName() + " and " + f2.getName() + " are not equal"); + return false; + } + } else { + LOGGER.debug("Unexpected case there is a file and a directory"); + return false; + } + } + + return true; + } + + /** + * Parses all Java-Model files under the given directory into a {@link Resource} + * instance. + * + * Note: This method will parse ALL such files. Therefore, the given model + * directory should only contain one Java-Model. + * + * @param modelDir The directory that contains the Java-model files + */ + private static Resource parseModelsDir(Path modelDir) { + // Leave out commented options + ParserOptions.CREATE_LAYOUT_INFORMATION.setValue(Boolean.FALSE); + ParserOptions.REGISTER_LOCAL.setValue(Boolean.TRUE); +// ParserOptions.RESOLVE_EVERYTHING.setValue(Boolean.TRUE); +// ParserOptions.RESOLVE_ALL_BINDINGS.setValue(Boolean.TRUE); + + JaMoPPJDTSingleFileParser parser = new JaMoPPJDTSingleFileParser(); + parser.setResourceSet(new ResourceSetImpl()); + ResourceSet resourceSet = parser.parseDirectory(modelDir); + + ResourceSet next = new ResourceSetImpl(); + Resource all = next.createResource(URI.createFileURI(targetPath.toAbsolutePath().toString())); + + var filteredResources = new ArrayList(); + resourceSet.getResources().stream().filter((r) -> r.getURI().path().contains(splevoModelImplDirName)) + .forEach((r) -> filteredResources.add(r)); + + for (Resource r : filteredResources) { + // Filter Resources in ResourceSet that belong in the modelDir (based on URI) + all.getContents().addAll(r.getContents()); + } + return all; + } + + /** + * Recursively searches for directories that contain Java-model files. All + * directories with pre-defined model names (currently {@link #model1Name} and + * {@link #model2name}) will be added to foundModelDirs, if not already there. + * + * @param dirToDiscover The directory, where the recursive search will begin + * @param foundModelDirs A collection of directories that contain Java-model + * files + */ + private static void discoverFiles(File dirToDiscover, Collection foundModelDirs) { + if (dirToDiscover != null && dirToDiscover.isDirectory()) { + var discovered = new ArrayList(); + + for (var f : dirToDiscover.listFiles()) { + if (!f.getName().equals(model1Name) && !f.getName().equals(model2Name)) { + discovered.add(f); + } else if (!foundModelDirs.contains(dirToDiscover.toPath())) { + foundModelDirs.add(dirToDiscover.toPath()); + } + } + + discovered.forEach((d) -> discoverFiles(d, foundModelDirs)); + } + } + + /** + * Recursively searches for directories containing Java-Model files, starting + * from the given directory, and returns a list of all such directories. + */ + private static Collection discoverFiles(File dirToDiscover) { + var foundModelDirs = new ArrayList(); + discoverFiles(dirToDiscover, foundModelDirs); + return foundModelDirs; + } + + private static String getDisplayName(Path path) { + var nameCount = path.getNameCount(); + + var startIndex = nameCount > 2 ? nameCount - 2 : nameCount - 1; + var endIndex = nameCount; + + return path.subpath(startIndex, endIndex).toString(); + } + + /** + * Creates and returns parameters for + * {@link #sameResourceSimilarityTest(Resource, Resource, Boolean, String)}. + */ + private static Stream generateReferenceEqualityTestParams() { + var args = new ArrayList(); + + modelDirs.forEach((md) -> { + var model1Path = Paths.get(md.toString(), model1Name); + var model2Path = Paths.get(md.toString(), model2Name); + + var res1 = parseModelsDir(model1Path); + var res2 = parseModelsDir(model2Path); + + args.add(Arguments.of(res1, res1, true, getDisplayName(model1Path))); + args.add(Arguments.of(res2, res2, true, getDisplayName(model2Path))); + }); + + return args.stream(); + } + + /** + * Creates and returns parameters for + * {@link #sameFileSimilarityTest(Resource, Resource, Boolean, String)}. + */ + private static Stream generateEqualityTestParams() { + var args = new ArrayList(); + + modelDirs.forEach((md) -> { + var model1Path = Paths.get(md.toString(), model1Name); + var model2Path = Paths.get(md.toString(), model2Name); + + var res11 = parseModelsDir(model1Path); + var res12 = parseModelsDir(model1Path); + + var res21 = parseModelsDir(model2Path); + var res22 = parseModelsDir(model2Path); + + args.add(Arguments.of(res11, res12, true, getDisplayName(model1Path))); + args.add(Arguments.of(res21, res22, true, getDisplayName(model2Path))); + }); + + return args.stream(); + } + + /** + * Creates and returns parameters for + * {@link #differentFileSimilarityTest(Resource, Resource, Boolean, String)}. + */ + private static Stream generateUnsimilarityTestParams() { + var args = new ArrayList(); + + modelDirs.forEach((md) -> { + var modelDirName = md.getName(md.getNameCount() - 1).toString(); + + var model1Path = Paths.get(md.toString(), model1Name); + var model2Path = Paths.get(md.toString(), model2Name); + + var contentEquality = false; + + try { + contentEquality = dirsEqual(model1Path.toFile(), model2Path.toFile()); + } catch (IOException e) { + LOGGER.debug("Could not read paths: " + model1Path.toString() + " and " + model2Path.toString()); + Assertions.fail(); + } + + LOGGER.debug(md.getFileName() + " contents equal: " + contentEquality); + + var res1 = parseModelsDir(model1Path); + var res2 = parseModelsDir(model2Path); + + args.add(Arguments.of(res1, res2, contentEquality, + modelDirName + " (" + model1Name + " and " + model2Name + ")")); + }); + + return args.stream(); + } + + /** + * Checks whether the given {@link Resource} instances are similar, based on + * {@code res_i.getAllContents()} + */ + protected void testSimilarity(Resource res1, Resource res2, Boolean areSimilar) { + var list1 = new ArrayList(); + var list2 = new ArrayList(); + + // Java files, which are not in proper project settings, + // can result in similarity checking issues, if resource.getContents() + // is used to return the EObject contents. + // getAllContents() bypasses this, as it makes sure that everything + // is visited. + res1.getAllContents().forEachRemaining((o) -> list1.add(o)); + res2.getAllContents().forEachRemaining((o) -> list2.add(o)); + + Assertions.assertEquals(areSimilar, this.areSimilar(list1, list2)); + } + + /** + * Checks if parsed {@link Resource} instances are detected as similar. Checks + * the similarity of res1 with itself (same reference) and res2 with itself + * (same reference). + * + * @param res1 The first {@link Resource} instance + * @param res2 The second {@link Resource} instance + * @param areSimilar Expected similarity value + * @param displayName The display name of the test + */ + @ParameterizedTest(name = "{3}") + @MethodSource({ "generateReferenceEqualityTestParams" }) + public void sameResourceSimilarityTest(Resource res1, Resource res2, Boolean areSimilar, String displayName) { + this.testSimilarity(res1, res2, areSimilar); + } + + /** + * Checks if parsed {@link Resource} instances are detected as similar. Checks + * the similarity of res1 with its clone and res2 with its clone. + * + * @param res1 The first {@link Resource} instance + * @param res2 The second {@link Resource} instance + * @param areSimilar Expected similarity value + * @param displayName The display name of the test + */ + @ParameterizedTest(name = "{3}") + @MethodSource({ "generateEqualityTestParams" }) + public void sameFileSimilarityTest(Resource res1, Resource res2, Boolean areSimilar, String displayName) { + this.testSimilarity(res1, res2, areSimilar); + } + + /** + * Checks if parsed {@link Resource} instances are detected as similar. Checks + * the similarity of res1 with res2. + * + * @param res1 The first {@link Resource} instance + * @param res2 The second {@link Resource} instance + * @param areSimilar Expected similarity value + * @param displayName The display name of the test + */ + @ParameterizedTest(name = "{3}") + @MethodSource({ "generateUnsimilarityTestParams" }) + public void differentFileSimilarityTest(Resource res1, Resource res2, Boolean areSimilar, String displayName) { + this.testSimilarity(res1, res2, areSimilar); + } +} From e0dfce41c0eca677e71d8ee44405f56d6512676b Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:43:35 +0100 Subject: [PATCH 77/87] Add package commentary --- .../consistency/fitests/similarity/base/package-info.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/package-info.java new file mode 100644 index 0000000000..69404da23c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/base/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains test classes and interfaces that depend on + * {@link org.splevo.jamopp.diffing.similarity} and/or its sub-packages. + */ +package cipm.consistency.fitests.similarity.base; \ No newline at end of file From a71c7c9867002a9a20a3b381af1d7c91c66960f4 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:45:59 +0100 Subject: [PATCH 78/87] Add helper interfaces for JaMoPP-related similarity checking tests These interfaces provide the means to quickly create certain JaMoPP objects in form of default methods. They can be implemented by the concrete tests. --- .../unittests/UsesAdditionalFields.java | 25 +++ .../UsesAdditionalLocalVariables.java | 26 +++ .../UsesAnnotationAttributeSettings.java | 59 +++++ .../unittests/UsesAnnotationInstances.java | 39 ++++ .../unittests/UsesAnnotationParameters.java | 48 +++++ .../unittests/UsesAnnotationValues.java | 14 ++ .../jamopp/unittests/UsesAnnotations.java | 24 +++ .../unittests/UsesAnonymousClasses.java | 37 ++++ .../jamopp/unittests/UsesArrayDimensions.java | 44 ++++ .../unittests/UsesArrayInitializers.java | 36 ++++ .../jamopp/unittests/UsesArraySelectors.java | 33 +++ .../jamopp/unittests/UsesCatchBlocks.java | 39 ++++ .../unittests/UsesConcreteClassifiers.java | 129 +++++++++++ .../jamopp/unittests/UsesEnumConstants.java | 24 +++ .../jamopp/unittests/UsesExpressions.java | 118 ++++++++++ .../jamopp/unittests/UsesFields.java | 25 +++ .../unittests/UsesImportingElements.java | 39 ++++ .../jamopp/unittests/UsesImports.java | 52 +++++ .../unittests/UsesLambdaParameters.java | 42 ++++ .../jamopp/unittests/UsesLiterals.java | 202 ++++++++++++++++++ .../jamopp/unittests/UsesLocalVariables.java | 24 +++ .../jamopp/unittests/UsesMethods.java | 64 ++++++ .../jamopp/unittests/UsesModifiers.java | 83 +++++++ .../unittests/UsesModuleDirectives.java | 70 ++++++ .../unittests/UsesModuleReferences.java | 39 ++++ .../jamopp/unittests/UsesModules.java | 35 +++ .../jamopp/unittests/UsesNames.java | 17 ++ .../jamopp/unittests/UsesOperators.java | 95 ++++++++ .../jamopp/unittests/UsesPackageImports.java | 25 +++ .../jamopp/unittests/UsesPackages.java | 49 +++++ .../jamopp/unittests/UsesParameters.java | 52 +++++ .../jamopp/unittests/UsesReferences.java | 11 + .../jamopp/unittests/UsesStatements.java | 154 +++++++++++++ .../unittests/UsesStringReferences.java | 25 +++ .../jamopp/unittests/UsesSwitchCases.java | 41 ++++ .../jamopp/unittests/UsesTypeArguments.java | 58 +++++ .../jamopp/unittests/UsesTypeParameters.java | 63 ++++++ .../jamopp/unittests/UsesTypeReferences.java | 68 ++++++ 38 files changed, 2028 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalFields.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalLocalVariables.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationAttributeSettings.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationInstances.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationParameters.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationValues.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotations.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnonymousClasses.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayDimensions.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayInitializers.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArraySelectors.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesCatchBlocks.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesConcreteClassifiers.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesEnumConstants.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesExpressions.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesFields.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImportingElements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImports.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLambdaParameters.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLiterals.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLocalVariables.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesMethods.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModifiers.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleDirectives.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleReferences.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModules.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesNames.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesOperators.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackageImports.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackages.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesParameters.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesReferences.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStatements.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStringReferences.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesSwitchCases.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeArguments.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeParameters.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeReferences.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalFields.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalFields.java new file mode 100644 index 0000000000..7750a7c33f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalFields.java @@ -0,0 +1,25 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.members.AdditionalField; + +import cipm.consistency.initialisers.jamopp.members.AdditionalFieldInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link AdditionalField} instances.
+ *
+ * Contains methods that can be used to create {@link AdditionalField} + * instances. + */ +public interface UsesAdditionalFields { + /** + * @param The name of the instance to be constructed + * @return A minimal {@link AdditionalField} instance with the given parameter. + */ + public default AdditionalField createMinimalAF(String afName) { + var afInit = new AdditionalFieldInitialiser(); + var af = afInit.instantiate(); + afInit.setName(af, afName); + return af; + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalLocalVariables.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalLocalVariables.java new file mode 100644 index 0000000000..ebcff93ade --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAdditionalLocalVariables.java @@ -0,0 +1,26 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.variables.AdditionalLocalVariable; + +import cipm.consistency.initialisers.jamopp.variables.AdditionalLocalVariableInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link AdditionalLocalVariable} instances.
+ *
+ * Contains methods that can be used to create {@link AdditionalLocalVariable} + * instances. + */ +public interface UsesAdditionalLocalVariables { + /** + * @param alvName The name of the instance to be constructed + * @return A minimal {@link AdditionalLocalVariable} instance with the given + * parameter. + */ + public default AdditionalLocalVariable createMinimalALV(String alvName) { + var alvInit = new AdditionalLocalVariableInitialiser(); + var alv = alvInit.instantiate(); + alvInit.setName(alv, alvName); + return alv; + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationAttributeSettings.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationAttributeSettings.java new file mode 100644 index 0000000000..51f3e1e87e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationAttributeSettings.java @@ -0,0 +1,59 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.annotations.AnnotationAttributeSetting; +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.members.InterfaceMethod; + +import cipm.consistency.initialisers.jamopp.annotations.AnnotationAttributeSettingInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link AnnotationAttributeSetting} instances.
+ *
+ * Contains methods that can be used to create + * {@link AnnotationAttributeSetting} instances. + */ +public interface UsesAnnotationAttributeSettings extends UsesAnnotationValues { + /** + * @param im The attribute of the instance to be constructed. + * @param val The value of the instance to be constructed. + * + * @return An {@link AnnotationAttributeSetting} instance with the given + * attribute and value. + */ + public default AnnotationAttributeSetting createAAS(InterfaceMethod im, AnnotationValue val) { + var aasInit = new AnnotationAttributeSettingInitialiser(); + var aas = aasInit.instantiate(); + aasInit.setAttribute(aas, im); + aasInit.setValue(aas, val); + return aas; + } + + /** + * A variant of {@link #createAAS(InterfaceMethod, AnnotationValue)}, where the + * first parameter is null and the second parameter constructed using + * {@link #createMinimalSR(String)}. + * + * @param val See {@link #createMinimalSR(String)} + */ + public default AnnotationAttributeSetting createStringAAS(String val) { + return this.createAAS(null, this.createMinimalSR(val)); + } + + /** + * A variant of {@link #createAAS(InterfaceMethod, AnnotationValue)} where both + * parameters are null. + */ + public default AnnotationAttributeSetting createEmptyAAS() { + return this.createAAS(null, null); + } + + /** + * A variant of {@link #createAAS(InterfaceMethod, AnnotationValue)}, where the + * first parameter is null and the second parameter is constructed using + * {@link #createNullLiteral()}. + */ + public default AnnotationAttributeSetting createNullAAS() { + return this.createAAS(null, this.createNullLiteral()); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationInstances.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationInstances.java new file mode 100644 index 0000000000..a44838d358 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationInstances.java @@ -0,0 +1,39 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.annotations.AnnotationInstance; +import org.emftext.language.java.classifiers.Classifier; + +import cipm.consistency.initialisers.jamopp.annotations.AnnotationInstanceInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link AnnotationInstance} instances.
+ *
+ * Contains methods that can be used to create {@link AnnotationInstance} + * instances. + */ +public interface UsesAnnotationInstances extends UsesAnnotations { + /** + * @param aiNss The namespaces of the instance to be constructed. + * @param aiAnnotation The annotation of the instance to be constructed. + * @return An {@link AnnotationInstance} with the given parameters. + */ + public default AnnotationInstance createMinimalAI(String[] aiNss, Classifier aiAnnotation) { + var aii = new AnnotationInstanceInitialiser(); + AnnotationInstance ai = aii.instantiate(); + aii.addNamespaces(ai, aiNss); + aii.setAnnotation(ai, aiAnnotation); + return ai; + } + + /** + * A variant of {@link #createMinimalAI(String[], Classifier)}, where + * {@link #createMinimalAnnotation(String)} is used to construct + * {@link Classifier} parameter. + * + * @param annotationName See {@link #createMinimalAnnotation(String)} + */ + public default AnnotationInstance createMinimalAI(String[] aiNss, String annotationName) { + return this.createMinimalAI(aiNss, this.createMinimalAnnotation(annotationName)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationParameters.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationParameters.java new file mode 100644 index 0000000000..9338c848ad --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationParameters.java @@ -0,0 +1,48 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.annotations.SingleAnnotationParameter; + +import cipm.consistency.initialisers.jamopp.annotations.SingleAnnotationParameterInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link AnnotationParameter} instances.
+ *
+ * Contains methods that can be used to create {@link AnnotationParameter} + * instances. + */ +public interface UsesAnnotationParameters extends UsesAnnotationValues { + /** + * @param val The value of the instance to be constructed + * @return A {@link SingleAnnotationParameter} instance with the given + * parameter. + */ + public default SingleAnnotationParameter createSingleAnnoParam(AnnotationValue val) { + var init = new SingleAnnotationParameterInitialiser(); + SingleAnnotationParameter result = init.instantiate(); + init.setValue(result, val); + return result; + } + + /** + * A variant of {@link #createSingleAnnoParam(AnnotationValue)}, where the + * parameter is constructed using {@link #createMinimalSR(String)}. + * + * @param val See {@link #createMinimalSR(String)} + */ + public default SingleAnnotationParameter createSingleStrAnnoParam(String val) { + return this.createSingleAnnoParam(this.createMinimalSR(val)); + } + + /** + * A variant of {@link #createSingleAnnoParam(AnnotationValue)}, where the + * parameter is a {@link NullLiteral}. + * + * @see {@link #createNullLiteral()} + */ + public default SingleAnnotationParameter createSingleNullAnnoParam() { + return this.createSingleAnnoParam(this.createNullLiteral()); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationValues.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationValues.java new file mode 100644 index 0000000000..2cc1f7095e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotationValues.java @@ -0,0 +1,14 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.annotations.AnnotationValue; + +/** + * An interface that can be implemented by tests, which work with + * {@link AnnotationValue} instances.
+ *
+ * Contains methods that can be used to create {@link AnnotationValue} + * instances. + */ +public interface UsesAnnotationValues extends UsesReferences, UsesLiterals { + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotations.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotations.java new file mode 100644 index 0000000000..2872cc3c4d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnnotations.java @@ -0,0 +1,24 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.classifiers.Annotation; + +import cipm.consistency.initialisers.jamopp.classifiers.AnnotationInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Annotation} instances.
+ *
+ * Contains methods that can be used to create {@link Annotation} instances. + */ +public interface UsesAnnotations { + /** + * @param annotationName The name of the instance to be constructed + * @return An {@link Annotation} instance with the given parameter. + */ + public default Annotation createMinimalAnnotation(String annotationName) { + var ai = new AnnotationInitialiser(); + Annotation result = ai.instantiate(); + ai.setName(result, annotationName); + return result; + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnonymousClasses.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnonymousClasses.java new file mode 100644 index 0000000000..1362297003 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesAnonymousClasses.java @@ -0,0 +1,37 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.classifiers.AnonymousClass; + +import cipm.consistency.initialisers.jamopp.classifiers.AnonymousClassInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link AnonymousClass} instances.
+ *
+ * Contains methods that can be used to create {@link AnonymousClass} instances. + */ +public interface UsesAnonymousClasses extends UsesMethods { + /** + * @param methodName See {@link #createMinimalClsMethodWithNullReturn(String)} + * + * @return An {@link AnonymousClass} instance with a {@link Member} constructed + * using {@link #createMinimalClsMethodWithNullReturn(String)}. + * + */ + public default AnonymousClass createMinimalAnonymousClassWithMethod(String methodName) { + var acInit = new AnonymousClassInitialiser(); + var ac = this.createMinimalAnonymousClass(); + acInit.addMember(ac, this.createMinimalClsMethodWithNullReturn(methodName)); + return ac; + } + + /** + * @return A minimal {@link AnonymousClass} instance. + */ + public default AnonymousClass createMinimalAnonymousClass() { + var acInit = new AnonymousClassInitialiser(); + var ac = acInit.instantiate(); + return ac; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayDimensions.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayDimensions.java new file mode 100644 index 0000000000..7083aee070 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayDimensions.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.annotations.AnnotationInstance; +import org.emftext.language.java.arrays.ArrayDimension; + +import cipm.consistency.initialisers.jamopp.arrays.ArrayDimensionInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link ArrayDimension} instances.
+ *
+ * Contains methods that can be used to create {@link ArrayDimension} + * instances. + */ +public interface UsesArrayDimensions extends UsesAnnotationInstances { + /** + * @return An uninitialised {@link ArrayDimension} instance. + */ + public default ArrayDimension createMinimalArrayDimension() { + var init = new ArrayDimensionInitialiser(); + var result = init.instantiate(); + return result; + } + + /** + * @return An {@link ArrayDimension} instance with the given {@link AnnotationInstance} array. + */ + public default ArrayDimension createArrayDimension(AnnotationInstance[] ais) { + var result = this.createMinimalArrayDimension(); + var init = new ArrayDimensionInitialiser(); + init.addAnnotations(result, ais); + return result; + } + + /** + * @return An {@link ArrayDimension} instance that has an {@link AnnotationInstance} with + * the given namespace and instance name. + */ + public default ArrayDimension createArrayDimension(String[] annotationInstanceNamespaces, + String annotationInstanceName) { + return this.createArrayDimension(new AnnotationInstance[] { + this.createMinimalAI(annotationInstanceNamespaces, annotationInstanceName) }); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayInitializers.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayInitializers.java new file mode 100644 index 0000000000..e9afa89493 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArrayInitializers.java @@ -0,0 +1,36 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.arrays.ArrayInitializationValue; +import org.emftext.language.java.arrays.ArrayInitializer; +import org.emftext.language.java.expressions.Expression; + +import cipm.consistency.initialisers.jamopp.arrays.ArrayInitializerInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link ArrayInitializer} instances.
+ *
+ * Contains methods that can be used to create {@link ArrayInitializer} + * instances. + */ +public interface UsesArrayInitializers { + /** + * @param aivs The values of the instance to be constructed + * @return An {@link ArrayInitializer} with the given parameter + */ + public default ArrayInitializer createMinimalArrayInitializer(ArrayInitializationValue[] aivs) { + var init = new ArrayInitializerInitialiser(); + ArrayInitializer result = init.instantiate(); + init.addInitialValues(result, aivs); + return result; + } + + /** + * A variant of + * {@link #createMinimalArrayInitializer(ArrayInitializationValue[])}, where the + * parameter is an array containing only one {@link ArrayInitializationValue}. + */ + public default ArrayInitializer createMinimalArrayInitializer(Expression aiv) { + return this.createMinimalArrayInitializer(new ArrayInitializationValue[] { aiv }); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArraySelectors.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArraySelectors.java new file mode 100644 index 0000000000..c9745f7751 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesArraySelectors.java @@ -0,0 +1,33 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.expressions.Expression; + +import cipm.consistency.initialisers.jamopp.arrays.ArraySelectorInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link ArraySelector} instances.
+ *
+ * Contains methods that can be used to create {@link ArraySelector} instances. + */ +public interface UsesArraySelectors extends UsesExpressions { + /** + * @param asPos The position of the instance to be constructed + * @return An {@link ArraySelector} instance with the given parameter. + */ + public default ArraySelector createAS(Expression asPos) { + var init = new ArraySelectorInitialiser(); + var as = init.instantiate(); + init.setPosition(as, asPos); + return as; + } + + /** + * A variant of {@link #createAS(Expression)}, where the parameter is wrapped + * using {@link #createDecimalIntegerLiteral(int)}. + */ + public default ArraySelector createMinimalAS(int asPos) { + return this.createAS(this.createDecimalIntegerLiteral(asPos)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesCatchBlocks.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesCatchBlocks.java new file mode 100644 index 0000000000..b418f2ec5f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesCatchBlocks.java @@ -0,0 +1,39 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.parameters.OrdinaryParameter; +import org.emftext.language.java.statements.CatchBlock; + +import cipm.consistency.initialisers.jamopp.statements.CatchBlockInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link CatchBlock} instances.
+ *
+ * Contains methods that can be used to create {@link CatchBlock} instances. + */ +public interface UsesCatchBlocks extends UsesParameters { + /** + * @param cbParam The parameter of the instance to be constructed + * @return A {@link CatchBlock} instance with the given parameter + */ + public default CatchBlock createMinimalCB(OrdinaryParameter cbParam) { + var cbInit = new CatchBlockInitialiser(); + var cb = cbInit.instantiate(); + cbInit.setParameter(cb, cbParam); + return cb; + } + + /** + * A variant of {@link #createMinimalCB(OrdinaryParameter)}, where the parameter + * is constructed using + * {@link #createMinimalOrdParamWithClsTarget(String, String)}. + * + * @param paramName See + * {@link #createMinimalOrdParamWithClsTarget(String, String)} + * @param targetName See + * {@link #createMinimalOrdParamWithClsTarget(String, String)} + */ + public default CatchBlock createMinimalCB(String paramName, String targetName) { + return this.createMinimalCB(this.createMinimalOrdParamWithClsTarget(paramName, targetName)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesConcreteClassifiers.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesConcreteClassifiers.java new file mode 100644 index 0000000000..1940ad1498 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesConcreteClassifiers.java @@ -0,0 +1,129 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.classifiers.ConcreteClassifier; + +import cipm.consistency.initialisers.jamopp.classifiers.ClassInitialiser; +import cipm.consistency.initialisers.jamopp.classifiers.IConcreteClassifierInitialiser; +import cipm.consistency.initialisers.jamopp.containers.CompilationUnitInitialiser; + +import org.emftext.language.java.classifiers.Class; + +/** + * An interface that can be implemented by tests, which work with + * {@link ConcreteClassifier} instances.
+ *
+ * Contains methods that can be used to create {@link ConcreteClassifier} + * instances. + */ +public interface UsesConcreteClassifiers extends UsesPackages, UsesNames { + /** + * @return A {@link Class} instance without setting any of its attributes + */ + public default Class createMinimalClass() { + return new ClassInitialiser().instantiate(); + } + + /** + * @return A {@link Class} instance contained in a {@link CompilationUnit} + * instance. Attributes of neither the {@link Class} instance nor the + * {@link CompilationUnit} instance are set. + */ + public default Class createMinimalClassWithCU() { + var cls = this.createMinimalClass(); + + var cuInit = new CompilationUnitInitialiser(); + var cu = cuInit.instantiate(); + cuInit.addClassifier(cu, cls); + + return cls; + } + + /** + * @param init The initialiser that will be used to create the instance + * @param clsName The name of the instance to be constructed + * @return A {@link ConcreteClassifier} instance with the given name. The + * concrete type of the instance depends on init. + */ + public default ConcreteClassifier createMinimalClassifier(IConcreteClassifierInitialiser init, String clsName) { + ConcreteClassifier result = init.instantiate(); + init.setName(result, clsName); + return result; + } + + /** + * @param init The initialiser that will be used to create the instance + * @param clsName The name of the instance to be constructed + * @param cuName The name of the {@link CompilationUnit} that will contain the + * created instance + * @return A {@link ConcreteClassifier} instance that is contained by a + * {@link CompilationUnit}. The given parameters are used during both of + * their construction. + */ + public default ConcreteClassifier createMinimalClassifierWithCU(IConcreteClassifierInitialiser init, String clsName, + String cuName) { + ConcreteClassifier result = init.instantiate(); + init.setName(result, clsName); + + var cuInit = new CompilationUnitInitialiser(); + var cu = cuInit.instantiate(); + cuInit.setName(cu, cuName); + cuInit.addClassifier(cu, result); + + return result; + } + + /** + * @param init The initialiser that will be used to create the instance + * @param clsName The name of the instance to be constructed + * @param pacNss See {@link #createMinimalPackage(String[])} + * @return A {@link ConcreteClassifier} instance that will be contained by a + * {@link Package} constructed by + * {@link #createMinimalPackage(String[])}. + */ + public default ConcreteClassifier createMinimalClassifierWithPac(IConcreteClassifierInitialiser init, + String clsName, String[] pacNss) { + ConcreteClassifier result = init.instantiate(); + init.setName(result, clsName); + init.setPackage(result, this.createMinimalPackage(pacNss)); + return result; + } + + /** + * A variant of + * {@link #createMinimalClassifierWithPac(IConcreteClassifierInitialiser, String, String[])}, + * where the constructed instance is of type {@link Class}. + */ + public default Class createMinimalClassWithPac(String clsName, String[] pacNss) { + return (Class) this.createMinimalClassifierWithPac(new ClassInitialiser(), clsName, pacNss); + } + + /** + * A variant of + * {@link #createMinimalClassifierWithCU(IConcreteClassifierInitialiser, String, String)}, + * where the name of the constructed {@link CompilationUnit} is + * {@link #getDefaultName()}. + */ + public default ConcreteClassifier createMinimalClassifierWithCU(IConcreteClassifierInitialiser init, + String clsName) { + return this.createMinimalClassifierWithCU(init, clsName, this.getDefaultName()); + } + + /** + * A variant of + * {@link #createMinimalClassifier(IConcreteClassifierInitialiser, String)}, + * where a {@link Class} instance with the given parameter is created. + */ + public default Class createMinimalClass(String clsName) { + return (Class) this.createMinimalClassifier(new ClassInitialiser(), clsName); + } + + /** + * A variant of + * {@link #createMinimalClassifierWithCU(IConcreteClassifierInitialiser, String)}, + * where the constructed instance is of type {@link Class} with the given + * parameter. + */ + public default Class createMinimalClassWithCU(String clsName) { + return (Class) this.createMinimalClassifierWithCU(new ClassInitialiser(), clsName); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesEnumConstants.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesEnumConstants.java new file mode 100644 index 0000000000..62d3efe57c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesEnumConstants.java @@ -0,0 +1,24 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.members.EnumConstant; + +import cipm.consistency.initialisers.jamopp.members.EnumConstantInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link EnumConstant} instances.
+ *
+ * Contains methods that can be used to create {@link EnumConstant} instances. + */ +public interface UsesEnumConstants { + /** + * @param ecName The name of the instance to be created + * @return An {@link EnumConstant} with the given parameter + */ + public default EnumConstant createMinimalEnumConstant(String ecName) { + var ecInit = new EnumConstantInitialiser(); + var ec = ecInit.instantiate(); + ecInit.setName(ec, ecName); + return ec; + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesExpressions.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesExpressions.java new file mode 100644 index 0000000000..7b37cb816e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesExpressions.java @@ -0,0 +1,118 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.expressions.EqualityExpression; +import org.emftext.language.java.expressions.EqualityExpressionChild; +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.expressions.ExpressionList; +import org.emftext.language.java.operators.EqualityOperator; + +import cipm.consistency.initialisers.jamopp.expressions.EqualityExpressionInitialiser; +import cipm.consistency.initialisers.jamopp.expressions.ExpressionListInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Expression} instances.
+ *
+ * Contains methods that can be used to create {@link Expression} instances. + */ +public interface UsesExpressions extends UsesOperators, UsesLiterals, UsesStringReferences { + /** + * @param exprs The {@link Expression} instances the constructed instance will + * contain + * @return A {@link ExpressionList} instance with the given parameters + */ + public default ExpressionList createExprList(Expression... exprs) { + var elInit = new ExpressionListInitialiser(); + var el = this.createExprList(); + elInit.addExpressions(el, exprs); + return el; + } + + /** + * @param lhs The left hand side of the instance to be constructed + * @param eop The equality operator of the instance to be constructed + * @param rhs The right hand side of the instance to be constructed + * @return Constructs an {@link EqualityExpression} instance that represents + * {@code lhs eop rhs} + */ + public default EqualityExpression createMinimalEE(EqualityExpressionChild lhs, EqualityOperator eop, + EqualityExpressionChild rhs) { + var eqInit = new EqualityExpressionInitialiser(); + + EqualityExpression result = eqInit.instantiate(); + eqInit.addEqualityOperator(result, eop); + eqInit.addChild(result, lhs); + eqInit.addChild(result, rhs); + + return result; + } + + /** + * A variant of + * {@link #createMinimalEE(EqualityExpressionChild, EqualityOperator, EqualityExpressionChild)} + * that uses an operator generated by {@link #createEqualityOperator()}. + */ + public default EqualityExpression createMinimalEE(EqualityExpressionChild lhs, EqualityExpressionChild rhs) { + return this.createMinimalEE(lhs, this.createEqualityOperator(), rhs); + } + + /** + * A variant of + * {@link #createMinimalEE(EqualityExpressionChild, EqualityOperator, EqualityExpressionChild)} + * that uses an operator generated by {@link #createNotEqualOperator()}. + */ + public default EqualityExpression createMinimalNEE(EqualityExpressionChild lhs, EqualityExpressionChild rhs) { + return this.createMinimalEE(lhs, this.createNotEqualOperator(), rhs); + } + + /** + * @return A minimal {@link ExpressionList} instance + */ + public default ExpressionList createExprList() { + return new ExpressionListInitialiser().instantiate(); + } + + /** + * A variant of + * {@link #createMinimalEE(EqualityExpressionChild, EqualityExpressionChild)} + * that equates to {@code 1 == 1} in {@link Expression} form. + * + * @see {@link #createDecimalIntegerLiteral(int)} + */ + public default EqualityExpression createMinimalTrueEE() { + return this.createMinimalEE(this.createDecimalIntegerLiteral(1), this.createDecimalIntegerLiteral(1)); + } + + /** + * A variant of + * {@link #createMinimalEE(EqualityExpressionChild, EqualityExpressionChild)} + * that equates to {@code 1 == 2} in {@link Expression} form. + * + * @see {@link #createDecimalIntegerLiteral(int)} + */ + public default EqualityExpression createMinimalFalseEE() { + return this.createMinimalEE(this.createDecimalIntegerLiteral(1), this.createDecimalIntegerLiteral(2)); + } + + /** + * A variant of + * {@link #createMinimalNEE(EqualityExpressionChild, EqualityExpressionChild)} + * that equates to {@code 1 =/= 1} in {@link Expression} form. + * + * @see {@link #createDecimalIntegerLiteral(int)} + */ + public default EqualityExpression createMinimalFalseNEE() { + return this.createMinimalNEE(this.createDecimalIntegerLiteral(1), this.createDecimalIntegerLiteral(1)); + } + + /** + * A variant of + * {@link #createMinimalNEE(EqualityExpressionChild, EqualityExpressionChild)} + * that equates to {@code 1 =/= 2} in {@link Expression} form. + * + * @see {@link #createDecimalIntegerLiteral(int)} + */ + public default EqualityExpression createMinimalTrueNEE() { + return this.createMinimalNEE(this.createDecimalIntegerLiteral(1), this.createDecimalIntegerLiteral(2)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesFields.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesFields.java new file mode 100644 index 0000000000..b2a0fb39c1 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesFields.java @@ -0,0 +1,25 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.members.Field; + +import cipm.consistency.initialisers.jamopp.members.FieldInitialiser; + +/** + * An interface that can be implemented by tests, which work with {@link Field} + * instances.
+ *
+ * Contains methods that can be used to create {@link Field} instances. + */ +public interface UsesFields { + /** + * @param fieldName The name of the instance to be constructed + * @return A {@link Field} instance with the given parameter + */ + public default Field createMinimalField(String fieldName) { + var init = new FieldInitialiser(); + Field result = init.instantiate(); + init.setName(result, fieldName); + + return result; + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImportingElements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImportingElements.java new file mode 100644 index 0000000000..0291a7ab6d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImportingElements.java @@ -0,0 +1,39 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.imports.Import; +import org.emftext.language.java.imports.ImportingElement; + +import cipm.consistency.initialisers.jamopp.imports.IImportingElementInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link ImportingElement} instances.
+ *
+ * Contains methods that can be used to create {@link ImportingElement} + * instances. + */ +public interface UsesImportingElements extends UsesImports { + /** + * @param init The initialiser that will be used to construct the instance + * @param imp The {@link Import} that will be added to the constructed instance + * @return An {@link ImportingElement} instance with the given parameters + */ + public default ImportingElement createMinimalImportingElement(IImportingElementInitialiser init, Import imp) { + ImportingElement result = init.instantiate(); + init.addImport(result, imp); + + return result; + } + + /** + * A variant of + * {@link #createMinimalImportingElement(IImportingElementInitialiser, Import)}, + * where the {@link Import} parameter is constructed using + * {@link #createMinimalClsImport(String)}. + * + * @param clsName See {@link #createMinimalClsImport(String)} + */ + public default ImportingElement createMinimalImportingElement(IImportingElementInitialiser init, String clsName) { + return this.createMinimalImportingElement(init, this.createMinimalClsImport(clsName)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImports.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImports.java new file mode 100644 index 0000000000..739b57bb97 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesImports.java @@ -0,0 +1,52 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.imports.ClassifierImport; +import org.emftext.language.java.imports.Import; + +import cipm.consistency.initialisers.jamopp.imports.ClassifierImportInitialiser; +import cipm.consistency.initialisers.jamopp.imports.IImportInitialiser; + +/** + * An interface that can be implemented by tests, which work with {@link Import} + * instances.
+ *
+ * Contains methods that can be used to create {@link Import} instances. + */ +public interface UsesImports extends UsesConcreteClassifiers { + /** + * @param initialiser The initialiser that will be used to construct the + * instance + * @param cls The classifier of the instance to be constructed (what it + * will point at) + * @return An {@link Import} instance with the given parameters + */ + public default Import createMinimalImport(IImportInitialiser initialiser, ConcreteClassifier cls) { + Import result = initialiser.instantiate(); + initialiser.setClassifier(result, cls); + + return result; + } + + /** + * A variant of + * {@link #createMinimalImport(IImportInitialiser, ConcreteClassifier)}, where + * the constructed instance is of type {@link ClassifierImport}. + */ + public default ClassifierImport createMinimalClsImport(ConcreteClassifier cls) { + return (ClassifierImport) this.createMinimalImport(new ClassifierImportInitialiser(), cls); + } + + /** + * A variant of + * {@link #createMinimalImport(IImportInitialiser, ConcreteClassifier)}, where + * the constructed instance is of type {@link ClassifierImport} that points at a + * {@link Classifier} constructed with + * {@link #createMinimalClassWithCU(String)}. + * + * @param clsName See {@link #createMinimalClassWithCU(String)} + */ + public default ClassifierImport createMinimalClsImport(String clsName) { + return this.createMinimalClsImport(this.createMinimalClassWithCU(clsName)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLambdaParameters.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLambdaParameters.java new file mode 100644 index 0000000000..99fbd83d36 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLambdaParameters.java @@ -0,0 +1,42 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.expressions.ExplicitlyTypedLambdaParameters; +import org.emftext.language.java.parameters.Parameter; + +import cipm.consistency.initialisers.jamopp.expressions.ExplicitlyTypedLambdaParametersInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link LambdaParameters} instances.
+ *
+ * Contains methods that can be used to create {@link LambdaParameters} + * instances. + */ +public interface UsesLambdaParameters extends UsesParameters { + /** + * @param params The parameters that will be added to the constructed instance + * @return An {@link ExplicitlyTypedLambdaParameters} instance with the given + * parameters + */ + public default ExplicitlyTypedLambdaParameters createETLP(Parameter[] params) { + var init = new ExplicitlyTypedLambdaParametersInitialiser(); + + var result = init.instantiate(); + init.addParameters(result, params); + + return result; + } + + /** + * A variant of {@link #createETLP(Parameter[])}, where a single + * {@link Parameter} instance is constructed and used. + * + * @param paramName See + * {@link #createMinimalOrdParamWithClsTarget(String, String)} + * @param targetName See + * {@link #createMinimalOrdParamWithClsTarget(String, String)} + */ + public default ExplicitlyTypedLambdaParameters createMinimalETLP(String paramName, String targetName) { + return this.createETLP(new Parameter[] { this.createMinimalOrdParamWithClsTarget(paramName, targetName) }); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLiterals.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLiterals.java new file mode 100644 index 0000000000..a068c42098 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLiterals.java @@ -0,0 +1,202 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import java.math.BigInteger; + +import org.emftext.language.java.literals.BinaryIntegerLiteral; +import org.emftext.language.java.literals.BinaryLongLiteral; +import org.emftext.language.java.literals.BooleanLiteral; +import org.emftext.language.java.literals.CharacterLiteral; +import org.emftext.language.java.literals.DecimalDoubleLiteral; +import org.emftext.language.java.literals.DecimalFloatLiteral; +import org.emftext.language.java.literals.DecimalIntegerLiteral; +import org.emftext.language.java.literals.DecimalLongLiteral; +import org.emftext.language.java.literals.HexDoubleLiteral; +import org.emftext.language.java.literals.HexFloatLiteral; +import org.emftext.language.java.literals.HexIntegerLiteral; +import org.emftext.language.java.literals.HexLongLiteral; +import org.emftext.language.java.literals.NullLiteral; +import org.emftext.language.java.literals.OctalIntegerLiteral; +import org.emftext.language.java.literals.OctalLongLiteral; +import org.emftext.language.java.literals.Super; +import org.emftext.language.java.literals.This; +import org.emftext.language.java.modifiers.Static; +import org.emftext.language.java.modifiers.Transitive; + +import cipm.consistency.initialisers.jamopp.literals.BinaryIntegerLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.BinaryLongLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.BooleanLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.CharacterLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.DecimalDoubleLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.DecimalFloatLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.DecimalIntegerLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.DecimalLongLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.HexDoubleLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.HexFloatLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.HexIntegerLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.HexLongLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.NullLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.OctalIntegerLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.OctalLongLiteralInitialiser; +import cipm.consistency.initialisers.jamopp.literals.SuperInitialiser; +import cipm.consistency.initialisers.jamopp.literals.ThisInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.StaticInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.TransitiveInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Literal} instances.
+ *
+ * Contains methods that can be used to create {@link Literal} instances. The + * methods wrap primitive value provided to them for convenience. + */ +public interface UsesLiterals { + public default CharacterLiteral createCharacterLiteral(String val) { + var init = new CharacterLiteralInitialiser(); + var lit = init.instantiate(); + init.setValue(lit, val); + return lit; + } + + public default BooleanLiteral createBooleanLiteral(boolean val) { + var init = new BooleanLiteralInitialiser(); + var lit = init.instantiate(); + init.setValue(lit, val); + return lit; + } + + public default HexFloatLiteral createHexFloatLiteral(float val) { + var init = new HexFloatLiteralInitialiser(); + var lit = init.instantiate(); + init.setHexValue(lit, val); + return lit; + } + + public default DecimalFloatLiteral createDecimalFloatLiteral(float val) { + var init = new DecimalFloatLiteralInitialiser(); + var lit = init.instantiate(); + init.setDecimalValue(lit, val); + return lit; + } + + public default HexDoubleLiteral createHexDoubleLiteral(double val) { + var init = new HexDoubleLiteralInitialiser(); + var lit = init.instantiate(); + init.setHexValue(lit, val); + return lit; + } + + public default DecimalDoubleLiteral createDecimalDoubleLiteral(double val) { + var init = new DecimalDoubleLiteralInitialiser(); + var lit = init.instantiate(); + init.setDecimalValue(lit, val); + return lit; + } + + public default BinaryIntegerLiteral createBinaryIntegerLiteral(BigInteger val) { + var init = new BinaryIntegerLiteralInitialiser(); + var lit = init.instantiate(); + init.setBinaryValue(lit, val); + return lit; + } + + public default BinaryIntegerLiteral createBinaryIntegerLiteral(int val) { + return this.createBinaryIntegerLiteral(BigInteger.valueOf(val)); + } + + public default DecimalIntegerLiteral createDecimalIntegerLiteral(BigInteger val) { + var init = new DecimalIntegerLiteralInitialiser(); + var lit = init.instantiate(); + init.setDecimalValue(lit, val); + return lit; + } + + public default DecimalIntegerLiteral createDecimalIntegerLiteral(int val) { + return this.createDecimalIntegerLiteral(BigInteger.valueOf(val)); + } + + public default HexIntegerLiteral createHexIntegerLiteral(BigInteger val) { + var init = new HexIntegerLiteralInitialiser(); + var lit = init.instantiate(); + init.setHexValue(lit, val); + return lit; + } + + public default HexIntegerLiteral createHexIntegerLiteral(int val) { + return this.createHexIntegerLiteral(BigInteger.valueOf(val)); + } + + public default OctalIntegerLiteral createOctalIntegerLiteral(BigInteger val) { + var init = new OctalIntegerLiteralInitialiser(); + var lit = init.instantiate(); + init.setOctalValue(lit, val); + return lit; + } + + public default OctalIntegerLiteral createOctalIntegerLiteral(int val) { + return this.createOctalIntegerLiteral(BigInteger.valueOf(val)); + } + + public default BinaryLongLiteral createBinaryLongLiteral(BigInteger val) { + var init = new BinaryLongLiteralInitialiser(); + var lit = init.instantiate(); + init.setBinaryValue(lit, val); + return lit; + } + + public default BinaryLongLiteral createBinaryLongLiteral(int val) { + return this.createBinaryLongLiteral(BigInteger.valueOf(val)); + } + + public default DecimalLongLiteral createDecimalLongLiteral(BigInteger val) { + var init = new DecimalLongLiteralInitialiser(); + var lit = init.instantiate(); + init.setDecimalValue(lit, val); + return lit; + } + + public default DecimalLongLiteral createDecimalLongLiteral(int val) { + return this.createDecimalLongLiteral(BigInteger.valueOf(val)); + } + + public default HexLongLiteral createHexLongLiteral(BigInteger val) { + var init = new HexLongLiteralInitialiser(); + var lit = init.instantiate(); + init.setHexValue(lit, val); + return lit; + } + + public default HexLongLiteral createHexLongLiteral(int val) { + return this.createHexLongLiteral(BigInteger.valueOf(val)); + } + + public default OctalLongLiteral createOctalLongLiteral(BigInteger val) { + var init = new OctalLongLiteralInitialiser(); + var lit = init.instantiate(); + init.setOctalValue(lit, val); + return lit; + } + + public default OctalLongLiteral createOctalLongLiteral(int val) { + return this.createOctalLongLiteral(BigInteger.valueOf(val)); + } + + public default NullLiteral createNullLiteral() { + return new NullLiteralInitialiser().instantiate(); + } + + public default This createThis() { + return new ThisInitialiser().instantiate(); + } + + public default Super createSuper() { + return new SuperInitialiser().instantiate(); + } + + public default Static createStatic() { + return new StaticInitialiser().instantiate(); + } + + public default Transitive createTransitive() { + return new TransitiveInitialiser().instantiate(); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLocalVariables.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLocalVariables.java new file mode 100644 index 0000000000..711771ff1c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesLocalVariables.java @@ -0,0 +1,24 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.variables.LocalVariable; + +import cipm.consistency.initialisers.jamopp.variables.LocalVariableInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link LocalVariable} instances.
+ *
+ * Contains methods that can be used to create {@link LocalVariable} instances. + */ +public interface UsesLocalVariables { + /** + * @param lvName The name of the instance to be constructed + * @return A {@link LocalVariable} instance with the given parameter + */ + public default LocalVariable createMinimalLV(String lvName) { + var lvInit = new LocalVariableInitialiser(); + var lv = lvInit.instantiate(); + lvInit.setName(lv, lvName); + return lv; + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesMethods.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesMethods.java new file mode 100644 index 0000000000..845326f437 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesMethods.java @@ -0,0 +1,64 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.members.ClassMethod; +import org.emftext.language.java.members.InterfaceMethod; + +import cipm.consistency.initialisers.jamopp.members.ClassMethodInitialiser; +import cipm.consistency.initialisers.jamopp.members.InterfaceMethodInitialiser; + +/** + * An interface that can be implemented by tests, which work with {@link Method} + * instances.
+ *
+ * Contains methods that can be used to create {@link Method} instances. + */ +public interface UsesMethods extends UsesStatements { + /** + * A variant of {@link #createMinimalClsMethodWithNullReturn()} with the given + * parameter + * + * @param methodName The name of the instance to be constructed + */ + public default ClassMethod createMinimalClsMethodWithNullReturn(String methodName) { + var init = new ClassMethodInitialiser(); + ClassMethod result = this.createMinimalClsMethodWithNullReturn(); + init.setName(result, methodName); + return result; + } + + /** + * @return A {@link ClassMethod} instance with only one {@link Statement} + * constructed by {@link #createMinimalNullReturn()}. + */ + public default ClassMethod createMinimalClsMethodWithNullReturn() { + var init = new ClassMethodInitialiser(); + ClassMethod result = init.instantiate(); + init.addStatement(result, this.createMinimalNullReturn()); + return result; + } + + /** + * A variant of {@link #createMinimalInterfaceMethodWithNullReturn()} with the + * given parameter + * + * @param methodName The name of the instance to be constructed + */ + public default InterfaceMethod createMinimalInterfaceMethodWithNullReturn(String methodName) { + var init = new InterfaceMethodInitialiser(); + InterfaceMethod result = this.createMinimalInterfaceMethodWithNullReturn(); + init.setName(result, methodName); + return result; + } + + /** + * @return A {@link InterfaceMethod} instance with only one {@link Statement} + * constructed by {@link #createNullLiteral()}. + */ + public default InterfaceMethod createMinimalInterfaceMethodWithNullReturn() { + var init = new InterfaceMethodInitialiser(); + InterfaceMethod result = init.instantiate(); + init.setDefaultValue(result, this.createNullLiteral()); + return result; + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModifiers.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModifiers.java new file mode 100644 index 0000000000..4de3bab2df --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModifiers.java @@ -0,0 +1,83 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.modifiers.Abstract; +import org.emftext.language.java.modifiers.Default; +import org.emftext.language.java.modifiers.Final; +import org.emftext.language.java.modifiers.Native; +import org.emftext.language.java.modifiers.Private; +import org.emftext.language.java.modifiers.Protected; +import org.emftext.language.java.modifiers.Public; +import org.emftext.language.java.modifiers.Static; +import org.emftext.language.java.modifiers.Strictfp; +import org.emftext.language.java.modifiers.Synchronized; +import org.emftext.language.java.modifiers.Transient; +import org.emftext.language.java.modifiers.Volatile; + +import cipm.consistency.initialisers.jamopp.modifiers.AbstractInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.DefaultInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.FinalInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.NativeInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.PrivateInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.ProtectedInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.PublicInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.StaticInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.StrictfpInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.SynchronizedInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.TransientInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.VolatileInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Modifier} instances.
+ *
+ * Contains methods that can be used to create {@link Modifier} instances. + */ +public interface UsesModifiers { + public default Default createDefault() { + return new DefaultInitialiser().instantiate(); + } + + public default Final createFinal() { + return new FinalInitialiser().instantiate(); + } + + public default Native createNative() { + return new NativeInitialiser().instantiate(); + } + + public default Private createPrivate() { + return new PrivateInitialiser().instantiate(); + } + + public default Public createPublic() { + return new PublicInitialiser().instantiate(); + } + + public default Static createStatic() { + return new StaticInitialiser().instantiate(); + } + + public default Strictfp createStrictfp() { + return new StrictfpInitialiser().instantiate(); + } + + public default Transient createTransient() { + return new TransientInitialiser().instantiate(); + } + + public default Abstract createAbstract() { + return new AbstractInitialiser().instantiate(); + } + + public default Synchronized createSynchronized() { + return new SynchronizedInitialiser().instantiate(); + } + + public default Volatile createVolatile() { + return new VolatileInitialiser().instantiate(); + } + + public default Protected createProtected() { + return new ProtectedInitialiser().instantiate(); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleDirectives.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleDirectives.java new file mode 100644 index 0000000000..d6146c8024 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleDirectives.java @@ -0,0 +1,70 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.containers.Package; +import org.emftext.language.java.modules.AccessProvidingModuleDirective; +import org.emftext.language.java.modules.ExportsModuleDirective; +import org.emftext.language.java.modules.OpensModuleDirective; + +import cipm.consistency.initialisers.jamopp.modules.ExportsModuleDirectiveInitialiser; +import cipm.consistency.initialisers.jamopp.modules.IAccessProvidingModuleDirectiveInitialiser; +import cipm.consistency.initialisers.jamopp.modules.OpensModuleDirectiveInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link ModuleDirective} instances.
+ *
+ * Contains methods that can be used to create {@link ModuleDirective} + * instances. + */ +public interface UsesModuleDirectives extends UsesPackages, UsesModuleReferences { + /** + * @param init The initialiser that will be used to construct the instance + * @param pac The accessable package of the instance to be constructed + * @return An {@link AccessProvidingModuleDirective} instance with the given + * parameters + */ + public default AccessProvidingModuleDirective createMinimalAPMD(IAccessProvidingModuleDirectiveInitialiser init, + Package pac) { + var result = init.instantiate(); + init.setAccessablePackage(result, pac); + return result; + } + + /** + * A variant of + * {@link #createMinimalAPMD(IAccessProvidingModuleDirectiveInitialiser, Package)} + * that constructs a {@link ExportsModuleDirective} instance. + */ + public default ExportsModuleDirective createMinimalEMD(Package pac) { + return (ExportsModuleDirective) this.createMinimalAPMD(new ExportsModuleDirectiveInitialiser(), pac); + } + + /** + * A variant of + * {@link #createMinimalAPMD(IAccessProvidingModuleDirectiveInitialiser, Package)} + * that constructs a {@link OpensModuleDirective} instance. + */ + public default OpensModuleDirective createMinimalOMD(Package pac) { + return (OpensModuleDirective) this.createMinimalAPMD(new OpensModuleDirectiveInitialiser(), pac); + } + + /** + * A variant of {@link #createMinimalEMD(Package)}, where + * {@link #createMinimalPackage(String[])} is used to construct the parameter. + * + * @param pacNss See {@link #createMinimalPackage(String[])} + */ + public default ExportsModuleDirective createMinimalEMD(String[] pacNss) { + return this.createMinimalEMD(this.createMinimalPackage(pacNss)); + } + + /** + * A variant of {@link #createMinimalOMD(Package)}, where + * {@link #createMinimalPackage(String[])} is used to construct the parameter. + * + * @param pacNss See {@link #createMinimalPackage(String[])} + */ + public default OpensModuleDirective createMinimalOMD(String[] pacNss) { + return this.createMinimalOMD(this.createMinimalPackage(pacNss)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleReferences.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleReferences.java new file mode 100644 index 0000000000..a570c903a3 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModuleReferences.java @@ -0,0 +1,39 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.modules.ModuleReference; + +import cipm.consistency.initialisers.jamopp.modules.ModuleReferenceInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link ModuleReference} instances.
+ *
+ * Contains methods that can be used to create {@link ModuleReference} + * instances. + */ +public interface UsesModuleReferences extends UsesModules { + /** + * @param modName See {@link #createMinimalModule(String)} + * @param modRefNss The namespaces of the {@link Module}, at which the + * constructed instance will point + * @return A {@link ModuleReference} instance that points at a {@link Module} + * constructed with {@link #createMinimalModule(String)}. + */ + public default ModuleReference createMinimalMR(String modName, String[] modRefNss) { + var mrInit = new ModuleReferenceInitialiser(); + var mr = mrInit.instantiate(); + mrInit.setTarget(mr, this.createMinimalModule(modName)); + mrInit.addNamespaces(mr, modRefNss); + return mr; + } + + /** + * A variant of {@link #createMinimalModule(String, String[])}, where the + * {@link Module} constructed in the process has no namespaces (second parameter + * is null). + */ + public default ModuleReference createMinimalMR(String modName) { + return this.createMinimalMR(modName, null); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModules.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModules.java new file mode 100644 index 0000000000..04ea40f1bb --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesModules.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.containers.Module; + +import cipm.consistency.initialisers.jamopp.containers.ModuleInitialiser; + +/** + * An interface that can be implemented by tests, which work with {@link Module} + * instances.
+ *
+ * Contains methods that can be used to create {@link Module} instances. + */ +public interface UsesModules { + /** + * @param modName The name of the instance to be constructed + * @param modNss The namespaces of the instance to be constructed + * @return A {@link Module} instance with the given parameters + */ + public default Module createMinimalModule(String modName, String[] modNss) { + var modInit = new ModuleInitialiser(); + var mod = modInit.instantiate(); + modInit.setName(mod, modName); + modInit.addNamespaces(mod, modNss); + return mod; + } + + /** + * A variation of {@link #createMinimalModule(String, String[])}, where the + * constructed instance has no namespaces. + */ + public default Module createMinimalModule(String modName) { + return this.createMinimalModule(modName, null); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesNames.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesNames.java new file mode 100644 index 0000000000..e0a18815d5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesNames.java @@ -0,0 +1,17 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +/** + * An interface that can be implemented by tests, which work with + * {@link NamedElement} instances.
+ *
+ * Contains methods that can be used to create {@link NamedElement} instances. + */ +public interface UsesNames { + /** + * @return A default name that can be used while constructing + * {@link NamedElement} instances + */ + public default String getDefaultName() { + return ""; + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesOperators.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesOperators.java new file mode 100644 index 0000000000..32ecadf11c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesOperators.java @@ -0,0 +1,95 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.operators.Addition; +import org.emftext.language.java.operators.AssignmentOperator; +import org.emftext.language.java.operators.AssignmentOr; +import org.emftext.language.java.operators.Division; +import org.emftext.language.java.operators.EqualityOperator; +import org.emftext.language.java.operators.GreaterThan; +import org.emftext.language.java.operators.LeftShift; +import org.emftext.language.java.operators.LessThan; +import org.emftext.language.java.operators.MinusMinus; +import org.emftext.language.java.operators.Multiplication; +import org.emftext.language.java.operators.NotEqual; +import org.emftext.language.java.operators.PlusPlus; +import org.emftext.language.java.operators.RightShift; +import org.emftext.language.java.operators.Subtraction; + +import cipm.consistency.initialisers.jamopp.operators.AdditionInitialiser; +import cipm.consistency.initialisers.jamopp.operators.AssignmentInitialiser; +import cipm.consistency.initialisers.jamopp.operators.AssignmentOrInitialiser; +import cipm.consistency.initialisers.jamopp.operators.DivisionInitialiser; +import cipm.consistency.initialisers.jamopp.operators.EqualInitialiser; +import cipm.consistency.initialisers.jamopp.operators.GreaterThanInitialiser; +import cipm.consistency.initialisers.jamopp.operators.LeftShiftInitialiser; +import cipm.consistency.initialisers.jamopp.operators.LessThanInitialiser; +import cipm.consistency.initialisers.jamopp.operators.MinusMinusInitialiser; +import cipm.consistency.initialisers.jamopp.operators.MultiplicationInitialiser; +import cipm.consistency.initialisers.jamopp.operators.NotEqualInitialiser; +import cipm.consistency.initialisers.jamopp.operators.PlusPlusInitialiser; +import cipm.consistency.initialisers.jamopp.operators.RightShiftInitialiser; +import cipm.consistency.initialisers.jamopp.operators.SubtractionInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Operator} instances.
+ *
+ * Contains methods that can be used to create {@link Operator} instances. + */ +public interface UsesOperators { + public default AssignmentOperator createAssignmentOperator() { + return new AssignmentInitialiser().instantiate(); + } + + public default AssignmentOr createAssignmentOrOperator() { + return new AssignmentOrInitialiser().instantiate(); + } + + public default EqualityOperator createEqualityOperator() { + return new EqualInitialiser().instantiate(); + } + + public default NotEqual createNotEqualOperator() { + return new NotEqualInitialiser().instantiate(); + } + + public default GreaterThan createGreaterThanOperator() { + return new GreaterThanInitialiser().instantiate(); + } + + public default LessThan createLessThanOperator() { + return new LessThanInitialiser().instantiate(); + } + + public default LeftShift createLeftShiftOperator() { + return new LeftShiftInitialiser().instantiate(); + } + + public default RightShift createRightShiftOperator() { + return new RightShiftInitialiser().instantiate(); + } + + public default Addition createAdditionOperator() { + return new AdditionInitialiser().instantiate(); + } + + public default Subtraction createSubtractionOperator() { + return new SubtractionInitialiser().instantiate(); + } + + public default Division createDivisionOperator() { + return new DivisionInitialiser().instantiate(); + } + + public default Multiplication createMultiplicationOperator() { + return new MultiplicationInitialiser().instantiate(); + } + + public default PlusPlus createPlusPlusOperator() { + return new PlusPlusInitialiser().instantiate(); + } + + public default MinusMinus createMinusMinusOperator() { + return new MinusMinusInitialiser().instantiate(); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackageImports.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackageImports.java new file mode 100644 index 0000000000..fca440ad06 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackageImports.java @@ -0,0 +1,25 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.imports.PackageImport; + +import cipm.consistency.initialisers.jamopp.imports.PackageImportInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link PackageImport} instances.
+ *
+ * Contains methods that can be used to create {@link PackageImport} instances. + */ +public interface UsesPackageImports { + /** + * @param piNss The namespaces of the instance to be constructed + * @return A {@link PackageImport} instance with the given parameters + */ + public default PackageImport createMinimalPackageImport(String[] piNss) { + var initialiser = new PackageImportInitialiser(); + var result = initialiser.instantiate(); + initialiser.addNamespaces(result, piNss); + + return result; + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackages.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackages.java new file mode 100644 index 0000000000..b85fc2daef --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesPackages.java @@ -0,0 +1,49 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.containers.Package; + +import cipm.consistency.initialisers.jamopp.containers.PackageInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Package} instances.
+ *
+ * Contains methods that can be used to create {@link Package} instances. + */ +public interface UsesPackages { + /** + * @param pacNss The namespaces of the instance to be constructed + * @return A {@link Package} instance with the given parameters + */ + public default Package createMinimalPackage(String[] pacNss) { + var pacInit = new PackageInitialiser(); + + Package result = pacInit.instantiate(); + pacInit.addNamespaces(result, pacNss); + + return result; + } + + /** + * A variant of {@link #createMinimalPackage(String[])}, where namespaces are + * generated using the given parameters.
+ *
+ * The generated namespaces will each consist of the given prefix and a suffix. + * As suffix, the namespaces will have a number between 0 (including) and the + * given count (excluding).
+ *
+ * Example: {@code nsPrefix = "ns", nsCount = 3} constructs a {@link Package} + * instance with namespaces "ns0", "ns1", "ns2". + * + * @param pacNsPrefix The prefix of the namespaces to be generated + * @param pacNsCount The count of the namespaces to be generated + */ + public default Package createMinimalPackage(String pacNsPrefix, int pacNsCount) { + var nss = new String[pacNsCount]; + + for (int i = 0; i < pacNsCount; i++) + nss[i] = pacNsPrefix + i; + + return this.createMinimalPackage(nss); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesParameters.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesParameters.java new file mode 100644 index 0000000000..dff6bc321e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesParameters.java @@ -0,0 +1,52 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.parameters.OrdinaryParameter; +import org.emftext.language.java.parameters.Parameter; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.parameters.IParameterInitialiser; +import cipm.consistency.initialisers.jamopp.parameters.OrdinaryParameterInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Parameter} instances.
+ *
+ * Contains methods that can be used to create {@link Parameter} instances. + */ +public interface UsesParameters extends UsesTypeReferences { + /** + * @param init The initialiser that will be used to construct the instance + * @param paramName The name of the instance to be constructed + * @param tref The type reference of the instance to be constructed + * @return A {@link Parameter} instance with the given parameters + */ + public default Parameter createMinimalParameter(IParameterInitialiser init, String paramName, TypeReference tref) { + Parameter result = init.instantiate(); + init.setName(result, paramName); + init.setTypeReference(result, tref); + return result; + } + + /** + * A variant of + * {@link #createMinimalParameter(IParameterInitialiser, String, TypeReference)}, + * where the {@link TypeReference} parameter is constructed using + * {@link #createMinimalClsRef(String)}. + * + * @param targetName See {@link #createMinimalClsRef(String)} + */ + public default Parameter createMinimalParamWithClsTarget(IParameterInitialiser init, String paramName, + String targetName) { + return this.createMinimalParameter(init, paramName, this.createMinimalClsRef(targetName)); + } + + /** + * A variant of + * {@link #createMinimalParamWithClsTarget(IParameterInitialiser, String, String)} + * that returns an {@link OrdinaryParameter} instance. + */ + public default OrdinaryParameter createMinimalOrdParamWithClsTarget(String paramName, String targetName) { + return (OrdinaryParameter) this.createMinimalParamWithClsTarget(new OrdinaryParameterInitialiser(), paramName, + targetName); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesReferences.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesReferences.java new file mode 100644 index 0000000000..122999c388 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesReferences.java @@ -0,0 +1,11 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +/** + * An interface that can be implemented by tests, which work with + * {@link Reference} instances.
+ *
+ * Contains methods that can be used to create {@link Reference} instances. + */ +public interface UsesReferences extends UsesStringReferences { + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStatements.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStatements.java new file mode 100644 index 0000000000..42b053e594 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStatements.java @@ -0,0 +1,154 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Assert; +import org.emftext.language.java.statements.Block; +import org.emftext.language.java.statements.JumpLabel; +import org.emftext.language.java.statements.LocalVariableStatement; +import org.emftext.language.java.statements.Return; +import org.emftext.language.java.statements.Statement; +import org.emftext.language.java.variables.LocalVariable; + +import cipm.consistency.initialisers.jamopp.statements.AssertInitialiser; +import cipm.consistency.initialisers.jamopp.statements.BlockInitialiser; +import cipm.consistency.initialisers.jamopp.statements.JumpLabelInitialiser; +import cipm.consistency.initialisers.jamopp.statements.LocalVariableStatementInitialiser; +import cipm.consistency.initialisers.jamopp.statements.ReturnInitialiser; +import cipm.consistency.initialisers.jamopp.variables.LocalVariableInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link Statement} instances.
+ *
+ * Contains methods that can be used to create {@link Statement} instances. + */ +public interface UsesStatements extends UsesLiterals { + /** + * @param returnVal The return value of the instance to be constructed + * @return A {@link Return} instance with the given {@link Expression} as its + * return value. + */ + public default Return createMinimalReturn(Expression returnVal) { + var init = new ReturnInitialiser(); + Return result = init.instantiate(); + init.setReturnValue(result, returnVal); + return result; + } + + /** + * @param lvName The name of the instance to be constructed + * @return A {@link LocalVariableStatement} instance with the given name. + */ + public default LocalVariableStatement createMinimalLVS(String lvName) { + var init = new LocalVariableInitialiser(); + var res = init.instantiate(); + init.setName(res, lvName); + return this.createMinimalLVS(res); + } + + /** + * @param lvName The {@link LocalVariable} of the instance to be constructed + * @return A {@link LocalVariableStatement} instance with the given + * {@link LocalVariable}. + */ + public default LocalVariableStatement createMinimalLVS(LocalVariable lv) { + var init = new LocalVariableStatementInitialiser(); + var res = init.instantiate(); + init.setVariable(res, lv); + return res; + } + + /** + * @param jlName The name of the instance to be constructed + * @param targetSt The target statement of the instance to be constructed + * @return A {@link JumpLabel} instance with the given parameter + */ + public default JumpLabel createMinimalJL(String jlName, Statement targetSt) { + var init = new JumpLabelInitialiser(); + var jl = init.instantiate(); + init.setName(jl, jlName); + init.setStatement(jl, targetSt); + return jl; + } + + /** + * @param sts The statements that will be added to the instance to be + * constructed + * @return A {@link Block} instance with the given parameters + */ + public default Block createMinimalBlock(Statement[] sts) { + var init = new BlockInitialiser(); + Block result = init.instantiate(); + init.addStatements(result, sts); + return result; + } + + /** + * @return An {@link Assert} instance, whose {@link Condition} is constructed + * with {@link #createBooleanLiteral(boolean)} using the value true. + */ + public default Assert createMinimalTrivialAssert() { + var init = new AssertInitialiser(); + Assert result = init.instantiate(); + init.setCondition(result, this.createBooleanLiteral(true)); + return result; + } + + /** + * A variant of {@link #createMinimalReturn(Expression)}, where the parameter is + * constructed with {@link #createNullLiteral()}. + * + * @see {@link #createNullLiteral()} + */ + public default Return createMinimalNullReturn() { + return this.createMinimalReturn(this.createNullLiteral()); + } + + /** + * A variant of {@link #createMinimalJLToNullReturn(String)}, where the + * constructed instance has no name (null). + */ + public default JumpLabel createMinimalJLToNullReturn() { + return this.createMinimalJLToNullReturn(null); + } + + /** + * A variant of {@link #createMinimalJLToTrivialAssert(String)}, where the + * constructed instance has no name (null). + */ + public default JumpLabel createMinimalJLToTrivialAssert() { + return this.createMinimalJLToTrivialAssert(null); + } + + /** + * A variant of {@link #createMinimalJL(String, Statement)}, where the target + * statement is generated with {@link #createMinimalNullReturn()}. + */ + public default JumpLabel createMinimalJLToNullReturn(String jlName) { + return this.createMinimalJL(jlName, this.createMinimalNullReturn()); + } + + /** + * A variant of {@link #createMinimalJL(String, Statement)}, where the target + * statement is generated with {@link #createMinimalTrivialAssert()}. + */ + public default JumpLabel createMinimalJLToTrivialAssert(String jlName) { + return this.createMinimalJL(jlName, this.createMinimalTrivialAssert()); + } + + /** + * A variant of {@link #createMinimalBlock(Statement[])} that uses a single + * statement generated by {@link #createMinimalNullReturn()}. + */ + public default Block createMinimalBlockWithNullReturn() { + return this.createMinimalBlock(new Statement[] { this.createMinimalNullReturn() }); + } + + /** + * A variant of {@link #createMinimalBlock(Statement[])} that uses a single + * statement generated by {@link #createMinimalTrivialAssert()}. + */ + public default Block createMinimalBlockWithTrivialAssert() { + return this.createMinimalBlock(new Statement[] { this.createMinimalTrivialAssert() }); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStringReferences.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStringReferences.java new file mode 100644 index 0000000000..56ef65810d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesStringReferences.java @@ -0,0 +1,25 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.references.StringReference; + +import cipm.consistency.initialisers.jamopp.references.StringReferenceInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link StringReference} instances.
+ *
+ * Contains methods that can be used to create {@link StringReference} + * instances. + */ +public interface UsesStringReferences { + /** + * @param val The value of the instance to be constructed + * @return A {@link StringReference} instance with the given parameter + */ + public default StringReference createMinimalSR(String val) { + var init = new StringReferenceInitialiser(); + StringReference result = init.instantiate(); + init.setValue(result, val); + return result; + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesSwitchCases.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesSwitchCases.java new file mode 100644 index 0000000000..cc6c6e0e53 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesSwitchCases.java @@ -0,0 +1,41 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.NormalSwitchCase; + +import cipm.consistency.initialisers.jamopp.statements.NormalSwitchCaseInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link SwitchCase} instances.
+ *
+ * Contains methods that can be used to create {@link SwitchCase} instances. + */ +public interface UsesSwitchCases extends UsesExpressions { + /** + * @param addConds The additional conditions that will be added to the instance + * to be constructed + * @return A {@link NormalSwitchCase} with the given parameters + */ + public default NormalSwitchCase createMinimalNSC(Expression[] addConds) { + var nscInit = new NormalSwitchCaseInitialiser(); + var nsc = nscInit.instantiate(); + nscInit.addAdditionalConditions(nsc, addConds); + return nsc; + } + + /** + * A variant of {@link #createMinimalNSC(Expression[])} that uses a single + * {@link Expression} generated by {@link #createMinimalFalseEE()}. + */ + public default NormalSwitchCase createMinimalNSC() { + return this.createMinimalNSC(new Expression[] { this.createMinimalFalseEE() }); + } + + /** + * A variant of {@link #createMinimalNSC()} that has no additional conditions + */ + public default NormalSwitchCase createEmptyNSC() { + return this.createMinimalNSC(null); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeArguments.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeArguments.java new file mode 100644 index 0000000000..5053f448ba --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeArguments.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.generics.ExtendsTypeArgument; +import org.emftext.language.java.generics.SuperTypeArgument; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.generics.ExtendsTypeArgumentInitialiser; +import cipm.consistency.initialisers.jamopp.generics.SuperTypeArgumentInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link TypeArgument} instances.
+ *
+ * Contains methods that can be used to create {@link TypeArgument} instances. + */ +public interface UsesTypeArguments extends UsesTypeReferences { + /** + * @param extType The extend type of the instance to be constructed + * @return An {@link ExtendsTypeArgument} instance with the given parameter + */ + public default ExtendsTypeArgument createMinimalExtendsTA(TypeReference extType) { + var init = new ExtendsTypeArgumentInitialiser(); + ExtendsTypeArgument result = init.instantiate(); + init.setExtendType(result, extType); + return result; + } + + /** + * @param supType The super type of the instance to be constructed + * @return An {@link SuperTypeArgument} instance with the given parameter + */ + public default SuperTypeArgument createMinimalSuperTA(TypeReference supType) { + var init = new SuperTypeArgumentInitialiser(); + SuperTypeArgument result = init.instantiate(); + init.setSuperType(result, supType); + return result; + } + + /** + * A variant of {@link #createMinimalExtendsTA(TypeReference)}, where the + * parameter is constructed with {@link #createMinimalClsRef(String)}. + * + * @param clsName See {@link #createMinimalClsRef(String)} + */ + public default ExtendsTypeArgument createMinimalExtendsTAWithCls(String clsName) { + return this.createMinimalExtendsTA(this.createMinimalClsRef(clsName)); + } + + /** + * A variant of {@link #createMinimalSuperTA(TypeReference)}, where the + * parameter is constructed with {@link #createMinimalClsRef(String)}. + * + * @param clsName See {@link #createMinimalClsRef(String)} + */ + public default SuperTypeArgument createMinimalSuperTAWithCls(String clsName) { + return this.createMinimalSuperTA(this.createMinimalClsRef(clsName)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeParameters.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeParameters.java new file mode 100644 index 0000000000..115aa6b6d9 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeParameters.java @@ -0,0 +1,63 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.generics.TypeParameter; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.generics.ITypeParameterInitialiser; +import cipm.consistency.initialisers.jamopp.generics.TypeParameterInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link TypeParameter} instances.
+ *
+ * Contains methods that can be used to create {@link TypeParameter} instances. + */ +public interface UsesTypeParameters extends UsesTypeReferences { + /** + * @param init The initialiser that will be used to construct the instance + * @param extTypes The extend types of the instance to be constructed + * @return A {@link TypeParameter} with the given parameters + */ + public default TypeParameter createMinimalTypeParam(ITypeParameterInitialiser init, TypeReference[] extTypes) { + TypeParameter result = init.instantiate(); + init.addExtendTypes(result, extTypes); + return result; + } + + /** + * A variant of + * {@link #createMinimalTypeParam(ITypeParameterInitialiser, TypeReference[])} + * that uses {@link #createMinimalClsRef(String)} to generate the given amount + * of extend types.
+ *
+ * The each generated extend type will point at a {@link Classifier} (will be + * constructed in the process) with the name "cls"+i, where i = 0, 1, ..., + * extTypeCount - 1. + * + * @param extTypeCount The amount of extend types that will be generated in the + * process + */ + public default TypeParameter createMinimalTypeParamWithClsRefs(ITypeParameterInitialiser init, int extTypeCount) { + var arr = new TypeReference[extTypeCount]; + + for (int i = 0; i < extTypeCount; i++) { + arr[i] = this.createMinimalClsRef("cls" + i); + } + + return this.createMinimalTypeParam(init, arr); + } + + /** + * A variant of + * {@link #createMinimalTypeParam(ITypeParameterInitialiser, TypeReference[])} + * that generates a {@link TypeParameter} instance with only one extend type + * that points at a {@link Classifier} generated with + * {@link #createMinimalClsRef(String)} using the given parameter + * + * @param clsName See {@link #createMinimalClsRef(String)} + */ + public default TypeParameter createMinimalTypeParamWithClsRef(String clsName) { + return this.createMinimalTypeParam(new TypeParameterInitialiser(), + new TypeReference[] { this.createMinimalClsRef(clsName) }); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeReferences.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeReferences.java new file mode 100644 index 0000000000..9aa2b215ed --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/UsesTypeReferences.java @@ -0,0 +1,68 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.ClassifierReference; +import org.emftext.language.java.types.NamespaceClassifierReference; +import org.emftext.language.java.types.TypeReference; + +import cipm.consistency.initialisers.jamopp.types.ClassifierReferenceInitialiser; +import cipm.consistency.initialisers.jamopp.types.ITypeReferenceInitialiser; +import cipm.consistency.initialisers.jamopp.types.NamespaceClassifierReferenceInitialiser; + +/** + * An interface that can be implemented by tests, which work with + * {@link TypeReference} instances.
+ *
+ * Contains methods that can be used to create {@link TypeReference} instances. + */ +public interface UsesTypeReferences extends UsesConcreteClassifiers { + /** + * @param init The initialiser that will be used to construct the instance + * @param cls The target of the instance to be constructed + * @return A {@link TypeReference} instance with the given parameters + */ + public default TypeReference createMinimalTypeReference(ITypeReferenceInitialiser init, Classifier cls) { + TypeReference result = init.instantiate(); + init.setTarget(result, cls); + return result; + } + + /** + * A variant of + * {@link #createMinimalTypeReference(ITypeReferenceInitialiser, Classifier)}, + * the {@link Classifier} parameter is constructed with + * {@link #createMinimalClassWithCU(String)}. + * + * @param clsName See {@link #createMinimalClassWithCU(String)} + */ + public default ClassifierReference createMinimalClsRef(String clsName) { + return (ClassifierReference) this.createMinimalTypeReference(new ClassifierReferenceInitialiser(), + this.createMinimalClassWithCU(clsName)); + } + + /** + * A variant of + * {@link #createMinimalTypeReference(ITypeReferenceInitialiser, Classifier)}, + * where the {@link Classifier} parameter is constructed using + * {@link #createMinimalClassWithCU(String)}. + * + * @param clsName See {@link #createMinimalClassWithCU(String)} + */ + public default TypeReference createMinimalClsRef(ITypeReferenceInitialiser init, String clsName) { + return this.createMinimalTypeReference(init, this.createMinimalClassWithCU(clsName)); + } + + /** + * @param clsName See {@link #createMinimalClsRef(String)} + * + * @return A {@link NamespaceClassifierReference} instance with a + * {@link ClassifierReference} constructed with + * {@link #createMinimalClsRef(String)}. + */ + public default NamespaceClassifierReference createMinimalCNR(String clsName) { + var init = new NamespaceClassifierReferenceInitialiser(); + NamespaceClassifierReference result = init.instantiate(); + init.addClassifierReference(result, this.createMinimalClsRef(clsName)); + return result; + } +} From 31a5d21486d2acfe210229b7173ef9ff86e9388c Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:48:02 +0100 Subject: [PATCH 79/87] Add parameterised tests for JaMoPP-related similarity checking Each of these tests are implicitly parameterised over certain JaMoPP objects via the initialiser parameters they take. This way, they spare large amounts of code duplication, because otherwise one would need to separately implement many test methods for each JaMoPP object. These tests isolate certain aspects of JaMoPP objects, such as certain attributes they have, and verify that similarity checker correctly assesses their similarity. Disabled null check tests in interfacetests till NPEs are fixed Use adapted initialisers in some interfacetests till NPEs are fixed --- .../AccessProvidingModuleDirectiveTest.java | 79 ++++++++ .../AnnotableAndModifiableTest.java | 173 ++++++++++++++++++ .../interfacetests/AnnotableTest.java | 63 +++++++ .../interfacetests/ArgumentableTest.java | 60 ++++++ .../ArrayInstantiationByValuesTest.java | 48 +++++ .../interfacetests/ArrayTypeableTest.java | 94 ++++++++++ .../interfacetests/BlockContainerTest.java | 47 +++++ .../CallTypeArgumentableTest.java | 58 ++++++ .../interfacetests/ClassifierTest.java | 119 ++++++++++++ .../ConcreteClassifierTest.java | 47 +++++ .../interfacetests/ConditionalTest.java | 44 +++++ .../interfacetests/ElementReferenceTest.java | 96 ++++++++++ .../interfacetests/ExceptionThrowerTest.java | 59 ++++++ .../interfacetests/ImplementorTest.java | 54 ++++++ .../unittests/interfacetests/ImportTest.java | 45 +++++ .../interfacetests/ImportingElementTest.java | 58 ++++++ .../interfacetests/InitializableTest.java | 47 +++++ .../interfacetests/JavaRootTest.java | 46 +++++ .../unittests/interfacetests/JumpTest.java | 44 +++++ .../interfacetests/MemberContainerTest.java | 84 +++++++++ .../interfacetests/ModifiableTest.java | 55 ++++++ .../interfacetests/NamedElementTest.java | 45 +++++ .../NamespaceAwareElementTest.java | 69 +++++++ .../interfacetests/ParametrizableTest.java | 58 ++++++ .../interfacetests/PrimitiveTypeTest.java | 45 +++++ .../interfacetests/ReferenceTest.java | 76 ++++++++ .../StatementContainerTest.java | 47 +++++ .../StatementListContainerTest.java | 71 +++++++ .../interfacetests/StaticImportTest.java | 45 +++++ .../interfacetests/TypeArgumentableTest.java | 58 ++++++ .../TypeParametrizableTest.java | 58 ++++++ .../interfacetests/TypeReferenceTest.java | 39 ++++ .../TypedElementExtensionTest.java | 57 ++++++ .../interfacetests/TypedElementTest.java | 47 +++++ .../UnaryModificationExpressionTest.java | 61 ++++++ .../interfacetests/package-info.java | 34 ++++ 36 files changed, 2230 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AccessProvidingModuleDirectiveTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableAndModifiableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArgumentableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayInstantiationByValuesTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayTypeableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/BlockContainerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/CallTypeArgumentableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ClassifierTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConcreteClassifierTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConditionalTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ElementReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ExceptionThrowerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImplementorTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportingElementTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/InitializableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JavaRootTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JumpTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/MemberContainerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ModifiableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamedElementTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamespaceAwareElementTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ParametrizableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/PrimitiveTypeTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementContainerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementListContainerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StaticImportTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeArgumentableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeParametrizableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementExtensionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/UnaryModificationExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AccessProvidingModuleDirectiveTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AccessProvidingModuleDirectiveTest.java new file mode 100644 index 0000000000..ec9a99136b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AccessProvidingModuleDirectiveTest.java @@ -0,0 +1,79 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.containers.Package; + +import org.emftext.language.java.modules.AccessProvidingModuleDirective; +import org.emftext.language.java.modules.ModuleReference; +import org.emftext.language.java.modules.ModulesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModuleReferences; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesPackages; +import cipm.consistency.initialisers.jamopp.modules.IAccessProvidingModuleDirectiveInitialiser; + +public class AccessProvidingModuleDirectiveTest extends AbstractJaMoPPSimilarityTest + implements UsesModuleReferences, UsesPackages { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IAccessProvidingModuleDirectiveInitialiser.class); + } + + protected AccessProvidingModuleDirective initElement(IAccessProvidingModuleDirectiveInitialiser init, + ModuleReference[] modRefs, Package accessablePac) { + var result = init.instantiate(); + Assertions.assertTrue(init.addModules(result, modRefs)); + Assertions.assertTrue(init.setAccessablePackage(result, accessablePac)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testModule(IAccessProvidingModuleDirectiveInitialiser init) { + var objOne = this.initElement(init, new ModuleReference[] { this.createMinimalMR("mod1") }, null); + var objTwo = this.initElement(init, new ModuleReference[] { this.createMinimalMR("mod2") }, null); + + this.testSimilarity(objOne, objTwo, ModulesPackage.Literals.ACCESS_PROVIDING_MODULE_DIRECTIVE__MODULES); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testModuleSize(IAccessProvidingModuleDirectiveInitialiser init) { + var objOne = this.initElement(init, + new ModuleReference[] { this.createMinimalMR("mod1"), this.createMinimalMR("mod2") }, null); + var objTwo = this.initElement(init, new ModuleReference[] { this.createMinimalMR("mod1") }, null); + + this.testSimilarity(objOne, objTwo, ModulesPackage.Literals.ACCESS_PROVIDING_MODULE_DIRECTIVE__MODULES); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testModuleNullCheck(IAccessProvidingModuleDirectiveInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, new ModuleReference[] { this.createMinimalMR("mod1") }, null), init, false, + ModulesPackage.Literals.ACCESS_PROVIDING_MODULE_DIRECTIVE__MODULES); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testAccessablePackage(IAccessProvidingModuleDirectiveInitialiser init) { + var objOne = this.initElement(init, null, this.createMinimalPackage(new String[] { "ns1", "ns2" })); + var objTwo = this.initElement(init, null, this.createMinimalPackage(new String[] { "ns3", "ns4" })); + + this.testSimilarity(objOne, objTwo, + ModulesPackage.Literals.ACCESS_PROVIDING_MODULE_DIRECTIVE__ACCESSABLE_PACKAGE); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testAccessablePackageNullCheck(IAccessProvidingModuleDirectiveInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, null, this.createMinimalPackage(new String[] { "ns1", "ns2" })), init, false, + ModulesPackage.Literals.ACCESS_PROVIDING_MODULE_DIRECTIVE__ACCESSABLE_PACKAGE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableAndModifiableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableAndModifiableTest.java new file mode 100644 index 0000000000..3a8a3b1458 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableAndModifiableTest.java @@ -0,0 +1,173 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.annotations.AnnotationInstance; +import org.emftext.language.java.modifiers.ModifiersPackage; +import org.emftext.language.java.modifiers.AnnotableAndModifiable; +import org.emftext.language.java.modifiers.Modifier; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationInstances; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModifiers; +import cipm.consistency.initialisers.jamopp.modifiers.IAnnotableAndModifiableInitialiser; + +public class AnnotableAndModifiableTest extends AbstractJaMoPPSimilarityTest + implements UsesAnnotationInstances, UsesModifiers { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IAnnotableAndModifiableInitialiser.class); + } + + protected AnnotableAndModifiable initElement(IAnnotableAndModifiableInitialiser init, Modifier[] modifs, + AnnotationInstance[] ais) { + + var result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addModifiers(result, modifs)); + Assertions.assertTrue(init.addAnnotationInstances(result, ais)); + + return result; + } + + @ParameterizedTest() + @MethodSource("provideArguments") + public void testModifier(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, new Modifier[] { this.createAbstract(), this.createSynchronized() }, null); + var objTwo = this.initElement(init, new Modifier[] { this.createVolatile(), this.createProtected() }, null); + + this.testSimilarity(objOne, objTwo, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @ParameterizedTest() + @MethodSource("provideArguments") + public void testModifierSize(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, new Modifier[] { this.createAbstract(), this.createSynchronized() }, null); + var objTwo = this.initElement(init, new Modifier[] { this.createAbstract() }, null); + + this.testSimilarity(objOne, objTwo, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest() + @MethodSource("provideArguments") + public void testModifierNullCheck(IAnnotableAndModifiableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, new Modifier[] { this.createAbstract(), this.createSynchronized() }, null), init, + true, ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @ParameterizedTest() + @MethodSource("provideArguments") + public void testAnnotationInstance(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1") }); + var objTwo = this.initElement(init, null, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns2" }, "anno2") }); + + this.testSimilarity(objOne, objTwo, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @ParameterizedTest() + @MethodSource("provideArguments") + public void testAnnotationInstanceSize(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1") }); + var objTwo = this.initElement(init, null, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1"), + this.createMinimalAI(new String[] { "ns2" }, "anno2") }); + + this.testSimilarity(objOne, objTwo, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest() + @MethodSource("provideArguments") + public void testAnnotationInstanceNullCheck(IAnnotableAndModifiableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, null, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1") }), + init, true, ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @ParameterizedTest() + @MethodSource("provideArguments") + public void testPrivate(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, null); + init.makePrivate(objOne); + + var objTwo = this.initElement(init, null, null); + init.makePublic(objTwo); + + this.testSimilarity(objOne, objTwo, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest() + @MethodSource("provideArguments") + public void testPrivateNullCheck(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, null); + init.makePrivate(objOne); + + this.testSimilarityNullCheck(objOne, init, true, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @ParameterizedTest() + @MethodSource("provideArguments") + public void testProtected(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, null); + init.makeProtected(objOne); + + var objTwo = this.initElement(init, null, null); + init.makePublic(objTwo); + + this.testSimilarity(objOne, objTwo, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest() + @MethodSource("provideArguments") + public void testProtectedNullCheck(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, null); + init.makeProtected(objOne); + + this.testSimilarityNullCheck(objOne, init, true, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @ParameterizedTest() + @MethodSource("provideArguments") + public void testPublic(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, null); + init.makePublic(objOne); + + var objTwo = this.initElement(init, null, null); + init.makePrivate(objTwo); + + this.testSimilarity(objOne, objTwo, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest() + @MethodSource("provideArguments") + public void testPublicNullCheck(IAnnotableAndModifiableInitialiser init) { + var objOne = this.initElement(init, null, null); + init.makePublic(objOne); + + this.testSimilarityNullCheck(objOne, init, true, + ModifiersPackage.Literals.ANNOTABLE_AND_MODIFIABLE__ANNOTATIONS_AND_MODIFIERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableTest.java new file mode 100644 index 0000000000..cd3cca4972 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/AnnotableTest.java @@ -0,0 +1,63 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.annotations.Annotable; +import org.emftext.language.java.annotations.AnnotationInstance; +import org.emftext.language.java.annotations.AnnotationsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationInstances; +import cipm.consistency.initialisers.jamopp.annotations.IAnnotableInitialiser; + +public class AnnotableTest extends AbstractJaMoPPSimilarityTest implements UsesAnnotationInstances { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IAnnotableInitialiser.class); + } + + protected Annotable initElement(IAnnotableInitialiser init, AnnotationInstance[] annotations) { + Annotable result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addAnnotations(result, annotations)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testAnnotation(IAnnotableInitialiser init) { + var objOne = this.initElement(init, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1") }); + var objTwo = this.initElement(init, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns2" }, "anno2") }); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTABLE__ANNOTATIONS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testAnnotationSize(IAnnotableInitialiser init) { + var objOne = this.initElement(init, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1"), + this.createMinimalAI(new String[] { "ns2" }, "anno2") }); + var objTwo = this.initElement(init, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1") }); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTABLE__ANNOTATIONS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testAnnotationNullCheck(IAnnotableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, + new AnnotationInstance[] { this.createMinimalAI(new String[] { "ns1" }, "anno1") }), + init, true, AnnotationsPackage.Literals.ANNOTABLE__ANNOTATIONS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArgumentableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArgumentableTest.java new file mode 100644 index 0000000000..edd05ce1db --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArgumentableTest.java @@ -0,0 +1,60 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.references.Argumentable; +import org.emftext.language.java.references.ReferencesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLiterals; +import cipm.consistency.initialisers.jamopp.references.IArgumentableInitialiser; + +public class ArgumentableTest extends AbstractJaMoPPSimilarityTest + implements UsesConcreteClassifiers, UsesExpressions, UsesLiterals { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IArgumentableInitialiser.class); + } + + protected Argumentable initElement(IArgumentableInitialiser init, Expression[] args) { + var result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addArguments(result, args)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArguments(IArgumentableInitialiser init) { + var objOne = this.initElement(init, new Expression[] { this.createDecimalIntegerLiteral(1) }); + var objTwo = this.initElement(init, new Expression[] { this.createDecimalIntegerLiteral(0) }); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.ARGUMENTABLE__ARGUMENTS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArgumentsSize(IArgumentableInitialiser init) { + var objOne = this.initElement(init, + new Expression[] { this.createDecimalIntegerLiteral(1), this.createDecimalIntegerLiteral(2) }); + var objTwo = this.initElement(init, new Expression[] { this.createDecimalIntegerLiteral(1) }); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.ARGUMENTABLE__ARGUMENTS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testArgumentsNullCheck(IArgumentableInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, new Expression[] { this.createDecimalIntegerLiteral(1) }), + init, true, ReferencesPackage.Literals.ARGUMENTABLE__ARGUMENTS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayInstantiationByValuesTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayInstantiationByValuesTest.java new file mode 100644 index 0000000000..01443c0a60 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayInstantiationByValuesTest.java @@ -0,0 +1,48 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.arrays.ArrayInitializer; +import org.emftext.language.java.arrays.ArrayInstantiationByValues; +import org.emftext.language.java.arrays.ArraysPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesArrayInitializers; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLiterals; +import cipm.consistency.initialisers.jamopp.arrays.IArrayInstantiationByValuesInitialiser; + +public class ArrayInstantiationByValuesTest extends AbstractJaMoPPSimilarityTest + implements UsesArrayInitializers, UsesLiterals { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IArrayInstantiationByValuesInitialiser.class); + } + + protected ArrayInstantiationByValues initElement(IArrayInstantiationByValuesInitialiser init, + ArrayInitializer arrInit) { + ArrayInstantiationByValues result = init.instantiate(); + Assertions.assertTrue(init.setArrayInitializer(result, arrInit)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayInitialiser(IArrayInstantiationByValuesInitialiser init) { + var objOne = this.initElement(init, this.createMinimalArrayInitializer(this.createDecimalIntegerLiteral(0))); + var objTwo = this.initElement(init, this.createMinimalArrayInitializer(this.createDecimalIntegerLiteral(1))); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_INSTANTIATION_BY_VALUES__ARRAY_INITIALIZER); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayInitialiserNullCheck(IArrayInstantiationByValuesInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, this.createMinimalArrayInitializer(this.createDecimalIntegerLiteral(0))), init, + false, ArraysPackage.Literals.ARRAY_INSTANTIATION_BY_VALUES__ARRAY_INITIALIZER); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayTypeableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayTypeableTest.java new file mode 100644 index 0000000000..cb0e53cb7f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ArrayTypeableTest.java @@ -0,0 +1,94 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.arrays.ArrayDimension; +import org.emftext.language.java.arrays.ArrayTypeable; +import org.emftext.language.java.arrays.ArraysPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesArrayDimensions; +import cipm.consistency.initialisers.jamopp.arrays.IArrayTypeableInitialiser; + +public class ArrayTypeableTest extends AbstractJaMoPPSimilarityTest implements UsesArrayDimensions { + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IArrayTypeableInitialiser.class); + } + + protected ArrayTypeable initElement(IArrayTypeableInitialiser init, ArrayDimension[] arrDimsBefore, + ArrayDimension[] arrDimsAfter) { + ArrayTypeable result = init.instantiate(); + Assertions.assertTrue(init.addArrayDimensionsBefore(result, arrDimsBefore)); + Assertions.assertTrue(init.addArrayDimensionsAfter(result, arrDimsAfter)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayDimensionsBefore(IArrayTypeableInitialiser init) { + var objOne = this.initElement(init, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1") }, null); + var objTwo = this.initElement(init, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns2" }, "ai2") }, null); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_BEFORE); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayDimensionsBeforeSize(IArrayTypeableInitialiser init) { + var objOne = this.initElement(init, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1"), + this.createArrayDimension(new String[] { "ns2" }, "ai2") }, + null); + var objTwo = this.initElement(init, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1") }, null); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_BEFORE); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayDimensionsBeforeNullCheck(IArrayTypeableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1") }, null), + init, false, ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_BEFORE); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayDimensionsAfter(IArrayTypeableInitialiser init) { + var objOne = this.initElement(init, null, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1") }); + var objTwo = this.initElement(init, null, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns2" }, "ai2") }); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_AFTER); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayDimensionsAfterSize(IArrayTypeableInitialiser init) { + var objOne = this.initElement(init, null, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1"), + this.createArrayDimension(new String[] { "ns2" }, "ai2") }); + var objTwo = this.initElement(init, null, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1") }); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_AFTER); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArrayDimensionsAfterNullCheck(IArrayTypeableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, null, + new ArrayDimension[] { this.createArrayDimension(new String[] { "ns1" }, "ai1") }), + init, false, ArraysPackage.Literals.ARRAY_TYPEABLE__ARRAY_DIMENSIONS_AFTER); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/BlockContainerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/BlockContainerTest.java new file mode 100644 index 0000000000..0cb9ff2978 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/BlockContainerTest.java @@ -0,0 +1,47 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.statements.Block; +import org.emftext.language.java.statements.BlockContainer; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.statements.IBlockContainerInitialiser; + +public class BlockContainerTest extends AbstractJaMoPPSimilarityTest implements UsesStatements { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IBlockContainerInitialiser.class); + } + + protected BlockContainer initElement(IBlockContainerInitialiser init, Block bl) { + BlockContainer result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.setBlock(result, bl)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testBlock(IBlockContainerInitialiser init) { + var objOne = this.initElement(init, this.createMinimalBlockWithNullReturn()); + var objTwo = this.initElement(init, this.createMinimalBlockWithTrivialAssert()); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.BLOCK_CONTAINER__BLOCK); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testBlockNullCheck(IBlockContainerInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalBlockWithNullReturn()), init, true, + StatementsPackage.Literals.BLOCK_CONTAINER__BLOCK); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/CallTypeArgumentableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/CallTypeArgumentableTest.java new file mode 100644 index 0000000000..120029d3d2 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/CallTypeArgumentableTest.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.generics.CallTypeArgumentable; +import org.emftext.language.java.generics.GenericsPackage; +import org.emftext.language.java.generics.TypeArgument; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeArguments; +import cipm.consistency.initialisers.jamopp.generics.ICallTypeArgumentableInitialiser; + +public class CallTypeArgumentableTest extends AbstractJaMoPPSimilarityTest implements UsesTypeArguments { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(ICallTypeArgumentableInitialiser.class); + } + + protected CallTypeArgumentable initElement(ICallTypeArgumentableInitialiser init, TypeArgument[] callTypeArgs) { + CallTypeArgumentable result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addCallTypeArguments(result, callTypeArgs)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testCallTypeArguments(ICallTypeArgumentableInitialiser init) { + var objOne = this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1") }); + var objTwo = this.initElement(init, new TypeArgument[] { this.createMinimalSuperTAWithCls("cls2") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.CALL_TYPE_ARGUMENTABLE__CALL_TYPE_ARGUMENTS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testCallTypeArgumentsSize(ICallTypeArgumentableInitialiser init) { + var objOne = this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1"), + this.createMinimalExtendsTAWithCls("cls2") }); + var objTwo = this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.CALL_TYPE_ARGUMENTABLE__CALL_TYPE_ARGUMENTS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testCallTypeArgumentsNullCheck(ICallTypeArgumentableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1") }), init, true, + GenericsPackage.Literals.CALL_TYPE_ARGUMENTABLE__CALL_TYPE_ARGUMENTS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ClassifierTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ClassifierTest.java new file mode 100644 index 0000000000..42e5372cfe --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ClassifierTest.java @@ -0,0 +1,119 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.imports.Import; +import org.emftext.language.java.imports.ImportsPackage; +import org.emftext.language.java.imports.PackageImport; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesImports; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesPackageImports; +import cipm.consistency.initialisers.jamopp.classifiers.IClassifierInitialiser; + +/** + * Classifier has no modifiable attributes on its own. + * + * @author Alp Torac Genc + */ +public class ClassifierTest extends AbstractJaMoPPSimilarityTest implements UsesImports, UsesPackageImports { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IClassifierInitialiser.class); + } + + protected Classifier initElement(IClassifierInitialiser init, Import[] imps, PackageImport[] pImps) { + + var result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + + // If there are no imports to add, add(Package)Imports will return true + Assertions.assertEquals(init.canAddImports(result) || imps == null, init.addImports(result, imps)); + Assertions.assertEquals(init.canAddPackageImports(result) || pImps == null, + init.addPackageImports(result, pImps)); + + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testImports(IClassifierInitialiser init) { + var objOne = this.initElement(init, new Import[] { this.createMinimalClsImport("cls1") }, null); + var objTwo = this.initElement(init, new Import[] { this.createMinimalClsImport("cls2") }, null); + + this.testSimilarity(objOne, objTwo, + this.getExpectedSimilarityResult(ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS).booleanValue() + || (!init.canAddImports(objOne) && !init.canAddImports(objTwo))); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testImportsSize(IClassifierInitialiser init) { + var objOne = this.initElement(init, + new Import[] { this.createMinimalClsImport("cls1"), this.createMinimalClsImport("cls2") }, null); + var objTwo = this.initElement(init, new Import[] { this.createMinimalClsImport("cls1") }, null); + + this.testSimilarity(objOne, objTwo, + this.getExpectedSimilarityResult(ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS).booleanValue() + || (!init.canAddImports(objOne) && !init.canAddImports(objTwo))); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testImportsNullCheck(IClassifierInitialiser init) { + var objOne = this.initElement(init, new Import[] { this.createMinimalClsImport("cls1") }, null); + + this.testSimilarityNullCheck(objOne, init, true, + this.getExpectedSimilarityResult(ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS).booleanValue() + || (!init.canAddImports(objOne))); + } + + /** + * Package import differences do not break similarity + */ + @ParameterizedTest + @MethodSource("provideArguments") + public void testPackageImports(IClassifierInitialiser init) { + var objOne = this.initElement(init, null, + new PackageImport[] { this.createMinimalPackageImport(new String[] { "ns1", "ns2" }) }); + var objTwo = this.initElement(init, null, + new PackageImport[] { this.createMinimalPackageImport(new String[] { "ns3", "ns4" }) }); + + this.testSimilarity(objOne, objTwo, + this.getExpectedSimilarityResult(ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS).booleanValue() + || (!init.canAddImports(objOne) && !init.canAddImports(objTwo))); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testPackageImportsSize(IClassifierInitialiser init) { + var objOne = this.initElement(init, null, + new PackageImport[] { this.createMinimalPackageImport(new String[] { "ns1", "ns2" }), + this.createMinimalPackageImport(new String[] { "ns3", "ns4" }) }); + var objTwo = this.initElement(init, null, + new PackageImport[] { this.createMinimalPackageImport(new String[] { "ns1", "ns2" }) }); + + this.testSimilarity(objOne, objTwo, + this.getExpectedSimilarityResult(ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS).booleanValue() + || (!init.canAddImports(objOne) && !init.canAddImports(objTwo))); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testPackageImportsNullCheck(IClassifierInitialiser init) { + var objOne = this.initElement(init, null, + new PackageImport[] { this.createMinimalPackageImport(new String[] { "ns1", "ns2" }) }); + + this.testSimilarityNullCheck(objOne, init, true, + this.getExpectedSimilarityResult(ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS).booleanValue() + || (!init.canAddImports(objOne))); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConcreteClassifierTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConcreteClassifierTest.java new file mode 100644 index 0000000000..4ab95840ee --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConcreteClassifierTest.java @@ -0,0 +1,47 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import org.emftext.language.java.containers.Package; + +import java.util.stream.Stream; + +import org.emftext.language.java.classifiers.ClassifiersPackage; +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesPackages; +import cipm.consistency.initialisers.jamopp.classifiers.IConcreteClassifierInitialiser; + +public class ConcreteClassifierTest extends AbstractJaMoPPSimilarityTest implements UsesPackages { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IConcreteClassifierInitialiser.class); + } + + protected ConcreteClassifier initElement(IConcreteClassifierInitialiser init, Package pac) { + + ConcreteClassifier result = init.instantiate(); + Assertions.assertTrue(init.setPackage(result, pac)); + + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testPackage(IConcreteClassifierInitialiser init) { + var objOne = this.initElement(init, this.createMinimalPackage("pOneNS", 2)); + var objTwo = this.initElement(init, this.createMinimalPackage("pTwoNS", 2)); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.CONCRETE_CLASSIFIER__PACKAGE); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testPackageNullCheck(IConcreteClassifierInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalPackage("pOneNS", 2)), init, false, + ClassifiersPackage.Literals.CONCRETE_CLASSIFIER__PACKAGE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConditionalTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConditionalTest.java new file mode 100644 index 0000000000..1f82dd7edd --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ConditionalTest.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Conditional; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.IConditionalInitialiser; + +public class ConditionalTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IConditionalInitialiser.class); + } + + protected Conditional initElement(IConditionalInitialiser init, Expression cond) { + Conditional result = init.instantiate(); + Assertions.assertTrue(init.setCondition(result, cond)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testCondition(IConditionalInitialiser init) { + var objOne = this.initElement(init, this.createMinimalTrueEE()); + var objTwo = this.initElement(init, this.createMinimalTrueNEE()); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.CONDITIONAL__CONDITION); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testConditionNullCheck(IConditionalInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalTrueEE()), init, false, + StatementsPackage.Literals.CONDITIONAL__CONDITION); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ElementReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ElementReferenceTest.java new file mode 100644 index 0000000000..e5a09db934 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ElementReferenceTest.java @@ -0,0 +1,96 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.references.ElementReference; +import org.emftext.language.java.references.ReferenceableElement; +import org.emftext.language.java.references.ReferencesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.references.IElementReferenceInitialiser; + +public class ElementReferenceTest extends AbstractJaMoPPSimilarityTest implements UsesConcreteClassifiers { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IElementReferenceInitialiser.class); + } + + protected ElementReference initElement(IElementReferenceInitialiser init, ReferenceableElement target, + ReferenceableElement cTarget) { + ElementReference result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.setTarget(result, target)); + Assertions.assertTrue(init.setContainedTarget(result, cTarget)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTarget(IElementReferenceInitialiser init) { + var objOne = this.initElement(init, this.createMinimalClass("cls1"), null); + var objTwo = this.initElement(init, this.createMinimalClass("cls2"), null); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.ELEMENT_REFERENCE__TARGET); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testTargetNullCheck(IElementReferenceInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalClass("cls1"), null), init, false, + ReferencesPackage.Literals.ELEMENT_REFERENCE__TARGET); + } + + /** + * Makes sure that not providing a container for the created element reference + * does not result in an exception. + */ + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testTargetNoException(IElementReferenceInitialiser init) { + var objOne = this.initElement(init, this.createMinimalClass("cls1"), null); + var objTwo = this.initElement(init, this.createMinimalClass("cls2"), null); + + Assertions.assertDoesNotThrow( + () -> this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.ELEMENT_REFERENCE__TARGET)); + } + + /** + * Makes sure that not providing a container for the created element reference + * does not result in an exception, if it is compared to an uninitialised + * element reference. + */ + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testTargetNoExceptionNullCheck(IElementReferenceInitialiser init) { + var objOne = this.initElement(init, this.createMinimalClass("cls1"), null); + var objTwo = init.instantiate(); + + Assertions.assertDoesNotThrow( + () -> this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.ELEMENT_REFERENCE__TARGET)); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testContainedTarget(IElementReferenceInitialiser init) { + var objOne = this.initElement(init, null, this.createMinimalClass("cls1")); + var objTwo = this.initElement(init, null, this.createMinimalClass("cls2")); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.ELEMENT_REFERENCE__CONTAINED_TARGET); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testContainedTargetNullCheck(IElementReferenceInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, null, this.createMinimalClass("cls1")), init, false, + ReferencesPackage.Literals.ELEMENT_REFERENCE__CONTAINED_TARGET); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ExceptionThrowerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ExceptionThrowerTest.java new file mode 100644 index 0000000000..bc6fba636c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ExceptionThrowerTest.java @@ -0,0 +1,59 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.members.ExceptionThrower; +import org.emftext.language.java.members.MembersPackage; +import org.emftext.language.java.types.NamespaceClassifierReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.members.IExceptionThrowerInitialiser; + +public class ExceptionThrowerTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IExceptionThrowerInitialiser.class); + } + + protected ExceptionThrower initElement(IExceptionThrowerInitialiser init, + NamespaceClassifierReference[] exceptions) { + ExceptionThrower result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addExceptions(result, exceptions)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testExceptions(IExceptionThrowerInitialiser init) { + var objOne = this.initElement(init, new NamespaceClassifierReference[] { this.createMinimalCNR("cls1") }); + var objTwo = this.initElement(init, new NamespaceClassifierReference[] { this.createMinimalCNR("cls2") }); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.EXCEPTION_THROWER__EXCEPTIONS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testExceptionsSize(IExceptionThrowerInitialiser init) { + var objOne = this.initElement(init, + new NamespaceClassifierReference[] { this.createMinimalCNR("cls1"), this.createMinimalCNR("cls2") }); + var objTwo = this.initElement(init, new NamespaceClassifierReference[] { this.createMinimalCNR("cls1") }); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.EXCEPTION_THROWER__EXCEPTIONS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testExceptionsNullCheck(IExceptionThrowerInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, new NamespaceClassifierReference[] { this.createMinimalCNR("cls1") }), init, + true, MembersPackage.Literals.EXCEPTION_THROWER__EXCEPTIONS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImplementorTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImplementorTest.java new file mode 100644 index 0000000000..96577bb0cd --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImplementorTest.java @@ -0,0 +1,54 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.classifiers.ClassifiersPackage; +import org.emftext.language.java.classifiers.Implementor; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.classifiers.IImplementorInitialiser; + +public class ImplementorTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IImplementorInitialiser.class); + } + + protected Implementor initElement(IImplementorInitialiser init, TypeReference[] impls) { + Implementor result = init.instantiate(); + Assertions.assertTrue(init.addImplements(result, impls)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testImplements(IImplementorInitialiser init) { + var objOne = this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls1") }); + var objTwo = this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.IMPLEMENTOR__IMPLEMENTS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testImplementsSize(IImplementorInitialiser init) { + var objOne = this.initElement(init, + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }); + var objTwo = this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.IMPLEMENTOR__IMPLEMENTS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testImplementsNullCheck(IImplementorInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls1") }), + init, false, ClassifiersPackage.Literals.IMPLEMENTOR__IMPLEMENTS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportTest.java new file mode 100644 index 0000000000..194a5f69c5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportTest.java @@ -0,0 +1,45 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.imports.Import; +import org.emftext.language.java.imports.ImportsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesImports; +import cipm.consistency.initialisers.jamopp.imports.IImportInitialiser; + +public class ImportTest extends AbstractJaMoPPSimilarityTest implements UsesImports { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IImportInitialiser.class); + } + + protected Import initElement(IImportInitialiser init, ConcreteClassifier cls) { + Import result = init.instantiate(); + Assertions.assertTrue(init.setClassifier(result, cls)); + + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testClassifier(IImportInitialiser init) { + var objOne = this.initElement(init, this.createMinimalClass("cls1Name")); + var objTwo = this.initElement(init, this.createMinimalClass("cls2Name")); + + this.testSimilarity(objOne, objTwo, ImportsPackage.Literals.IMPORT__CLASSIFIER); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testClassifierNullCheck(IImportInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalClass("cls1Name")), init, false, + ImportsPackage.Literals.IMPORT__CLASSIFIER); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportingElementTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportingElementTest.java new file mode 100644 index 0000000000..8bc94d955c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ImportingElementTest.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import org.emftext.language.java.imports.Import; +import org.emftext.language.java.imports.ImportingElement; +import org.emftext.language.java.imports.ImportsPackage; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesImportingElements; +import cipm.consistency.initialisers.jamopp.imports.IImportingElementInitialiser; + +public class ImportingElementTest extends AbstractJaMoPPSimilarityTest implements UsesImportingElements { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IImportingElementInitialiser.class); + } + + protected ImportingElement initElement(IImportingElementInitialiser init, Import[] imps) { + ImportingElement result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addImports(result, imps)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testImports(IImportingElementInitialiser init) { + var objOne = this.initElement(init, new Import[] { this.createMinimalClsImport("cls1") }); + var objTwo = this.initElement(init, new Import[] { this.createMinimalClsImport("cls2") }); + + this.testSimilarity(objOne, objTwo, ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testImportsSize(IImportingElementInitialiser init) { + var objOne = this.initElement(init, + new Import[] { this.createMinimalClsImport("cls1"), this.createMinimalClsImport("cls2") }); + var objTwo = this.initElement(init, new Import[] { this.createMinimalClsImport("cls1") }); + + this.testSimilarity(objOne, objTwo, ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testImportsNullCheck(IImportingElementInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, new Import[] { this.createMinimalClsImport("cls1") }), init, + true, ImportsPackage.Literals.IMPORTING_ELEMENT__IMPORTS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/InitializableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/InitializableTest.java new file mode 100644 index 0000000000..0e7ade8281 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/InitializableTest.java @@ -0,0 +1,47 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.instantiations.Initializable; +import org.emftext.language.java.instantiations.InstantiationsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLiterals; +import cipm.consistency.initialisers.jamopp.instantiations.IInitializableInitialiser; + +public class InitializableTest extends AbstractJaMoPPSimilarityTest implements UsesLiterals { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IInitializableInitialiser.class); + } + + protected Initializable initElement(IInitializableInitialiser init, Expression initVal) { + Initializable result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.setInitialValue(result, initVal)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testInitialValue(IInitializableInitialiser init) { + var objOne = this.initElement(init, this.createDecimalIntegerLiteral(5)); + var objTwo = this.initElement(init, this.createBooleanLiteral(false)); + + this.testSimilarity(objOne, objTwo, InstantiationsPackage.Literals.INITIALIZABLE__INITIAL_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testInitialValueNullCheck(IInitializableInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createDecimalIntegerLiteral(5)), init, true, + InstantiationsPackage.Literals.INITIALIZABLE__INITIAL_VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JavaRootTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JavaRootTest.java new file mode 100644 index 0000000000..68338fdbe0 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JavaRootTest.java @@ -0,0 +1,46 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.containers.ContainersPackage; +import org.emftext.language.java.containers.JavaRoot; +import org.emftext.language.java.containers.Origin; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.containers.IJavaRootInitialiser; + +public class JavaRootTest extends AbstractJaMoPPSimilarityTest { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IJavaRootInitialiser.class); + } + + protected JavaRoot initElement(IJavaRootInitialiser init, Origin origin) { + JavaRoot result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.setOrigin(result, origin)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testOrigin(IJavaRootInitialiser init) { + var objOne = this.initElement(init, Origin.BINDING); + var objTwo = this.initElement(init, Origin.CLASS); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.JAVA_ROOT__ORIGIN); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testOriginNullCheck(IJavaRootInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, Origin.BINDING), init, true, + ContainersPackage.Literals.JAVA_ROOT__ORIGIN); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JumpTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JumpTest.java new file mode 100644 index 0000000000..f5b05df3a1 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/JumpTest.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.statements.Jump; +import org.emftext.language.java.statements.JumpLabel; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.statements.IJumpInitialiser; + +public class JumpTest extends AbstractJaMoPPSimilarityTest implements UsesStatements { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IJumpInitialiser.class); + } + + protected Jump initElement(IJumpInitialiser init, JumpLabel jl) { + Jump result = init.instantiate(); + Assertions.assertTrue(init.setTarget(result, jl)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTarget(IJumpInitialiser init) { + var objOne = this.initElement(init, this.createMinimalJLToNullReturn("jl1")); + var objTwo = this.initElement(init, this.createMinimalJLToTrivialAssert("jl2")); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.JUMP__TARGET); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTargetNullCheck(IJumpInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalJLToNullReturn("jl1")), init, false, + StatementsPackage.Literals.JUMP__TARGET); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/MemberContainerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/MemberContainerTest.java new file mode 100644 index 0000000000..92f518317d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/MemberContainerTest.java @@ -0,0 +1,84 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.members.Member; +import org.emftext.language.java.members.MemberContainer; +import org.emftext.language.java.members.MembersPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesFields; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesMethods; +import cipm.consistency.initialisers.jamopp.members.IMemberContainerInitialiser; + +public class MemberContainerTest extends AbstractJaMoPPSimilarityTest + implements UsesMethods, UsesFields, UsesConcreteClassifiers { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IMemberContainerInitialiser.class); + } + + protected MemberContainer initElement(IMemberContainerInitialiser init, Member[] members, Member[] defMembers) { + MemberContainer result = init.instantiate(); + Assertions.assertTrue(init.addMembers(result, members)); + Assertions.assertTrue(init.addDefaultMembers(result, defMembers)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testMember(IMemberContainerInitialiser init) { + var objOne = this.initElement(init, new Member[] { this.createMinimalClass("cls1") }, null); + var objTwo = this.initElement(init, new Member[] { this.createMinimalClass("cls2") }, null); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.MEMBER_CONTAINER__MEMBERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testMemberSize(IMemberContainerInitialiser init) { + var objOne = this.initElement(init, + new Member[] { this.createMinimalClass("cls1"), this.createMinimalClass("cls2") }, null); + var objTwo = this.initElement(init, new Member[] { this.createMinimalClass("cls1") }, null); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.MEMBER_CONTAINER__MEMBERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testMemberNullCheck(IMemberContainerInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, new Member[] { this.createMinimalClass("cls1") }, null), + init, false, MembersPackage.Literals.MEMBER_CONTAINER__MEMBERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testDefaultMember(IMemberContainerInitialiser init) { + var objOne = this.initElement(init, null, new Member[] { this.createMinimalClass("cls1") }); + var objTwo = this.initElement(init, null, new Member[] { this.createMinimalClass("cls2") }); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.MEMBER_CONTAINER__DEFAULT_MEMBERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testDefaultMemberSize(IMemberContainerInitialiser init) { + var objOne = this.initElement(init, null, + new Member[] { this.createMinimalClass("cls1"), this.createMinimalClass("cls2") }); + var objTwo = this.initElement(init, null, new Member[] { this.createMinimalClass("cls1") }); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.MEMBER_CONTAINER__DEFAULT_MEMBERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testDefaultMemberNullCheck(IMemberContainerInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, null, new Member[] { this.createMinimalClass("cls1") }), + init, false, MembersPackage.Literals.MEMBER_CONTAINER__DEFAULT_MEMBERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ModifiableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ModifiableTest.java new file mode 100644 index 0000000000..da87ad34af --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ModifiableTest.java @@ -0,0 +1,55 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.modifiers.Modifiable; +import org.emftext.language.java.modifiers.Modifier; +import org.emftext.language.java.modifiers.ModifiersPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModifiers; +import cipm.consistency.initialisers.jamopp.modifiers.IModifiableInitialiser; + +public class ModifiableTest extends AbstractJaMoPPSimilarityTest implements UsesModifiers { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IModifiableInitialiser.class); + } + + protected Modifiable initElement(IModifiableInitialiser init, Modifier[] modifs) { + Modifiable result = init.instantiate(); + Assertions.assertTrue(init.addModifiers(result, modifs)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testModifier(IModifiableInitialiser init) { + var objOne = this.initElement(init, new Modifier[] { this.createFinal() }); + var objTwo = this.initElement(init, new Modifier[] { this.createAbstract() }); + + this.testSimilarity(objOne, objTwo, ModifiersPackage.Literals.MODIFIABLE__MODIFIERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testModifierSize(IModifiableInitialiser init) { + var objOne = this.initElement(init, new Modifier[] { this.createFinal(), this.createAbstract() }); + var objTwo = this.initElement(init, new Modifier[] { this.createFinal() }); + + this.testSimilarity(objOne, objTwo, ModifiersPackage.Literals.MODIFIABLE__MODIFIERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testModifierNullCheck(IModifiableInitialiser init) { + var objOne = this.initElement(init, new Modifier[] { this.createFinal() }); + var objTwo = init.instantiate(); + + this.testSimilarity(objOne, objTwo, ModifiersPackage.Literals.MODIFIABLE__MODIFIERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamedElementTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamedElementTest.java new file mode 100644 index 0000000000..bbdd5e57d5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamedElementTest.java @@ -0,0 +1,45 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.commons.CommonsPackage; +import org.emftext.language.java.commons.NamedElement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.commons.INamedElementInitialiser; + +public class NamedElementTest extends AbstractJaMoPPSimilarityTest { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(INamedElementInitialiser.class); + } + + protected NamedElement initElement(INamedElementInitialiser init, String name) { + NamedElement result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertEquals(init.canSetName(result) || name == null, init.setName(result, name)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testName(INamedElementInitialiser init) { + var objOne = this.initElement(init, "name11"); + var objTwo = this.initElement(init, "name22"); + + this.testSimilarity(objOne, objTwo, CommonsPackage.Literals.NAMED_ELEMENT__NAME); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testNameNullCheck(INamedElementInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, "name11"), init, false, + CommonsPackage.Literals.NAMED_ELEMENT__NAME); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamespaceAwareElementTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamespaceAwareElementTest.java new file mode 100644 index 0000000000..2dd5b3c402 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/NamespaceAwareElementTest.java @@ -0,0 +1,69 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.commons.CommonsPackage; +import org.emftext.language.java.commons.NamespaceAwareElement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.commons.INamespaceAwareElementInitialiser; + +public class NamespaceAwareElementTest extends AbstractJaMoPPSimilarityTest { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(INamespaceAwareElementInitialiser.class); + } + + private final String[] nss1 = new String[] { "ns11", "ns12", "ns13" }; + private final String[] nss2 = new String[] { "ns21", "ns22", "ns23" }; + + protected NamespaceAwareElement initElement(INamespaceAwareElementInitialiser init, String[] nss) { + NamespaceAwareElement result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addNamespaces(result, nss)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testNamespace(INamespaceAwareElementInitialiser init) { + var objOne = this.initElement(init, nss1); + var objTwo = this.initElement(init, nss2); + + this.testSimilarity(objOne, objTwo, CommonsPackage.Literals.NAMESPACE_AWARE_ELEMENT__NAMESPACES); + } + + /** + * Tests whether longer namespaces with the same prefix are different. + */ + @ParameterizedTest + @MethodSource("provideArguments") + public void testNamespaceScope(INamespaceAwareElementInitialiser init) { + for (int i = 0; i < nss1.length; i++) { + var newNss = new String[i]; + + for (int j = 0; j < i; j++) { + newNss[j] = nss1[j]; + } + + var objOne = this.initElement(init, newNss); + var objTwo = this.initElement(init, nss1); + + this.testSimilarity(objOne, objTwo, CommonsPackage.Literals.NAMESPACE_AWARE_ELEMENT__NAMESPACES); + } + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testNamespaceNullCheck(INamespaceAwareElementInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, nss1), init, true, + CommonsPackage.Literals.NAMESPACE_AWARE_ELEMENT__NAMESPACES); + } + +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ParametrizableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ParametrizableTest.java new file mode 100644 index 0000000000..5b48773226 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ParametrizableTest.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.parameters.Parameter; +import org.emftext.language.java.parameters.ParametersPackage; +import org.emftext.language.java.parameters.Parametrizable; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesParameters; +import cipm.consistency.initialisers.jamopp.parameters.IParametrizableInitialiser; + +public class ParametrizableTest extends AbstractJaMoPPSimilarityTest implements UsesParameters { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IParametrizableInitialiser.class); + } + + protected Parametrizable initElement(IParametrizableInitialiser init, Parameter[] params) { + Parametrizable result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addParameters(result, params)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testParameters(IParametrizableInitialiser init) { + var objOne = this.initElement(init, new Parameter[] { this.createMinimalOrdParamWithClsTarget("p1", "t1") }); + var objTwo = this.initElement(init, new Parameter[] { this.createMinimalOrdParamWithClsTarget("p2", "t2") }); + + this.testSimilarity(objOne, objTwo, ParametersPackage.Literals.PARAMETRIZABLE__PARAMETERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testParametersSize(IParametrizableInitialiser init) { + var objOne = this.initElement(init, new Parameter[] { this.createMinimalOrdParamWithClsTarget("p1", "t1"), + this.createMinimalOrdParamWithClsTarget("p2", "t2") }); + var objTwo = this.initElement(init, new Parameter[] { this.createMinimalOrdParamWithClsTarget("p1", "t1") }); + + this.testSimilarity(objOne, objTwo, ParametersPackage.Literals.PARAMETRIZABLE__PARAMETERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testParametersNullCheck(IParametrizableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, new Parameter[] { this.createMinimalOrdParamWithClsTarget("p1", "t1") }), init, + true, ParametersPackage.Literals.PARAMETRIZABLE__PARAMETERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/PrimitiveTypeTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/PrimitiveTypeTest.java new file mode 100644 index 0000000000..ca9f172937 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/PrimitiveTypeTest.java @@ -0,0 +1,45 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.PrimitiveType; +import org.emftext.language.java.types.TypesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.types.IPrimitiveTypeInitialiser; + +public class PrimitiveTypeTest extends AbstractJaMoPPSimilarityTest implements UsesConcreteClassifiers { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IPrimitiveTypeInitialiser.class); + } + + protected PrimitiveType initElement(IPrimitiveTypeInitialiser init, Classifier target) { + var res = init.instantiate(); + + Assertions.assertFalse(init.setTarget(res, target)); + return res; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTarget(IPrimitiveTypeInitialiser init) { + var objOne = this.initElement(init, this.createMinimalClass("cls")); + var objTwo = init.instantiate(); + + this.testSimilarity(objOne, objTwo, PrimitiveType.class, TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTargetNullCheck(IPrimitiveTypeInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalClass("cls1")), init, false, + PrimitiveType.class, TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ReferenceTest.java new file mode 100644 index 0000000000..71d234cfb4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/ReferenceTest.java @@ -0,0 +1,76 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.references.Reference; +import org.emftext.language.java.references.ReferencesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesArraySelectors; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesReferences; +import cipm.consistency.initialisers.jamopp.references.IReferenceInitialiser; + +public class ReferenceTest extends AbstractJaMoPPSimilarityTest implements UsesReferences, UsesArraySelectors { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IReferenceInitialiser.class); + } + + protected Reference initElement(IReferenceInitialiser init, Reference next, ArraySelector[] arrSels) { + Reference ref = init.instantiate(); + Assertions.assertTrue(init.initialise(ref)); + Assertions.assertTrue(init.setNext(ref, next)); + Assertions.assertTrue(init.addArraySelectors(ref, arrSels)); + return ref; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testNext(IReferenceInitialiser init) { + var objOne = this.initElement(init, this.createMinimalSR("str1"), null); + var objTwo = this.initElement(init, this.createMinimalSR("str2"), null); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.REFERENCE__NEXT); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testNextNullCheck(IReferenceInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalSR("str1"), null), init, true, + ReferencesPackage.Literals.REFERENCE__NEXT); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArraySelector(IReferenceInitialiser init) { + var objOne = this.initElement(init, null, new ArraySelector[] { this.createMinimalAS(0) }); + var objTwo = this.initElement(init, null, new ArraySelector[] { this.createMinimalAS(1) }); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.REFERENCE__ARRAY_SELECTORS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testArraySelectorSize(IReferenceInitialiser init) { + var objOne = this.initElement(init, null, + new ArraySelector[] { this.createMinimalAS(0), this.createMinimalAS(1) }); + var objTwo = this.initElement(init, null, new ArraySelector[] { this.createMinimalAS(0) }); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.REFERENCE__ARRAY_SELECTORS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testArraySelectorNullCheck(IReferenceInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, null, new ArraySelector[] { this.createMinimalAS(0) }), + init, true, ReferencesPackage.Literals.REFERENCE__ARRAY_SELECTORS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementContainerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementContainerTest.java new file mode 100644 index 0000000000..a4c08f8c1e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementContainerTest.java @@ -0,0 +1,47 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.statements.Statement; +import org.emftext.language.java.statements.StatementContainer; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.statements.IStatementContainerInitialiser; + +public class StatementContainerTest extends AbstractJaMoPPSimilarityTest implements UsesStatements { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IStatementContainerInitialiser.class); + } + + protected StatementContainer initElement(IStatementContainerInitialiser init, Statement st) { + StatementContainer result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.setStatement(result, st)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testStatement(IStatementContainerInitialiser init) { + var objOne = this.initElement(init, this.createMinimalNullReturn()); + var objTwo = this.initElement(init, this.createMinimalTrivialAssert()); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.STATEMENT_CONTAINER__STATEMENT); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testStatementNullCheck(IStatementContainerInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalNullReturn()), init, true, + StatementsPackage.Literals.STATEMENT_CONTAINER__STATEMENT); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementListContainerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementListContainerTest.java new file mode 100644 index 0000000000..413bd7719a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StatementListContainerTest.java @@ -0,0 +1,71 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.statements.Statement; +import org.emftext.language.java.statements.StatementListContainer; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.statements.IStatementListContainerInitialiser; + +/** + * {@link StatementListContainer} has no attributes itself. + * + * @author Alp Torac Genc + */ +public class StatementListContainerTest extends AbstractJaMoPPSimilarityTest implements UsesStatements { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IStatementListContainerInitialiser.class); + } + + protected StatementListContainer initElement(IStatementListContainerInitialiser init, Statement[] sts) { + + StatementListContainer result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertEquals(init.canContainStatements(result), init.addStatements(result, sts)); + + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testStatements(IStatementListContainerInitialiser init) { + var objOne = this.initElement(init, new Statement[] { this.createMinimalNullReturn() }); + var objTwo = this.initElement(init, new Statement[] { this.createMinimalTrivialAssert() }); + + this.testSimilarity(objOne, objTwo, + this.getExpectedSimilarityResult(StatementsPackage.Literals.BLOCK__STATEMENTS).booleanValue() + || (!init.canContainStatements(objOne) && !init.canContainStatements(objTwo))); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testStatementsSize(IStatementListContainerInitialiser init) { + var objOne = this.initElement(init, + new Statement[] { this.createMinimalTrivialAssert(), this.createMinimalNullReturn() }); + var objTwo = this.initElement(init, new Statement[] { this.createMinimalTrivialAssert() }); + + this.testSimilarity(objOne, objTwo, + this.getExpectedSimilarityResult(StatementsPackage.Literals.BLOCK__STATEMENTS).booleanValue() + || (!init.canContainStatements(objOne) && !init.canContainStatements(objTwo))); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testStatementsNullCheck(IStatementListContainerInitialiser init) { + var objOne = this.initElement(init, new Statement[] { this.createMinimalNullReturn() }); + + this.testSimilarityNullCheck(objOne, init, true, + this.getExpectedSimilarityResult(StatementsPackage.Literals.BLOCK__STATEMENTS).booleanValue() + || (!init.canContainStatements(objOne))); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StaticImportTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StaticImportTest.java new file mode 100644 index 0000000000..80022646a2 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/StaticImportTest.java @@ -0,0 +1,45 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.imports.ImportsPackage; +import org.emftext.language.java.imports.StaticImport; +import org.emftext.language.java.modifiers.Static; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesImports; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModifiers; +import cipm.consistency.initialisers.jamopp.imports.IStaticImportInitialiser; + +public class StaticImportTest extends AbstractJaMoPPSimilarityTest implements UsesImports, UsesModifiers { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IStaticImportInitialiser.class); + } + + protected StaticImport initElement(IStaticImportInitialiser init, Static st) { + StaticImport result = init.instantiate(); + Assertions.assertTrue(init.setStatic(result, st)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testStatic(IStaticImportInitialiser init) { + var objOne = this.initElement(init, this.createStatic()); + var objTwo = this.initElement(init, null); + + this.testSimilarity(objOne, objTwo, ImportsPackage.Literals.STATIC_IMPORT__STATIC); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testStaticNullCheck(IStaticImportInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createStatic()), init, false, + ImportsPackage.Literals.STATIC_IMPORT__STATIC); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeArgumentableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeArgumentableTest.java new file mode 100644 index 0000000000..81534d07a4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeArgumentableTest.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.generics.GenericsPackage; +import org.emftext.language.java.generics.TypeArgument; +import org.emftext.language.java.generics.TypeArgumentable; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeArguments; +import cipm.consistency.initialisers.jamopp.generics.ITypeArgumentableInitialiser; + +public class TypeArgumentableTest extends AbstractJaMoPPSimilarityTest implements UsesTypeArguments { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(ITypeArgumentableInitialiser.class); + } + + protected TypeArgumentable initElement(ITypeArgumentableInitialiser init, TypeArgument[] typeArgs) { + TypeArgumentable result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addTypeArguments(result, typeArgs)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeArgument(ITypeArgumentableInitialiser init) { + var objOne = this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1") }); + var objTwo = this.initElement(init, new TypeArgument[] { this.createMinimalSuperTAWithCls("cls2") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.TYPE_ARGUMENTABLE__TYPE_ARGUMENTS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeArgumentSize(ITypeArgumentableInitialiser init) { + var objOne = this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1"), + this.createMinimalSuperTAWithCls("cls2") }); + var objTwo = this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.TYPE_ARGUMENTABLE__TYPE_ARGUMENTS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeArgumentNullCheck(ITypeArgumentableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, new TypeArgument[] { this.createMinimalExtendsTAWithCls("cls1") }), init, true, + GenericsPackage.Literals.TYPE_ARGUMENTABLE__TYPE_ARGUMENTS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeParametrizableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeParametrizableTest.java new file mode 100644 index 0000000000..f9ce191efe --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeParametrizableTest.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.generics.GenericsPackage; +import org.emftext.language.java.generics.TypeParameter; +import org.emftext.language.java.generics.TypeParametrizable; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeParameters; +import cipm.consistency.initialisers.jamopp.generics.ITypeParametrizableInitialiser; + +public class TypeParametrizableTest extends AbstractJaMoPPSimilarityTest implements UsesTypeParameters { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(ITypeParametrizableInitialiser.class); + } + + protected TypeParametrizable initElement(ITypeParametrizableInitialiser init, TypeParameter[] tParams) { + TypeParametrizable result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addTypeParameters(result, tParams)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeParameters(ITypeParametrizableInitialiser init) { + var objOne = this.initElement(init, new TypeParameter[] { this.createMinimalTypeParamWithClsRef("cls1") }); + var objTwo = this.initElement(init, new TypeParameter[] { this.createMinimalTypeParamWithClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.TYPE_PARAMETRIZABLE__TYPE_PARAMETERS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeParametersSize(ITypeParametrizableInitialiser init) { + var objOne = this.initElement(init, new TypeParameter[] { this.createMinimalTypeParamWithClsRef("cls1"), + this.createMinimalTypeParamWithClsRef("cls2") }); + var objTwo = this.initElement(init, new TypeParameter[] { this.createMinimalTypeParamWithClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.TYPE_PARAMETRIZABLE__TYPE_PARAMETERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeParametersNullCheck(ITypeParametrizableInitialiser init) { + this.testSimilarityNullCheck( + this.initElement(init, new TypeParameter[] { this.createMinimalTypeParamWithClsRef("cls1") }), init, + true, GenericsPackage.Literals.TYPE_PARAMETRIZABLE__TYPE_PARAMETERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeReferenceTest.java new file mode 100644 index 0000000000..67dec062a7 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypeReferenceTest.java @@ -0,0 +1,39 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.types.ITypeReferenceInitialiser; + +public class TypeReferenceTest extends AbstractJaMoPPSimilarityTest implements UsesConcreteClassifiers { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(ITypeReferenceInitialiser.class); + } + + protected TypeReference initElement(ITypeReferenceInitialiser init, Classifier target) { + var res = init.instantiate(); + + Assertions.assertEquals(init.canSetTargetTo(res, target), init.setTarget(res, target)); + return res; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTargetNullCheck(ITypeReferenceInitialiser init) { + var objOne = this.initElement(init, this.createMinimalClass("cls")); + var objTwo = init.instantiate(); + + // No expected result, because TypeReference does not have the "target" + // attribute, yet some of its implementors do. + Assertions.assertDoesNotThrow(() -> this.isSimilar(objOne, objTwo)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementExtensionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementExtensionTest.java new file mode 100644 index 0000000000..2cf6e2c85f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementExtensionTest.java @@ -0,0 +1,57 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.types.TypeReference; +import org.emftext.language.java.types.TypedElementExtension; +import org.emftext.language.java.types.TypesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.types.ITypedElementExtensionInitialiser; + +public class TypedElementExtensionTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(ITypedElementExtensionInitialiser.class); + } + + protected TypedElementExtension initElement(ITypedElementExtensionInitialiser init, TypeReference[] actualTargets) { + TypedElementExtension result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.addActualTargets(result, actualTargets)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testActualTarget(ITypedElementExtensionInitialiser init) { + var objOne = this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls1") }); + var objTwo = this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, TypesPackage.Literals.TYPED_ELEMENT_EXTENSION__ACTUAL_TARGETS); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testActualTargets(ITypedElementExtensionInitialiser init) { + var objOne = this.initElement(init, + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }); + var objTwo = this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, TypesPackage.Literals.TYPED_ELEMENT_EXTENSION__ACTUAL_TARGETS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testActualTargetNullCheck(ITypedElementExtensionInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, new TypeReference[] { this.createMinimalClsRef("cls1") }), + init, true, TypesPackage.Literals.TYPED_ELEMENT_EXTENSION__ACTUAL_TARGETS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementTest.java new file mode 100644 index 0000000000..e0308f3d46 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/TypedElementTest.java @@ -0,0 +1,47 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.types.TypeReference; +import org.emftext.language.java.types.TypedElement; +import org.emftext.language.java.types.TypesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.types.ITypedElementInitialiser; + +public class TypedElementTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(ITypedElementInitialiser.class); + } + + protected TypedElement initElement(ITypedElementInitialiser init, TypeReference tRef) { + TypedElement result = init.instantiate(); + Assertions.assertTrue(init.initialise(result)); + Assertions.assertTrue(init.setTypeReference(result, tRef)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeReference(ITypedElementInitialiser init) { + var objOne = this.initElement(init, this.createMinimalClsRef("cls1")); + var objTwo = this.initElement(init, this.createMinimalClsRef("cls2")); + + this.testSimilarity(objOne, objTwo, TypesPackage.Literals.TYPED_ELEMENT__TYPE_REFERENCE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @ParameterizedTest + @MethodSource("provideArguments") + public void testTypeReferenceNullCheck(ITypedElementInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createMinimalClsRef("cls1")), init, true, + TypesPackage.Literals.TYPED_ELEMENT__TYPE_REFERENCE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/UnaryModificationExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/UnaryModificationExpressionTest.java new file mode 100644 index 0000000000..3be70dbd0b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/UnaryModificationExpressionTest.java @@ -0,0 +1,61 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; + +import java.util.stream.Stream; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.UnaryModificationExpression; +import org.emftext.language.java.expressions.UnaryModificationExpressionChild; +import org.emftext.language.java.operators.UnaryModificationOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.IUnaryModificationExpressionInitialiser; + +public class UnaryModificationExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + + private static Stream provideArguments() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IUnaryModificationExpressionInitialiser.class); + } + + protected UnaryModificationExpression initElement(IUnaryModificationExpressionInitialiser init, + UnaryModificationExpressionChild child, UnaryModificationOperator op) { + UnaryModificationExpression result = init.instantiate(); + Assertions.assertTrue(init.setChild(result, child)); + Assertions.assertTrue(init.setOperator(result, op)); + return result; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testChild(IUnaryModificationExpressionInitialiser init) { + this.testSimilarity(this.initElement(init, this.createDecimalIntegerLiteral(1), null), + this.initElement(init, this.createDecimalIntegerLiteral(2), null), + ExpressionsPackage.Literals.UNARY_MODIFICATION_EXPRESSION__CHILD); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testChildNullCheck(IUnaryModificationExpressionInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, this.createDecimalIntegerLiteral(1), null), init, false, + ExpressionsPackage.Literals.UNARY_MODIFICATION_EXPRESSION__CHILD); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testOperator(IUnaryModificationExpressionInitialiser init) { + this.testSimilarity(this.initElement(init, null, this.createPlusPlusOperator()), + this.initElement(init, null, this.createMinusMinusOperator()), + ExpressionsPackage.Literals.UNARY_MODIFICATION_EXPRESSION__OPERATOR); + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testOperatorNullCheck(IUnaryModificationExpressionInitialiser init) { + this.testSimilarityNullCheck(this.initElement(init, null, this.createPlusPlusOperator()), init, false, + ExpressionsPackage.Literals.UNARY_MODIFICATION_EXPRESSION__OPERATOR); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/package-info.java new file mode 100644 index 0000000000..2b80519070 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/interfacetests/package-info.java @@ -0,0 +1,34 @@ +/** + * Contains unit tests for {@link EObject} types, which are extended by other + * EObject types within the {@link Commentable} type hierarchy. In the said + * tests, {@link EObject} instances are constructed programmatically and are + * checked for similarity.
+ *
+ * Since such types within the {@link Commentable} type hierarchy can have + * multiple sub-types, all tests should be parameterised over initialisers. + * Those initialisers may have to be adapted, if there are sub-types, which + * require additional setup steps to be "valid". Parameterising such tests help + * spare test code, as sub-types all need their mutual attributes to be tested. + *
+ *
+ * The tests within this package are meant to be minimal and only to test + * similarity checking with respect to individual attributes of {@link EObject} + * instances, in an isolated fashion. This means, each test performs similarity + * checking on 2 {@link EObject} instances, whose attributes are equal except + * for one of them. This way, one can pinpoint basic similarity checking errors + * regarding certain attributes of certain {@link EObject} implementors.
+ *
+ * It is highly recommended to make the construction of the "main" + * {@link EObject} instances as obvious and visible as possible, as their + * construction can get complicated and not knowing all the construction steps + * can lead to tests not fulfilling their goal. Furthermore, it is also + * important to adapt the initialisers, rather than using instanceof/if-blocks + * to define type-specific behaviour. Should certain sub-types diverge from + * their super type so much that they are incompatible with parameterised tests, + * it is suggested to instead define special unit tests for the said + * sub-types.
+ *
+ * See {@link cipm.consistency.fitests.similarity.jamopp.unittests} to find out + * more about what test methods do. + */ +package cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests; \ No newline at end of file From 27a2536fa1580d5846b448c775537df4588e5b5b Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:53:29 +0100 Subject: [PATCH 80/87] Add tests for JaMoPP-related similarity checking These tests isolate certain aspects of JaMoPP objects, such as certain attributes they have, and verify that similarity checker correctly assesses their similarity. Some tests are disabled till null pointer exceptions are fixed. NewConstructorCallTest is adapted till null pointer exceptions are fixed. --- .../impltests/AdditiveExpressionTest.java | 69 ++++++++++++ .../impltests/AndExpressionTest.java | 41 +++++++ .../AnnotationAttributeSettingTest.java | 57 ++++++++++ .../impltests/AnnotationInstanceTest.java | 57 ++++++++++ .../AnnotationParameterListTest.java | 46 ++++++++ .../impltests/ArrayInitializerTest.java | 44 ++++++++ .../ArrayInstantiationBySizeTest.java | 44 ++++++++ .../impltests/ArraySelectorTest.java | 34 ++++++ .../unittests/impltests/AssertTest.java | 35 ++++++ .../impltests/AssignmentExpressionTest.java | 64 +++++++++++ .../impltests/BinaryIntegerLiteralTest.java | 32 ++++++ .../impltests/BinaryLongLiteralTest.java | 32 ++++++ .../impltests/BooleanLiteralTest.java | 30 ++++++ .../impltests/CastExpressionTest.java | 65 ++++++++++++ .../unittests/impltests/CatchBlockTest.java | 34 ++++++ .../impltests/CatchParameterTest.java | 43 ++++++++ .../impltests/CharacterLiteralTest.java | 32 ++++++ .../jamopp/unittests/impltests/ClassTest.java | 49 +++++++++ .../impltests/ClassifierReferenceTest.java | 35 ++++++ .../impltests/CompilationUnitTest.java | 46 ++++++++ .../unittests/impltests/ConditionTest.java | 34 ++++++ .../ConditionalAndExpressionTest.java | 45 ++++++++ .../impltests/ConditionalExpressionTest.java | 82 ++++++++++++++ .../ConditionalOrExpressionTest.java | 45 ++++++++ .../impltests/DecimalDoubleLiteralTest.java | 30 ++++++ .../impltests/DecimalFloatLiteralTest.java | 30 ++++++ .../impltests/DecimalIntegerLiteralTest.java | 32 ++++++ .../impltests/DecimalLongLiteralTest.java | 32 ++++++ .../unittests/impltests/EnumConstantTest.java | 34 ++++++ .../unittests/impltests/EnumerationTest.java | 43 ++++++++ .../impltests/EqualityExpressionTest.java | 69 ++++++++++++ .../impltests/ExclusiveOrExpressionTest.java | 44 ++++++++ .../ExplicitConstructorCallTest.java | 34 ++++++ .../impltests/ExpressionListTest.java | 42 ++++++++ .../impltests/ExpressionStatementTest.java | 35 ++++++ .../impltests/ExtendsTypeArgumentTest.java | 35 ++++++ .../jamopp/unittests/impltests/FieldTest.java | 43 ++++++++ .../unittests/impltests/ForEachLoopTest.java | 51 +++++++++ .../unittests/impltests/ForLoopTest.java | 59 +++++++++++ .../impltests/HexDoubleLiteralTest.java | 30 ++++++ .../impltests/HexFloatLiteralTest.java | 30 ++++++ .../impltests/HexIntegerLiteralTest.java | 32 ++++++ .../impltests/HexLongLiteralTest.java | 32 ++++++ .../impltests/InclusiveOrExpressionTest.java | 44 ++++++++ .../impltests/InferableTypeTest.java | 35 ++++++ .../impltests/InstanceOfExpressionTest.java | 34 ++++++ .../impltests/InterfaceMethodTest.java | 38 +++++++ .../unittests/impltests/InterfaceTest.java | 67 ++++++++++++ .../impltests/LambdaExpressionTest.java | 51 +++++++++ .../impltests/LocalVariableStatementTest.java | 35 ++++++ .../impltests/LocalVariableTest.java | 48 +++++++++ .../impltests/ModuleReferenceTest.java | 34 ++++++ .../unittests/impltests/ModuleTest.java | 100 ++++++++++++++++++ .../MultiplicativeExpressionTest.java | 72 +++++++++++++ .../NamespaceClassifierReferenceTest.java | 66 ++++++++++++ .../impltests/NestedExpressionTest.java | 34 ++++++ .../impltests/NewConstructorCallTest.java | 43 ++++++++ .../impltests/NormalSwitchCaseTest.java | 43 ++++++++ .../impltests/NormalSwitchRuleTest.java | 43 ++++++++ .../impltests/OctalIntegerLiteralTest.java | 32 ++++++ .../impltests/OctalLongLiteralTest.java | 32 ++++++ .../unittests/impltests/PackageTest.java | 62 +++++++++++ ...maryExpressionReferenceExpressionTest.java | 50 +++++++++ .../impltests/PrimitiveTypeReferenceTest.java | 36 +++++++ .../ProvidesModuleDirectiveTest.java | 44 ++++++++ .../impltests/ReceiverParameterTest.java | 52 +++++++++ .../impltests/RelationExpressionTest.java | 70 ++++++++++++ .../RequiresModuleDirectiveTest.java | 54 ++++++++++ .../unittests/impltests/ReturnTest.java | 34 ++++++ .../impltests/SelfReferenceTest.java | 34 ++++++ .../impltests/ShiftExpressionTest.java | 67 ++++++++++++ .../SingleAnnotationParameterTest.java | 35 ++++++ .../impltests/StaticMemberImportTest.java | 45 ++++++++ .../impltests/StringReferenceTest.java | 32 ++++++ .../impltests/SuperTypeArgumentTest.java | 34 ++++++ .../unittests/impltests/SwitchTest.java | 58 ++++++++++ .../impltests/SynchronizedBlockTest.java | 35 ++++++ .../impltests/TextBlockReferenceTest.java | 32 ++++++ .../jamopp/unittests/impltests/ThrowTest.java | 34 ++++++ .../unittests/impltests/TryBlockTest.java | 87 +++++++++++++++ .../impltests/TypeParameterTest.java | 47 ++++++++ .../impltests/UnaryExpressionTest.java | 57 ++++++++++ .../impltests/YieldStatementTest.java | 34 ++++++ .../unittests/impltests/package-info.java | 22 ++++ 84 files changed, 3738 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AdditiveExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AndExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationAttributeSettingTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationInstanceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationParameterListTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInitializerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInstantiationBySizeTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArraySelectorTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssertTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssignmentExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryIntegerLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryLongLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BooleanLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CastExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchBlockTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchParameterTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CharacterLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassifierReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CompilationUnitTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalAndExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalOrExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalDoubleLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalFloatLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalIntegerLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalLongLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumConstantTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumerationTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EqualityExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExclusiveOrExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExplicitConstructorCallTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionListTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionStatementTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExtendsTypeArgumentTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/FieldTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForEachLoopTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForLoopTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexDoubleLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexFloatLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexIntegerLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexLongLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InclusiveOrExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InferableTypeTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InstanceOfExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceMethodTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LambdaExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableStatementTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/MultiplicativeExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NamespaceClassifierReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NestedExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NewConstructorCallTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchCaseTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchRuleTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalIntegerLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalLongLiteralTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PackageTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimaryExpressionReferenceExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimitiveTypeReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ProvidesModuleDirectiveTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReceiverParameterTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RelationExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RequiresModuleDirectiveTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReturnTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SelfReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ShiftExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SingleAnnotationParameterTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StaticMemberImportTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StringReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SuperTypeArgumentTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SwitchTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SynchronizedBlockTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TextBlockReferenceTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ThrowTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TryBlockTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TypeParameterTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/UnaryExpressionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/YieldStatementTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AdditiveExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AdditiveExpressionTest.java new file mode 100644 index 0000000000..8bb79fafa9 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AdditiveExpressionTest.java @@ -0,0 +1,69 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.AdditiveExpression; +import org.emftext.language.java.expressions.AdditiveExpressionChild; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.operators.AdditiveOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.AdditiveExpressionInitialiser; + +public class AdditiveExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected AdditiveExpression initElement(AdditiveExpressionChild[] children, AdditiveOperator[] ops) { + var aeInit = new AdditiveExpressionInitialiser(); + var ae = aeInit.instantiate(); + Assertions.assertTrue(aeInit.addChildren(ae, children)); + Assertions.assertTrue(aeInit.addAdditiveOperators(ae, ops)); + return ae; + } + + @Test + public void testChild() { + this.testSimilarity( + this.initElement(new AdditiveExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + this.initElement(new AdditiveExpressionChild[] { this.createDecimalIntegerLiteral(2) }, null), + ExpressionsPackage.Literals.ADDITIVE_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new AdditiveExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }, null), + this.initElement(new AdditiveExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + ExpressionsPackage.Literals.ADDITIVE_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new AdditiveExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + new AdditiveExpressionInitialiser(), false, ExpressionsPackage.Literals.ADDITIVE_EXPRESSION__CHILDREN); + } + + @Test + public void testAdditiveOperator() { + this.testSimilarity(this.initElement(null, new AdditiveOperator[] { this.createAdditionOperator() }), + this.initElement(null, new AdditiveOperator[] { this.createSubtractionOperator() }), + ExpressionsPackage.Literals.ADDITIVE_EXPRESSION__ADDITIVE_OPERATORS); + } + + @Test + public void testAdditiveOperatorSize() { + this.testSimilarity( + this.initElement(null, + new AdditiveOperator[] { this.createAdditionOperator(), this.createSubtractionOperator() }), + this.initElement(null, new AdditiveOperator[] { this.createAdditionOperator() }), + ExpressionsPackage.Literals.ADDITIVE_EXPRESSION__ADDITIVE_OPERATORS); + } + + @Test + public void testAdditiveOperatorNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, new AdditiveOperator[] { this.createAdditionOperator() }), + new AdditiveExpressionInitialiser(), false, + ExpressionsPackage.Literals.ADDITIVE_EXPRESSION__ADDITIVE_OPERATORS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AndExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AndExpressionTest.java new file mode 100644 index 0000000000..ab90efaff3 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AndExpressionTest.java @@ -0,0 +1,41 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.AndExpression; +import org.emftext.language.java.expressions.AndExpressionChild; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.AndExpressionInitialiser; + +public class AndExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected AndExpression initElement(AndExpressionChild[] children) { + var aeInit = new AndExpressionInitialiser(); + var ae = aeInit.instantiate(); + Assertions.assertTrue(aeInit.addChildren(ae, children)); + return ae; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(new AndExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + this.initElement(new AndExpressionChild[] { this.createDecimalIntegerLiteral(2) }), + ExpressionsPackage.Literals.AND_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity(this.initElement( + new AndExpressionChild[] { this.createDecimalIntegerLiteral(1), this.createDecimalIntegerLiteral(2) }), + this.initElement(new AndExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + ExpressionsPackage.Literals.AND_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(new AndExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + new AndExpressionInitialiser(), false, ExpressionsPackage.Literals.AND_EXPRESSION__CHILDREN); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationAttributeSettingTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationAttributeSettingTest.java new file mode 100644 index 0000000000..be86e6c95a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationAttributeSettingTest.java @@ -0,0 +1,57 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.annotations.AnnotationAttributeSetting; +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.annotations.AnnotationsPackage; +import org.emftext.language.java.members.InterfaceMethod; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationValues; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesMethods; +import cipm.consistency.initialisers.jamopp.annotations.AnnotationAttributeSettingInitialiser; + +public class AnnotationAttributeSettingTest extends AbstractJaMoPPSimilarityTest implements UsesMethods, UsesAnnotationValues { + protected AnnotationAttributeSetting initElement(InterfaceMethod attr, AnnotationValue val) { + var initialiser = new AnnotationAttributeSettingInitialiser(); + AnnotationAttributeSetting result = initialiser.instantiate(); + Assertions.assertTrue(initialiser.setAttribute(result, attr)); + Assertions.assertTrue(initialiser.setValue(result, val)); + + return result; + } + + @Test + public void testAttribute() { + var objOne = this.initElement(this.createMinimalInterfaceMethodWithNullReturn("im1Name"), null); + var objTwo = this.initElement(this.createMinimalInterfaceMethodWithNullReturn("im2Name"), null); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTATION_ATTRIBUTE_SETTING__ATTRIBUTE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testAttributeNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalInterfaceMethodWithNullReturn("im1Name"), null), + new AnnotationAttributeSettingInitialiser(), false, + AnnotationsPackage.Literals.ANNOTATION_ATTRIBUTE_SETTING__ATTRIBUTE); + } + + @Test + public void testValue() { + var objOne = this.initElement(null, this.createNullLiteral()); + var objTwo = this.initElement(null, this.createMinimalSR("val")); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTATION_ATTRIBUTE_SETTING__VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createNullLiteral()), + new AnnotationAttributeSettingInitialiser(), false, + AnnotationsPackage.Literals.ANNOTATION_ATTRIBUTE_SETTING__VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationInstanceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationInstanceTest.java new file mode 100644 index 0000000000..1a56c4e71a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationInstanceTest.java @@ -0,0 +1,57 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.annotations.AnnotationInstance; +import org.emftext.language.java.annotations.AnnotationParameter; +import org.emftext.language.java.annotations.AnnotationsPackage; +import org.emftext.language.java.classifiers.Classifier; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationParameters; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.annotations.AnnotationInstanceInitialiser; + +public class AnnotationInstanceTest extends AbstractJaMoPPSimilarityTest + implements UsesConcreteClassifiers, UsesAnnotationParameters { + + protected AnnotationInstance initElement(Classifier annotation, AnnotationParameter annoParam) { + var initialiser = new AnnotationInstanceInitialiser(); + AnnotationInstance ai = initialiser.instantiate(); + Assertions.assertTrue(initialiser.setAnnotation(ai, annotation)); + Assertions.assertTrue(initialiser.setParameter(ai, annoParam)); + return ai; + } + + @Test + public void testAnnotation() { + var objOne = this.initElement(this.createMinimalClass("cls1"), null); + var objTwo = this.initElement(this.createMinimalClass("cls2"), null); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTATION_INSTANCE__ANNOTATION); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testAnnotationNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalClass("cls1"), null), + new AnnotationInstanceInitialiser(), false, + AnnotationsPackage.Literals.ANNOTATION_INSTANCE__ANNOTATION); + } + + @Test + public void testParameter() { + var objOne = this.initElement(null, this.createSingleNullAnnoParam()); + var objTwo = this.initElement(null, this.createSingleStrAnnoParam("val")); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTATION_INSTANCE__PARAMETER); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testParameterNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createSingleNullAnnoParam()), + new AnnotationInstanceInitialiser(), false, AnnotationsPackage.Literals.ANNOTATION_INSTANCE__PARAMETER); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationParameterListTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationParameterListTest.java new file mode 100644 index 0000000000..acc71ebe39 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AnnotationParameterListTest.java @@ -0,0 +1,46 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.annotations.AnnotationAttributeSetting; +import org.emftext.language.java.annotations.AnnotationParameterList; +import org.emftext.language.java.annotations.AnnotationsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationAttributeSettings; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationParameters; +import cipm.consistency.initialisers.jamopp.annotations.AnnotationParameterListInitialiser; + +public class AnnotationParameterListTest extends AbstractJaMoPPSimilarityTest + implements UsesAnnotationParameters, UsesAnnotationAttributeSettings { + protected AnnotationParameterList initElement(AnnotationAttributeSetting[] annoAttrSettingsArr) { + var aplInit = new AnnotationParameterListInitialiser(); + var apl = aplInit.instantiate(); + Assertions.assertTrue(aplInit.addSettings(apl, annoAttrSettingsArr)); + return apl; + } + + @Test + public void testSetting() { + var objOne = this.initElement(new AnnotationAttributeSetting[] { this.createEmptyAAS() }); + var objTwo = this.initElement(new AnnotationAttributeSetting[] { this.createNullAAS() }); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTATION_PARAMETER_LIST__SETTINGS); + } + + @Test + public void testSettingSize() { + var objOne = this + .initElement(new AnnotationAttributeSetting[] { this.createEmptyAAS(), this.createNullAAS() }); + var objTwo = this.initElement(new AnnotationAttributeSetting[] { this.createEmptyAAS() }); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.ANNOTATION_PARAMETER_LIST__SETTINGS); + } + + @Test + public void testSettingNullCheck() { + this.testSimilarityNullCheck(this.initElement(new AnnotationAttributeSetting[] { this.createEmptyAAS() }), + new AnnotationParameterListInitialiser(), false, + AnnotationsPackage.Literals.ANNOTATION_PARAMETER_LIST__SETTINGS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInitializerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInitializerTest.java new file mode 100644 index 0000000000..06df7b9e96 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInitializerTest.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.arrays.ArrayInitializationValue; +import org.emftext.language.java.arrays.ArraysPackage; +import org.emftext.language.java.arrays.ArrayInitializer; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.arrays.ArrayInitializerInitialiser; + +public class ArrayInitializerTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ArrayInitializer initElement(ArrayInitializationValue[] initVals) { + var aiInit = new ArrayInitializerInitialiser(); + var ai = aiInit.instantiate(); + Assertions.assertTrue(aiInit.addInitialValues(ai, initVals)); + return ai; + } + + @Test + public void testInitialValues() { + var objOne = this.initElement(new ArrayInitializationValue[] { this.createDecimalIntegerLiteral(1) }); + var objTwo = this.initElement(new ArrayInitializationValue[] { this.createDecimalIntegerLiteral(2) }); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_INITIALIZER__INITIAL_VALUES); + } + + @Test + public void testInitialValuesSize() { + var objOne = this.initElement(new ArrayInitializationValue[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }); + var objTwo = this.initElement(new ArrayInitializationValue[] { this.createDecimalIntegerLiteral(1) }); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_INITIALIZER__INITIAL_VALUES); + } + + @Test + public void testInitialValuesNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new ArrayInitializationValue[] { this.createDecimalIntegerLiteral(1) }), + new ArrayInitializerInitialiser(), false, ArraysPackage.Literals.ARRAY_INITIALIZER__INITIAL_VALUES); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInstantiationBySizeTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInstantiationBySizeTest.java new file mode 100644 index 0000000000..84eaf8f740 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArrayInstantiationBySizeTest.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.arrays.ArrayInstantiationBySize; +import org.emftext.language.java.arrays.ArraysPackage; +import org.emftext.language.java.expressions.Expression; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.arrays.ArrayInstantiationBySizeInitialiser; + +public class ArrayInstantiationBySizeTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ArrayInstantiationBySize initElement(Expression[] sizes) { + var aibsInit = new ArrayInstantiationBySizeInitialiser(); + var aibs = aibsInit.instantiate(); + Assertions.assertTrue(aibsInit.addSizes(aibs, sizes)); + return aibs; + } + + @Test + public void testSize() { + var objOne = this.initElement(new Expression[] { this.createDecimalIntegerLiteral(1) }); + var objTwo = this.initElement(new Expression[] { this.createDecimalIntegerLiteral(2) }); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_INSTANTIATION_BY_SIZE__SIZES); + } + + @Test + public void testSizeSize() { + var objOne = this.initElement( + new Expression[] { this.createDecimalIntegerLiteral(1), this.createDecimalIntegerLiteral(2) }); + var objTwo = this.initElement(new Expression[] { this.createDecimalIntegerLiteral(1) }); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_INSTANTIATION_BY_SIZE__SIZES); + } + + @Test + public void testSizeNullCheck() { + this.testSimilarityNullCheck(this.initElement(new Expression[] { this.createDecimalIntegerLiteral(1) }), + new ArrayInstantiationBySizeInitialiser(), false, + ArraysPackage.Literals.ARRAY_INSTANTIATION_BY_SIZE__SIZES); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArraySelectorTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArraySelectorTest.java new file mode 100644 index 0000000000..416f85893b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ArraySelectorTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.arrays.ArraysPackage; +import org.emftext.language.java.expressions.Expression; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.arrays.ArraySelectorInitialiser; + +public class ArraySelectorTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ArraySelector initElement(Expression pos) { + var asInit = new ArraySelectorInitialiser(); + var as = asInit.instantiate(); + Assertions.assertTrue(asInit.setPosition(as, pos)); + return as; + } + + @Test + public void testPosition() { + var objOne = this.initElement(this.createDecimalIntegerLiteral(1)); + var objTwo = this.initElement(this.createDecimalIntegerLiteral(2)); + + this.testSimilarity(objOne, objTwo, ArraysPackage.Literals.ARRAY_SELECTOR__POSITION); + } + + @Test + public void testPositionNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1)), + new ArraySelectorInitialiser(), false, ArraysPackage.Literals.ARRAY_SELECTOR__POSITION); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssertTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssertTest.java new file mode 100644 index 0000000000..4f3c999d97 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssertTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Assert; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStringReferences; +import cipm.consistency.initialisers.jamopp.statements.AssertInitialiser; + +public class AssertTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions, UsesStringReferences { + protected Assert initElement(Expression errMsg) { + var asrtInit = new AssertInitialiser(); + var asrt = asrtInit.instantiate(); + Assertions.assertTrue(asrtInit.setErrorMessage(asrt, errMsg)); + return asrt; + } + + @Test + public void testErrorMessage() { + var objOne = this.initElement(this.createMinimalSR("val1")); + var objTwo = this.initElement(this.createMinimalSR("val2")); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.ASSERT__ERROR_MESSAGE); + } + + @Test + public void testErrorMessageNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalSR("val1")), new AssertInitialiser(), false, + StatementsPackage.Literals.ASSERT__ERROR_MESSAGE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssignmentExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssignmentExpressionTest.java new file mode 100644 index 0000000000..9ab7998631 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/AssignmentExpressionTest.java @@ -0,0 +1,64 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.AssignmentExpression; +import org.emftext.language.java.expressions.AssignmentExpressionChild; +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.operators.AssignmentOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.AssignmentExpressionInitialiser; + +public class AssignmentExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected AssignmentExpression initElement(AssignmentOperator op, AssignmentExpressionChild child, Expression val) { + var aeInit = new AssignmentExpressionInitialiser(); + var ae = aeInit.instantiate(); + Assertions.assertTrue(aeInit.setAssignmentOperator(ae, op)); + Assertions.assertTrue(aeInit.setChild(ae, child)); + Assertions.assertTrue(aeInit.setValue(ae, val)); + return ae; + } + + @Test + public void testAssignmentOperator() { + this.testSimilarity(this.initElement(this.createAssignmentOperator(), null, null), + this.initElement(this.createAssignmentOrOperator(), null, null), + ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__ASSIGNMENT_OPERATOR); + } + + @Test + public void testAssignmentOperatorNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createAssignmentOperator(), null, null), + new AssignmentExpressionInitialiser(), false, + ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__ASSIGNMENT_OPERATOR); + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(null, this.createDecimalIntegerLiteral(1), null), + this.initElement(null, this.createDecimalIntegerLiteral(2), null), + ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__CHILD); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createDecimalIntegerLiteral(1), null), + new AssignmentExpressionInitialiser(), false, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__CHILD); + } + + @Test + public void testValue() { + this.testSimilarity(this.initElement(null, null, this.createDecimalIntegerLiteral(1)), + this.initElement(null, null, this.createDecimalIntegerLiteral(2)), + ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VALUE); + } + + @Test + public void testValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, null, this.createDecimalIntegerLiteral(1)), + new AssignmentExpressionInitialiser(), false, ExpressionsPackage.Literals.ASSIGNMENT_EXPRESSION__VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryIntegerLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryIntegerLiteralTest.java new file mode 100644 index 0000000000..c3ff155dcb --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryIntegerLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.BinaryIntegerLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.BinaryIntegerLiteralInitialiser; + +public class BinaryIntegerLiteralTest extends AbstractJaMoPPSimilarityTest { + protected BinaryIntegerLiteral initElement(int val) { + var init = new BinaryIntegerLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setBinaryValue(lit, val)); + return lit; + } + + @Test + public void testBinaryValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.BINARY_INTEGER_LITERAL__BINARY_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testBinaryValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new BinaryIntegerLiteralInitialiser(), false, + LiteralsPackage.Literals.BINARY_INTEGER_LITERAL__BINARY_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryLongLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryLongLiteralTest.java new file mode 100644 index 0000000000..b52c393409 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BinaryLongLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.BinaryLongLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.BinaryLongLiteralInitialiser; + +public class BinaryLongLiteralTest extends AbstractJaMoPPSimilarityTest { + protected BinaryLongLiteral initElement(long val) { + var init = new BinaryLongLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setBinaryValue(lit, val)); + return lit; + } + + @Test + public void testBinaryValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.BINARY_LONG_LITERAL__BINARY_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testBinaryValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new BinaryLongLiteralInitialiser(), false, + LiteralsPackage.Literals.BINARY_LONG_LITERAL__BINARY_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BooleanLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BooleanLiteralTest.java new file mode 100644 index 0000000000..0c2c8dda16 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/BooleanLiteralTest.java @@ -0,0 +1,30 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.BooleanLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.BooleanLiteralInitialiser; + +public class BooleanLiteralTest extends AbstractJaMoPPSimilarityTest { + protected BooleanLiteral initElement(boolean val) { + var init = new BooleanLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setValue(lit, val)); + return lit; + } + + @Test + public void testValue() { + this.testSimilarity(this.initElement(true), this.initElement(false), + LiteralsPackage.Literals.BOOLEAN_LITERAL__VALUE); + } + + @Test + public void testValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(true), new BooleanLiteralInitialiser(), false, + LiteralsPackage.Literals.BOOLEAN_LITERAL__VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CastExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CastExpressionTest.java new file mode 100644 index 0000000000..1364f0c43b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CastExpressionTest.java @@ -0,0 +1,65 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.CastExpression; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.MultiplicativeExpressionChild; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.expressions.CastExpressionInitialiser; + +/** + * + * General child and child are the same. Therefore testChild is left out. + * + * @author Alp Torac Genc + */ +public class CastExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions, UsesTypeReferences { + protected CastExpression initElement(TypeReference[] additionalBoundsArr, MultiplicativeExpressionChild child) { + var ceInit = new CastExpressionInitialiser(); + var ce = ceInit.instantiate(); + Assertions.assertTrue(ceInit.addAdditionalBounds(ce, additionalBoundsArr)); + Assertions.assertTrue(ceInit.setChild(ce, child)); + return ce; + } + + @Test + public void testAdditionalBound() { + this.testSimilarity(this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }, null), + this.initElement(new TypeReference[] { this.createMinimalClsRef("cls2") }, null), + ExpressionsPackage.Literals.CAST_EXPRESSION__ADDITIONAL_BOUNDS); + } + + @Test + public void testAdditionalBoundSize() { + this.testSimilarity( + this.initElement( + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }, + null), + this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }, null), + ExpressionsPackage.Literals.CAST_EXPRESSION__ADDITIONAL_BOUNDS); + } + + @Test + public void testAdditionalBoundNullCheck() { + this.testSimilarityNullCheck(this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }, null), + new CastExpressionInitialiser(), false, ExpressionsPackage.Literals.CAST_EXPRESSION__ADDITIONAL_BOUNDS); + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(null, this.createDecimalIntegerLiteral(1)), + this.initElement(null, this.createDecimalIntegerLiteral(2)), + ExpressionsPackage.Literals.CAST_EXPRESSION__GENERAL_CHILD); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createDecimalIntegerLiteral(1)), + new CastExpressionInitialiser(), false, ExpressionsPackage.Literals.CAST_EXPRESSION__GENERAL_CHILD); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchBlockTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchBlockTest.java new file mode 100644 index 0000000000..735c0d3f7e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchBlockTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.parameters.OrdinaryParameter; +import org.emftext.language.java.statements.CatchBlock; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesParameters; +import cipm.consistency.initialisers.jamopp.statements.CatchBlockInitialiser; + +public class CatchBlockTest extends AbstractJaMoPPSimilarityTest implements UsesParameters { + protected CatchBlock initElement(OrdinaryParameter param) { + var cbInit = new CatchBlockInitialiser(); + var cb = cbInit.instantiate(); + Assertions.assertTrue(cbInit.setParameter(cb, param)); + return cb; + } + + @Test + public void testParameter() { + var objOne = this.initElement(this.createMinimalOrdParamWithClsTarget("param1", "cls1")); + var objTwo = this.initElement(this.createMinimalOrdParamWithClsTarget("param2", "cls2")); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.CATCH_BLOCK__PARAMETER); + } + + @Test + public void testParameterNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalOrdParamWithClsTarget("param1", "cls1")), + new CatchBlockInitialiser(), false, StatementsPackage.Literals.CATCH_BLOCK__PARAMETER); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchParameterTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchParameterTest.java new file mode 100644 index 0000000000..1f8a2fc19b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CatchParameterTest.java @@ -0,0 +1,43 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.parameters.CatchParameter; +import org.emftext.language.java.parameters.ParametersPackage; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.parameters.CatchParameterInitialiser; + +public class CatchParameterTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + protected CatchParameter initElement(TypeReference[] trefs) { + var cpInit = new CatchParameterInitialiser(); + var cp = cpInit.instantiate(); + Assertions.assertTrue(cpInit.addTypeReferences(cp, trefs)); + return cp; + } + + @Test + public void testTypeReference() { + var objOne = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, ParametersPackage.Literals.CATCH_PARAMETER__TYPE_REFERENCES); + } + + @Test + public void testTypeReferenceSize() { + var objOne = this.initElement( + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, ParametersPackage.Literals.CATCH_PARAMETER__TYPE_REFERENCES); + } + + @Test + public void testTypeReferenceNullCheck() { + this.testSimilarityNullCheck(this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }), + new CatchParameterInitialiser(), false, ParametersPackage.Literals.CATCH_PARAMETER__TYPE_REFERENCES); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CharacterLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CharacterLiteralTest.java new file mode 100644 index 0000000000..1f62bce873 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CharacterLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.CharacterLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.CharacterLiteralInitialiser; + +public class CharacterLiteralTest extends AbstractJaMoPPSimilarityTest { + protected CharacterLiteral initElement(String val) { + var init = new CharacterLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setValue(lit, val)); + return lit; + } + + @Test + public void testValue() { + this.testSimilarity(this.initElement("a"), this.initElement("b"), + LiteralsPackage.Literals.CHARACTER_LITERAL__VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testValueNullCheck() { + this.testSimilarityNullCheck(this.initElement("a"), new CharacterLiteralInitialiser(), false, + LiteralsPackage.Literals.CHARACTER_LITERAL__VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassTest.java new file mode 100644 index 0000000000..2f146c20c3 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassTest.java @@ -0,0 +1,49 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.classifiers.ClassInitialiser; + +import org.emftext.language.java.classifiers.Class; +import org.emftext.language.java.classifiers.ClassifiersPackage; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ClassTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + protected Class initElement(TypeReference defExt, TypeReference ext) { + var clsInit = new ClassInitialiser(); + var cls = clsInit.instantiate(); + Assertions.assertTrue(clsInit.setDefaultExtends(cls, defExt)); + Assertions.assertTrue(clsInit.setExtends(cls, ext)); + return cls; + } + + @Test + public void testDefaultExtends() { + var objOne = this.initElement(this.createMinimalClsRef("cls1"), null); + var objTwo = this.initElement(this.createMinimalClsRef("cls2"), null); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.CLASS__DEFAULT_EXTENDS); + } + + @Test + public void testDefaultExtendsNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalClsRef("cls1"), null), new ClassInitialiser(), + false, ClassifiersPackage.Literals.CLASS__DEFAULT_EXTENDS); + } + + @Test + public void testExtends() { + var objOne = this.initElement(null, this.createMinimalClsRef("cls1")); + var objTwo = this.initElement(null, this.createMinimalClsRef("cls2")); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.CLASS__EXTENDS); + } + + @Test + public void testExtendsNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createMinimalClsRef("cls1")), new ClassInitialiser(), + false, ClassifiersPackage.Literals.CLASS__EXTENDS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassifierReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassifierReferenceTest.java new file mode 100644 index 0000000000..e6bfab535e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ClassifierReferenceTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.ClassifierReference; +import org.emftext.language.java.types.TypesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.types.ClassifierReferenceInitialiser; + +public class ClassifierReferenceTest extends AbstractJaMoPPSimilarityTest implements UsesConcreteClassifiers { + protected ClassifierReference initElement(Classifier target) { + var init = new ClassifierReferenceInitialiser(); + var res = init.instantiate(); + + Assertions.assertTrue(init.setTarget(res, target)); + return res; + } + + @Test + public void testTarget() { + var objOne = this.initElement(this.createMinimalClass("cls1")); + var objTwo = this.initElement(this.createMinimalClass("cls2")); + + this.testSimilarity(objOne, objTwo, TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } + + @Test + public void testTargetNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalClass("cls1")), + new ClassifierReferenceInitialiser(), false, TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CompilationUnitTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CompilationUnitTest.java new file mode 100644 index 0000000000..a128f86a59 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/CompilationUnitTest.java @@ -0,0 +1,46 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.emftext.language.java.containers.CompilationUnit; +import org.emftext.language.java.containers.ContainersPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.containers.CompilationUnitInitialiser; + +public class CompilationUnitTest extends AbstractJaMoPPSimilarityTest implements UsesConcreteClassifiers { + protected CompilationUnit initElement(ConcreteClassifier[] classifiers) { + var cuInit = new CompilationUnitInitialiser(); + var cu = cuInit.instantiate(); + Assertions.assertTrue(cuInit.setName(cu, this.getDefaultName())); + Assertions.assertTrue(cuInit.addClassifiers(cu, classifiers)); + return cu; + } + + @Test + public void testClassifier() { + var objOne = this.initElement(new ConcreteClassifier[] { this.createMinimalClass("cls1") }); + var objTwo = this.initElement(new ConcreteClassifier[] { this.createMinimalClass("cls2") }); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.COMPILATION_UNIT__CLASSIFIERS); + } + + @Test + public void testClassifierSize() { + var objOne = this.initElement( + new ConcreteClassifier[] { this.createMinimalClass("cls1"), this.createMinimalClass("cls2") }); + var objTwo = this.initElement(new ConcreteClassifier[] { this.createMinimalClass("cls1") }); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.COMPILATION_UNIT__CLASSIFIERS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testClassifierNullCheck() { + this.testSimilarityNullCheck(this.initElement(new ConcreteClassifier[] { this.createMinimalClass("cls1") }), + new CompilationUnitInitialiser(), false, ContainersPackage.Literals.COMPILATION_UNIT__CLASSIFIERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionTest.java new file mode 100644 index 0000000000..5b7f17b494 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.statements.Condition; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.statements.Statement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.statements.ConditionInitialiser; + +public class ConditionTest extends AbstractJaMoPPSimilarityTest implements UsesStatements { + protected Condition initElement(Statement elseSt) { + var conInit = new ConditionInitialiser(); + var con = conInit.instantiate(); + Assertions.assertTrue(conInit.setElseStatement(con, elseSt)); + return con; + } + + @Test + public void testElseStatement() { + var objOne = this.initElement(this.createMinimalTrivialAssert()); + var objTwo = this.initElement(this.createMinimalNullReturn()); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.CONDITION__ELSE_STATEMENT); + } + + @Test + public void testElseStatementNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalTrivialAssert()), new ConditionInitialiser(), + false, StatementsPackage.Literals.CONDITION__ELSE_STATEMENT); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalAndExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalAndExpressionTest.java new file mode 100644 index 0000000000..9738bbc480 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalAndExpressionTest.java @@ -0,0 +1,45 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ConditionalAndExpression; +import org.emftext.language.java.expressions.ConditionalAndExpressionChild; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.ConditionalAndExpressionInitialiser; + +public class ConditionalAndExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ConditionalAndExpression initElement(ConditionalAndExpressionChild[] children) { + var caeInit = new ConditionalAndExpressionInitialiser(); + var cae = caeInit.instantiate(); + Assertions.assertTrue(caeInit.addChildren(cae, children)); + return cae; + } + + @Test + public void testChild() { + this.testSimilarity( + this.initElement(new ConditionalAndExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + this.initElement(new ConditionalAndExpressionChild[] { this.createDecimalIntegerLiteral(2) }), + ExpressionsPackage.Literals.CONDITIONAL_AND_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new ConditionalAndExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }), + this.initElement(new ConditionalAndExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + ExpressionsPackage.Literals.CONDITIONAL_AND_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new ConditionalAndExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + new ConditionalAndExpressionInitialiser(), false, + ExpressionsPackage.Literals.CONDITIONAL_AND_EXPRESSION__CHILDREN); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalExpressionTest.java new file mode 100644 index 0000000000..fa3b203970 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalExpressionTest.java @@ -0,0 +1,82 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.AssignmentExpressionChild; +import org.emftext.language.java.expressions.ConditionalExpression; +import org.emftext.language.java.expressions.ConditionalExpressionChild; +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.ConditionalExpressionInitialiser; + +public class ConditionalExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ConditionalExpression initElement(ConditionalExpressionChild child, AssignmentExpressionChild exprChild, + Expression exprIf, Expression generalExprElse) { + var ceInit = new ConditionalExpressionInitialiser(); + var ce = ceInit.instantiate(); + Assertions.assertTrue(ceInit.setChild(ce, child)); + Assertions.assertTrue(ceInit.setExpressionChild(ce, exprChild)); + Assertions.assertTrue(ceInit.setExpressionIf(ce, exprIf)); + Assertions.assertTrue(ceInit.setGeneralExpressionElse(ce, generalExprElse)); + return ce; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(this.createDecimalIntegerLiteral(1), null, null, null), + this.initElement(this.createDecimalIntegerLiteral(2), null, null, null), + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__CHILD); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1), null, null, null), + new ConditionalExpressionInitialiser(), false, + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__CHILD); + } + + @Test + public void testExpressionChild() { + this.testSimilarity(this.initElement(null, this.createDecimalIntegerLiteral(1), null, null), + this.initElement(null, this.createDecimalIntegerLiteral(2), null, null), + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__CHILD); + } + + @Test + public void testExpressionChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createDecimalIntegerLiteral(1), null, null), + new ConditionalExpressionInitialiser(), false, + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__CHILD); + } + + @Test + public void testExpressionIf() { + this.testSimilarity(this.initElement(null, null, this.createDecimalIntegerLiteral(1), null), + this.initElement(null, null, this.createDecimalIntegerLiteral(2), null), + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__EXPRESSION_IF); + } + + @Test + public void testExpressionIfNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, null, this.createDecimalIntegerLiteral(1), null), + new ConditionalExpressionInitialiser(), false, + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__EXPRESSION_IF); + } + + @Test + public void testGeneralExpressionElse() { + this.testSimilarity(this.initElement(null, null, null, this.createDecimalIntegerLiteral(1)), + this.initElement(null, null, null, this.createDecimalIntegerLiteral(2)), + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__GENERAL_EXPRESSION_ELSE); + } + + @Test + public void testGeneralExpressionElseNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, null, null, this.createDecimalIntegerLiteral(1)), + new ConditionalExpressionInitialiser(), false, + ExpressionsPackage.Literals.CONDITIONAL_EXPRESSION__GENERAL_EXPRESSION_ELSE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalOrExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalOrExpressionTest.java new file mode 100644 index 0000000000..9380110268 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ConditionalOrExpressionTest.java @@ -0,0 +1,45 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ConditionalOrExpression; +import org.emftext.language.java.expressions.ConditionalOrExpressionChild; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.ConditionalOrExpressionInitialiser; + +public class ConditionalOrExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ConditionalOrExpression initElement(ConditionalOrExpressionChild[] children) { + var coeInit = new ConditionalOrExpressionInitialiser(); + var coe = coeInit.instantiate(); + Assertions.assertTrue(coeInit.addChildren(coe, children)); + return coe; + } + + @Test + public void testChild() { + this.testSimilarity( + this.initElement(new ConditionalOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + this.initElement(new ConditionalOrExpressionChild[] { this.createDecimalIntegerLiteral(2) }), + ExpressionsPackage.Literals.CONDITIONAL_OR_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new ConditionalOrExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }), + this.initElement(new ConditionalOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + ExpressionsPackage.Literals.CONDITIONAL_OR_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new ConditionalOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + new ConditionalOrExpressionInitialiser(), false, + ExpressionsPackage.Literals.CONDITIONAL_OR_EXPRESSION__CHILDREN); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalDoubleLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalDoubleLiteralTest.java new file mode 100644 index 0000000000..7615db97f5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalDoubleLiteralTest.java @@ -0,0 +1,30 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.DecimalDoubleLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.DecimalDoubleLiteralInitialiser; + +public class DecimalDoubleLiteralTest extends AbstractJaMoPPSimilarityTest { + protected DecimalDoubleLiteral initElement(double val) { + var init = new DecimalDoubleLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setDecimalValue(lit, val)); + return lit; + } + + @Test + public void testDecimalValue() { + this.testSimilarity(this.initElement(1.5d), this.initElement(2.5d), + LiteralsPackage.Literals.DECIMAL_DOUBLE_LITERAL__DECIMAL_VALUE); + } + + @Test + public void testDecimalValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1.5d), new DecimalDoubleLiteralInitialiser(), false, + LiteralsPackage.Literals.DECIMAL_DOUBLE_LITERAL__DECIMAL_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalFloatLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalFloatLiteralTest.java new file mode 100644 index 0000000000..54a325706e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalFloatLiteralTest.java @@ -0,0 +1,30 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.DecimalFloatLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.DecimalFloatLiteralInitialiser; + +public class DecimalFloatLiteralTest extends AbstractJaMoPPSimilarityTest { + protected DecimalFloatLiteral initElement(float val) { + var init = new DecimalFloatLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setDecimalValue(lit, val)); + return lit; + } + + @Test + public void testDecimalValue() { + this.testSimilarity(this.initElement(1.5f), this.initElement(2.5f), + LiteralsPackage.Literals.DECIMAL_FLOAT_LITERAL__DECIMAL_VALUE); + } + + @Test + public void testDecimalValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1.5f), new DecimalFloatLiteralInitialiser(), false, + LiteralsPackage.Literals.DECIMAL_FLOAT_LITERAL__DECIMAL_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalIntegerLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalIntegerLiteralTest.java new file mode 100644 index 0000000000..26346982d7 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalIntegerLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.DecimalIntegerLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.DecimalIntegerLiteralInitialiser; + +public class DecimalIntegerLiteralTest extends AbstractJaMoPPSimilarityTest { + protected DecimalIntegerLiteral initElement(int val) { + var init = new DecimalIntegerLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setDecimalValue(lit, val)); + return lit; + } + + @Test + public void testDecimalValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.DECIMAL_INTEGER_LITERAL__DECIMAL_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testDecimalValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new DecimalIntegerLiteralInitialiser(), false, + LiteralsPackage.Literals.DECIMAL_INTEGER_LITERAL__DECIMAL_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalLongLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalLongLiteralTest.java new file mode 100644 index 0000000000..e557d615f4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/DecimalLongLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.DecimalLongLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.DecimalLongLiteralInitialiser; + +public class DecimalLongLiteralTest extends AbstractJaMoPPSimilarityTest { + protected DecimalLongLiteral initElement(long val) { + var init = new DecimalLongLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setDecimalValue(lit, val)); + return lit; + } + + @Test + public void testDecimalValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.DECIMAL_LONG_LITERAL__DECIMAL_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testDecimalValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new DecimalLongLiteralInitialiser(), false, + LiteralsPackage.Literals.DECIMAL_LONG_LITERAL__DECIMAL_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumConstantTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumConstantTest.java new file mode 100644 index 0000000000..cc4ec6487f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumConstantTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.AnonymousClass; +import org.emftext.language.java.members.EnumConstant; +import org.emftext.language.java.members.MembersPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnonymousClasses; +import cipm.consistency.initialisers.jamopp.members.EnumConstantInitialiser; + +public class EnumConstantTest extends AbstractJaMoPPSimilarityTest implements UsesAnonymousClasses { + protected EnumConstant initElement(AnonymousClass anonymousCls) { + var ecInit = new EnumConstantInitialiser(); + var ec = ecInit.instantiate(); + Assertions.assertTrue(ecInit.setAnonymousClass(ec, anonymousCls)); + return ec; + } + + @Test + public void testAnonymousClass() { + var objOne = this.initElement(this.createMinimalAnonymousClassWithMethod("met1")); + var objTwo = this.initElement(this.createMinimalAnonymousClassWithMethod("met2")); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.ENUM_CONSTANT__ANONYMOUS_CLASS); + } + + @Test + public void testAnonymousClassNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalAnonymousClassWithMethod("met1")), + new EnumConstantInitialiser(), false, MembersPackage.Literals.ENUM_CONSTANT__ANONYMOUS_CLASS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumerationTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumerationTest.java new file mode 100644 index 0000000000..62b498b806 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EnumerationTest.java @@ -0,0 +1,43 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.Enumeration; +import org.emftext.language.java.classifiers.ClassifiersPackage; +import org.emftext.language.java.members.EnumConstant; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesEnumConstants; +import cipm.consistency.initialisers.jamopp.classifiers.EnumerationInitialiser; + +public class EnumerationTest extends AbstractJaMoPPSimilarityTest implements UsesEnumConstants { + protected Enumeration initElement(EnumConstant[] consts) { + var enmInit = new EnumerationInitialiser(); + var enm = enmInit.instantiate(); + Assertions.assertTrue(enmInit.addConstants(enm, consts)); + return enm; + } + + @Test + public void testConstant() { + var objOne = this.initElement(new EnumConstant[] { this.createMinimalEnumConstant("cst1") }); + var objTwo = this.initElement(new EnumConstant[] { this.createMinimalEnumConstant("cst2") }); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.ENUMERATION__CONSTANTS); + } + + @Test + public void testConstantSize() { + var objOne = this.initElement( + new EnumConstant[] { this.createMinimalEnumConstant("cst1"), this.createMinimalEnumConstant("cst2") }); + var objTwo = this.initElement(new EnumConstant[] { this.createMinimalEnumConstant("cst1") }); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.ENUMERATION__CONSTANTS); + } + + @Test + public void testConstantNullCheck() { + this.testSimilarityNullCheck(this.initElement(new EnumConstant[] { this.createMinimalEnumConstant("cst1") }), + new EnumerationInitialiser(), false, ClassifiersPackage.Literals.ENUMERATION__CONSTANTS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EqualityExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EqualityExpressionTest.java new file mode 100644 index 0000000000..d3477bd5fc --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/EqualityExpressionTest.java @@ -0,0 +1,69 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.EqualityExpression; +import org.emftext.language.java.expressions.EqualityExpressionChild; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.operators.EqualityOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.EqualityExpressionInitialiser; + +public class EqualityExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected EqualityExpression initElement(EqualityExpressionChild[] children, EqualityOperator[] ops) { + var eeInit = new EqualityExpressionInitialiser(); + var ee = eeInit.instantiate(); + Assertions.assertTrue(eeInit.addChildren(ee, children)); + Assertions.assertTrue(eeInit.addEqualityOperators(ee, ops)); + return ee; + } + + @Test + public void testChild() { + this.testSimilarity( + this.initElement(new EqualityExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + this.initElement(new EqualityExpressionChild[] { this.createDecimalIntegerLiteral(2) }, null), + ExpressionsPackage.Literals.EQUALITY_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new EqualityExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }, null), + this.initElement(new EqualityExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + ExpressionsPackage.Literals.EQUALITY_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new EqualityExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + new EqualityExpressionInitialiser(), false, ExpressionsPackage.Literals.EQUALITY_EXPRESSION__CHILDREN); + } + + @Test + public void testEqualityOperator() { + this.testSimilarity(this.initElement(null, new EqualityOperator[] { this.createEqualityOperator() }), + this.initElement(null, new EqualityOperator[] { this.createNotEqualOperator() }), + ExpressionsPackage.Literals.EQUALITY_EXPRESSION__EQUALITY_OPERATORS); + } + + @Test + public void testEqualityOperatorSize() { + this.testSimilarity( + this.initElement(null, + new EqualityOperator[] { this.createEqualityOperator(), this.createNotEqualOperator() }), + this.initElement(null, new EqualityOperator[] { this.createEqualityOperator() }), + ExpressionsPackage.Literals.EQUALITY_EXPRESSION__EQUALITY_OPERATORS); + } + + @Test + public void testEqualityOperatorNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, new EqualityOperator[] { this.createEqualityOperator() }), + new EqualityExpressionInitialiser(), false, + ExpressionsPackage.Literals.EQUALITY_EXPRESSION__EQUALITY_OPERATORS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExclusiveOrExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExclusiveOrExpressionTest.java new file mode 100644 index 0000000000..b4ed99eb10 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExclusiveOrExpressionTest.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExclusiveOrExpression; +import org.emftext.language.java.expressions.ExclusiveOrExpressionChild; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.ExclusiveOrExpressionInitialiser; + +public class ExclusiveOrExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ExclusiveOrExpression initElement(ExclusiveOrExpressionChild[] children) { + var eoeInit = new ExclusiveOrExpressionInitialiser(); + var eoe = eoeInit.instantiate(); + Assertions.assertTrue(eoeInit.addChildren(eoe, children)); + return eoe; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(new ExclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + this.initElement(new ExclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(2) }), + ExpressionsPackage.Literals.EXCLUSIVE_OR_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new ExclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }), + this.initElement(new ExclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + ExpressionsPackage.Literals.EXCLUSIVE_OR_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new ExclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + new ExclusiveOrExpressionInitialiser(), false, + ExpressionsPackage.Literals.EXCLUSIVE_OR_EXPRESSION__CHILDREN); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExplicitConstructorCallTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExplicitConstructorCallTest.java new file mode 100644 index 0000000000..363323a090 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExplicitConstructorCallTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.instantiations.ExplicitConstructorCall; +import org.emftext.language.java.instantiations.InstantiationsPackage; +import org.emftext.language.java.literals.Self; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.instantiations.ExplicitConstructorCallInitialiser; + +public class ExplicitConstructorCallTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ExplicitConstructorCall initElement(Self callTarget) { + var eccInit = new ExplicitConstructorCallInitialiser(); + var ecc = eccInit.instantiate(); + Assertions.assertTrue(eccInit.setCallTarget(ecc, callTarget)); + return ecc; + } + + @Test + public void testCallTarget() { + var objOne = this.initElement(this.createThis()); + var objTwo = this.initElement(this.createSuper()); + + this.testSimilarity(objOne, objTwo, InstantiationsPackage.Literals.EXPLICIT_CONSTRUCTOR_CALL__CALL_TARGET); + } + + @Test + public void testCallTargetNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createThis()), new ExplicitConstructorCallInitialiser(), + false, InstantiationsPackage.Literals.EXPLICIT_CONSTRUCTOR_CALL__CALL_TARGET); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionListTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionListTest.java new file mode 100644 index 0000000000..dfa641c081 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionListTest.java @@ -0,0 +1,42 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.expressions.ExpressionList; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.ExpressionListInitialiser; + +public class ExpressionListTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ExpressionList initElement(Expression[] exprs) { + var elInit = new ExpressionListInitialiser(); + var el = elInit.instantiate(); + Assertions.assertTrue(elInit.addExpressions(el, exprs)); + return el; + } + + @Test + public void testExpression() { + var objOne = this.initElement(new Expression[] { this.createMinimalFalseEE() }); + var objTwo = this.initElement(new Expression[] { this.createMinimalTrueNEE() }); + + this.testSimilarity(objOne, objTwo, ExpressionsPackage.Literals.EXPRESSION_LIST__EXPRESSIONS); + } + + @Test + public void testExpressionSize() { + var objOne = this.initElement(new Expression[] { this.createMinimalFalseEE(), this.createMinimalTrueNEE() }); + var objTwo = this.initElement(new Expression[] { this.createMinimalFalseEE() }); + + this.testSimilarity(objOne, objTwo, ExpressionsPackage.Literals.EXPRESSION_LIST__EXPRESSIONS); + } + + @Test + public void testExpressionNullCheck() { + this.testSimilarityNullCheck(this.initElement(new Expression[] { this.createMinimalFalseEE() }), + new ExpressionListInitialiser(), false, ExpressionsPackage.Literals.EXPRESSION_LIST__EXPRESSIONS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionStatementTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionStatementTest.java new file mode 100644 index 0000000000..9dd802137c --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExpressionStatementTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.ExpressionStatement; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.ExpressionStatementInitialiser; + +public class ExpressionStatementTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ExpressionStatement initElement(Expression expr) { + var esInit = new ExpressionStatementInitialiser(); + var es = esInit.instantiate(); + Assertions.assertTrue(esInit.setExpression(es, expr)); + return es; + } + + @Test + public void testExpression() { + var objOne = this.initElement(this.createMinimalFalseEE()); + var objTwo = this.initElement(this.createMinimalTrueNEE()); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.EXPRESSION_STATEMENT__EXPRESSION); + } + + @Test + public void testExpressionNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalFalseEE()), + new ExpressionStatementInitialiser(), false, + StatementsPackage.Literals.EXPRESSION_STATEMENT__EXPRESSION); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExtendsTypeArgumentTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExtendsTypeArgumentTest.java new file mode 100644 index 0000000000..c44b19b3ce --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ExtendsTypeArgumentTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.generics.ExtendsTypeArgument; +import org.emftext.language.java.generics.GenericsPackage; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.generics.ExtendsTypeArgumentInitialiser; + +public class ExtendsTypeArgumentTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + protected ExtendsTypeArgument initElement(TypeReference extType) { + var etaInit = new ExtendsTypeArgumentInitialiser(); + var eta = etaInit.instantiate(); + Assertions.assertTrue(etaInit.setExtendType(eta, extType)); + return eta; + } + + @Test + public void testExtendType() { + var objOne = this.initElement(this.createMinimalClsRef("cls1")); + var objTwo = this.initElement(this.createMinimalClsRef("cls2")); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.EXTENDS_TYPE_ARGUMENT__EXTEND_TYPE); + } + + @Test + public void testExtendTypeNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalClsRef("cls1")), + new ExtendsTypeArgumentInitialiser(), false, + GenericsPackage.Literals.EXTENDS_TYPE_ARGUMENT__EXTEND_TYPE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/FieldTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/FieldTest.java new file mode 100644 index 0000000000..76d376c75b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/FieldTest.java @@ -0,0 +1,43 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.members.AdditionalField; +import org.emftext.language.java.members.Field; +import org.emftext.language.java.members.MembersPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAdditionalFields; +import cipm.consistency.initialisers.jamopp.members.FieldInitialiser; + +public class FieldTest extends AbstractJaMoPPSimilarityTest implements UsesAdditionalFields { + protected Field initElement(AdditionalField[] additionalFields) { + var fieldInit = new FieldInitialiser(); + var field = fieldInit.instantiate(); + Assertions.assertTrue(fieldInit.addAdditionalFields(field, additionalFields)); + return field; + } + + @Test + public void testAdditionalField() { + var objOne = this.initElement(new AdditionalField[] { this.createMinimalAF("af1") }); + var objTwo = this.initElement(new AdditionalField[] { this.createMinimalAF("af2") }); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.FIELD__ADDITIONAL_FIELDS); + } + + @Test + public void testAdditionalFieldSize() { + var objOne = this + .initElement(new AdditionalField[] { this.createMinimalAF("af1"), this.createMinimalAF("af2") }); + var objTwo = this.initElement(new AdditionalField[] { this.createMinimalAF("af1") }); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.FIELD__ADDITIONAL_FIELDS); + } + + @Test + public void testAdditionalFieldNullCheck() { + this.testSimilarityNullCheck(this.initElement(new AdditionalField[] { this.createMinimalAF("af1") }), + new FieldInitialiser(), false, MembersPackage.Literals.FIELD__ADDITIONAL_FIELDS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForEachLoopTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForEachLoopTest.java new file mode 100644 index 0000000000..ce50a366e4 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForEachLoopTest.java @@ -0,0 +1,51 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.parameters.OrdinaryParameter; +import org.emftext.language.java.statements.ForEachLoop; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesParameters; +import cipm.consistency.initialisers.jamopp.statements.ForEachLoopInitialiser; + +public class ForEachLoopTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions, UsesParameters { + protected ForEachLoop initElement(Expression col, OrdinaryParameter next) { + var felInit = new ForEachLoopInitialiser(); + var fel = felInit.instantiate(); + Assertions.assertTrue(felInit.setCollection(fel, col)); + Assertions.assertTrue(felInit.setNext(fel, next)); + return fel; + } + + @Test + public void testCollection() { + var objOne = this.initElement(this.createMinimalFalseEE(), null); + var objTwo = this.initElement(this.createMinimalTrueNEE(), null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.FOR_EACH_LOOP__COLLECTION); + } + + @Test + public void testCollectionNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalFalseEE(), null), new ForEachLoopInitialiser(), + false, StatementsPackage.Literals.FOR_EACH_LOOP__COLLECTION); + } + + @Test + public void testNext() { + var objOne = this.initElement(null, this.createMinimalOrdParamWithClsTarget("param1", "cls1")); + var objTwo = this.initElement(null, this.createMinimalOrdParamWithClsTarget("param2", "cls2")); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.FOR_EACH_LOOP__NEXT); + } + + @Test + public void testNextNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createMinimalOrdParamWithClsTarget("param1", "cls1")), + new ForEachLoopInitialiser(), false, StatementsPackage.Literals.FOR_EACH_LOOP__NEXT); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForLoopTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForLoopTest.java new file mode 100644 index 0000000000..4efe176127 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ForLoopTest.java @@ -0,0 +1,59 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.ForLoop; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.statements.ForLoopInitializer; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.ForLoopInitialiser; + +public class ForLoopTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ForLoop initElement(ForLoopInitializer flInit, Expression[] updateExprs) { + var init = new ForLoopInitialiser(); + var fl = init.instantiate(); + Assertions.assertTrue(init.setInit(fl, flInit)); + Assertions.assertTrue(init.addUpdates(fl, updateExprs)); + return fl; + } + + @Test + public void testInit() { + var objOne = this.initElement(this.createExprList(), null); + var objTwo = this.initElement(this.createExprList(this.createMinimalFalseEE()), null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.FOR_LOOP__INIT); + } + + @Test + public void testInitNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createExprList(), null), new ForLoopInitialiser(), false, + StatementsPackage.Literals.FOR_LOOP__INIT); + } + + @Test + public void testUpdate() { + var objOne = this.initElement(null, new Expression[] { this.createMinimalFalseEE() }); + var objTwo = this.initElement(null, new Expression[] { this.createMinimalTrueNEE() }); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.FOR_LOOP__UPDATES); + } + + @Test + public void testUpdateSize() { + var objOne = this.initElement(null, + new Expression[] { this.createMinimalFalseEE(), this.createMinimalTrueNEE() }); + var objTwo = this.initElement(null, new Expression[] { this.createMinimalFalseEE() }); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.FOR_LOOP__UPDATES); + } + + @Test + public void testUpdateNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, new Expression[] { this.createMinimalFalseEE() }), + new ForLoopInitialiser(), false, StatementsPackage.Literals.FOR_LOOP__UPDATES); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexDoubleLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexDoubleLiteralTest.java new file mode 100644 index 0000000000..ba873160ed --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexDoubleLiteralTest.java @@ -0,0 +1,30 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.HexDoubleLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.HexDoubleLiteralInitialiser; + +public class HexDoubleLiteralTest extends AbstractJaMoPPSimilarityTest { + protected HexDoubleLiteral initElement(double val) { + var init = new HexDoubleLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setHexValue(lit, val)); + return lit; + } + + @Test + public void testHexValue() { + this.testSimilarity(this.initElement(1.5d), this.initElement(2.5d), + LiteralsPackage.Literals.HEX_DOUBLE_LITERAL__HEX_VALUE); + } + + @Test + public void testHexValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1.5d), new HexDoubleLiteralInitialiser(), false, + LiteralsPackage.Literals.HEX_DOUBLE_LITERAL__HEX_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexFloatLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexFloatLiteralTest.java new file mode 100644 index 0000000000..8b6c3a13f0 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexFloatLiteralTest.java @@ -0,0 +1,30 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.HexFloatLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.HexFloatLiteralInitialiser; + +public class HexFloatLiteralTest extends AbstractJaMoPPSimilarityTest { + protected HexFloatLiteral initElement(float val) { + var init = new HexFloatLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setHexValue(lit, val)); + return lit; + } + + @Test + public void testHexValue() { + this.testSimilarity(this.initElement(1.5f), this.initElement(2.5f), + LiteralsPackage.Literals.HEX_FLOAT_LITERAL__HEX_VALUE); + } + + @Test + public void testHexValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1.5f), new HexFloatLiteralInitialiser(), false, + LiteralsPackage.Literals.HEX_FLOAT_LITERAL__HEX_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexIntegerLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexIntegerLiteralTest.java new file mode 100644 index 0000000000..66db7bfe4f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexIntegerLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.HexIntegerLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.HexIntegerLiteralInitialiser; + +public class HexIntegerLiteralTest extends AbstractJaMoPPSimilarityTest { + protected HexIntegerLiteral initElement(int val) { + var init = new HexIntegerLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setHexValue(lit, val)); + return lit; + } + + @Test + public void testHexValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.HEX_INTEGER_LITERAL__HEX_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testHexValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new HexIntegerLiteralInitialiser(), false, + LiteralsPackage.Literals.HEX_INTEGER_LITERAL__HEX_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexLongLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexLongLiteralTest.java new file mode 100644 index 0000000000..9223bf9fee --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/HexLongLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.HexLongLiteral; +import org.emftext.language.java.literals.LiteralsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.HexLongLiteralInitialiser; + +public class HexLongLiteralTest extends AbstractJaMoPPSimilarityTest { + protected HexLongLiteral initElement(long val) { + var init = new HexLongLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setHexValue(lit, val)); + return lit; + } + + @Test + public void testHexValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.HEX_LONG_LITERAL__HEX_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testHexValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new HexLongLiteralInitialiser(), false, + LiteralsPackage.Literals.HEX_LONG_LITERAL__HEX_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InclusiveOrExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InclusiveOrExpressionTest.java new file mode 100644 index 0000000000..715c058143 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InclusiveOrExpressionTest.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.InclusiveOrExpression; +import org.emftext.language.java.expressions.InclusiveOrExpressionChild; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.InclusiveOrExpressionInitialiser; + +public class InclusiveOrExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected InclusiveOrExpression initElement(InclusiveOrExpressionChild[] children) { + var ioeInit = new InclusiveOrExpressionInitialiser(); + var ioe = ioeInit.instantiate(); + Assertions.assertTrue(ioeInit.addChildren(ioe, children)); + return ioe; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(new InclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + this.initElement(new InclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(2) }), + ExpressionsPackage.Literals.INCLUSIVE_OR_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new InclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }), + this.initElement(new InclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + ExpressionsPackage.Literals.INCLUSIVE_OR_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new InclusiveOrExpressionChild[] { this.createDecimalIntegerLiteral(1) }), + new InclusiveOrExpressionInitialiser(), false, + ExpressionsPackage.Literals.INCLUSIVE_OR_EXPRESSION__CHILDREN); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InferableTypeTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InferableTypeTest.java new file mode 100644 index 0000000000..e0c50fc548 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InferableTypeTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.InferableType; +import org.emftext.language.java.types.TypesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.types.InferableTypeInitialiser; + +public class InferableTypeTest extends AbstractJaMoPPSimilarityTest implements UsesConcreteClassifiers { + protected InferableType initElement(Classifier target) { + var init = new InferableTypeInitialiser(); + var res = init.instantiate(); + + Assertions.assertTrue(init.setTarget(res, target)); + return res; + } + + @Test + public void testTarget() { + var objOne = this.initElement(this.createMinimalClass("cls1")); + var objTwo = this.initElement(this.createMinimalClass("cls2")); + + this.testSimilarity(objOne, objTwo, InferableType.class, TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } + + @Test + public void testTargetNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalClass("cls1")), new InferableTypeInitialiser(), + false, InferableType.class, TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InstanceOfExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InstanceOfExpressionTest.java new file mode 100644 index 0000000000..c900b36c5f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InstanceOfExpressionTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.InstanceOfExpression; +import org.emftext.language.java.expressions.InstanceOfExpressionChild; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.InstanceOfExpressionInitialiser; + +public class InstanceOfExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected InstanceOfExpression initElement(InstanceOfExpressionChild child) { + var ioeInit = new InstanceOfExpressionInitialiser(); + var ioe = ioeInit.instantiate(); + Assertions.assertTrue(ioeInit.setChild(ioe, child)); + return ioe; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(this.createDecimalIntegerLiteral(1)), + this.initElement(this.createDecimalIntegerLiteral(2)), + ExpressionsPackage.Literals.INSTANCE_OF_EXPRESSION__CHILD); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1)), + new InstanceOfExpressionInitialiser(), false, + ExpressionsPackage.Literals.INSTANCE_OF_EXPRESSION__CHILD); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceMethodTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceMethodTest.java new file mode 100644 index 0000000000..94d7900d69 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceMethodTest.java @@ -0,0 +1,38 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.members.InterfaceMethod; +import org.emftext.language.java.members.MembersPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationValues; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesNames; +import cipm.consistency.initialisers.jamopp.members.InterfaceMethodInitialiser; + +public class InterfaceMethodTest extends AbstractJaMoPPSimilarityTest implements UsesAnnotationValues, UsesNames { + protected InterfaceMethod initElement(AnnotationValue defVal) { + var imInit = new InterfaceMethodInitialiser(); + var im = imInit.instantiate(); + Assertions.assertTrue(imInit.setName(im, this.getDefaultName())); + Assertions.assertTrue(imInit.setDefaultValue(im, defVal)); + return im; + } + + @Test + public void testDefaultValue() { + var objOne = this.initElement(this.createNullLiteral()); + var objTwo = this.initElement(this.createMinimalSR("strval")); + + this.testSimilarity(objOne, objTwo, MembersPackage.Literals.INTERFACE_METHOD__DEFAULT_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testDefaultValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createNullLiteral()), new InterfaceMethodInitialiser(), + false, MembersPackage.Literals.INTERFACE_METHOD__DEFAULT_VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceTest.java new file mode 100644 index 0000000000..b453924f23 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/InterfaceTest.java @@ -0,0 +1,67 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.Interface; +import org.emftext.language.java.classifiers.ClassifiersPackage; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.classifiers.InterfaceInitialiser; + +public class InterfaceTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + protected Interface initElement(TypeReference[] defExts, TypeReference[] exts) { + var intfcInit = new InterfaceInitialiser(); + var intfc = intfcInit.instantiate(); + Assertions.assertTrue(intfcInit.addDefaultExtends(intfc, defExts)); + Assertions.assertTrue(intfcInit.addExtends(intfc, exts)); + return intfc; + } + + @Test + public void testDefaultExtends() { + var objOne = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }, null); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls2") }, null); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.INTERFACE__DEFAULT_EXTENDS); + } + + @Test + public void testDefaultExtendsSize() { + var objOne = this.initElement( + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }, null); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }, null); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.INTERFACE__DEFAULT_EXTENDS); + } + + @Test + public void testDefaultExtendsNullCheck() { + this.testSimilarityNullCheck(this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }, null), + new InterfaceInitialiser(), false, ClassifiersPackage.Literals.INTERFACE__DEFAULT_EXTENDS); + } + + @Test + public void testExtends() { + var objOne = this.initElement(null, new TypeReference[] { this.createMinimalClsRef("cls1") }); + var objTwo = this.initElement(null, new TypeReference[] { this.createMinimalClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.INTERFACE__EXTENDS); + } + + @Test + public void testExtendsSize() { + var objOne = this.initElement(null, + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }); + var objTwo = this.initElement(null, new TypeReference[] { this.createMinimalClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, ClassifiersPackage.Literals.INTERFACE__EXTENDS); + } + + @Test + public void testExtendsNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, new TypeReference[] { this.createMinimalClsRef("cls1") }), + new InterfaceInitialiser(), false, ClassifiersPackage.Literals.INTERFACE__EXTENDS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LambdaExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LambdaExpressionTest.java new file mode 100644 index 0000000000..e4ea4541dd --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LambdaExpressionTest.java @@ -0,0 +1,51 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.LambdaBody; +import org.emftext.language.java.expressions.LambdaExpression; +import org.emftext.language.java.expressions.LambdaParameters; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLambdaParameters; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.expressions.LambdaExpressionInitialiser; + +public class LambdaExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesStatements, UsesLambdaParameters { + protected LambdaExpression initElement(LambdaBody body, LambdaParameters param) { + var init = new LambdaExpressionInitialiser(); + LambdaExpression result = init.instantiate(); + Assertions.assertTrue(init.setBody(result, body)); + Assertions.assertTrue(init.setParameters(result, param)); + return result; + } + + @Test + public void testBody() { + var objOne = this.initElement(this.createMinimalBlockWithNullReturn(), null); + var objTwo = this.initElement(this.createMinimalBlockWithTrivialAssert(), null); + + this.testSimilarity(objOne, objTwo, ExpressionsPackage.Literals.LAMBDA_EXPRESSION__BODY); + } + + @Test + public void testBodyNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalBlockWithNullReturn(), null), + new LambdaExpressionInitialiser(), false, ExpressionsPackage.Literals.LAMBDA_EXPRESSION__BODY); + } + + @Test + public void testParameters() { + var objOne = this.initElement(null, this.createMinimalETLP("p1", "c1")); + var objTwo = this.initElement(null, this.createMinimalETLP("p2", "c2")); + + this.testSimilarity(objOne, objTwo, ExpressionsPackage.Literals.LAMBDA_EXPRESSION__PARAMETERS); + } + + @Test + public void testParametersNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createMinimalETLP("p1", "c1")), + new LambdaExpressionInitialiser(), false, ExpressionsPackage.Literals.LAMBDA_EXPRESSION__PARAMETERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableStatementTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableStatementTest.java new file mode 100644 index 0000000000..d0cdee6d59 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableStatementTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.statements.LocalVariableStatement; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.variables.LocalVariable; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLocalVariables; +import cipm.consistency.initialisers.jamopp.statements.LocalVariableStatementInitialiser; + +public class LocalVariableStatementTest extends AbstractJaMoPPSimilarityTest implements UsesLocalVariables { + protected LocalVariableStatement initElement(LocalVariable var) { + var lvsInit = new LocalVariableStatementInitialiser(); + var lvs = lvsInit.instantiate(); + Assertions.assertTrue(lvsInit.setVariable(lvs, var)); + return lvs; + } + + @Test + public void testVariable() { + var objOne = this.initElement(this.createMinimalLV("lv1")); + var objTwo = this.initElement(this.createMinimalLV("lv2")); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.LOCAL_VARIABLE_STATEMENT__VARIABLE); + } + + @Test + public void testVariableNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalLV("lv1")), + new LocalVariableStatementInitialiser(), false, + StatementsPackage.Literals.LOCAL_VARIABLE_STATEMENT__VARIABLE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableTest.java new file mode 100644 index 0000000000..904c276ff7 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/LocalVariableTest.java @@ -0,0 +1,48 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.variables.AdditionalLocalVariable; +import org.emftext.language.java.variables.LocalVariable; +import org.emftext.language.java.variables.VariablesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAdditionalLocalVariables; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesNames; +import cipm.consistency.initialisers.jamopp.variables.LocalVariableInitialiser; + +public class LocalVariableTest extends AbstractJaMoPPSimilarityTest implements UsesAdditionalLocalVariables, UsesNames { + protected LocalVariable initElement(AdditionalLocalVariable[] alvs) { + var lvInit = new LocalVariableInitialiser(); + var lv = lvInit.instantiate(); + Assertions.assertTrue(lvInit.setName(lv, this.getDefaultName())); + Assertions.assertTrue(lvInit.addAdditionalLocalVariables(lv, alvs)); + return lv; + } + + @Test + public void testLocalVariable() { + var objOne = this.initElement(new AdditionalLocalVariable[] { this.createMinimalALV("alv1") }); + var objTwo = this.initElement(new AdditionalLocalVariable[] { this.createMinimalALV("alv2") }); + + this.testSimilarity(objOne, objTwo, VariablesPackage.Literals.LOCAL_VARIABLE__ADDITIONAL_LOCAL_VARIABLES); + } + + @Test + public void testLocalVariableSize() { + var objOne = this.initElement( + new AdditionalLocalVariable[] { this.createMinimalALV("alv1"), this.createMinimalALV("alv2") }); + var objTwo = this.initElement(new AdditionalLocalVariable[] { this.createMinimalALV("alv1") }); + + this.testSimilarity(objOne, objTwo, VariablesPackage.Literals.LOCAL_VARIABLE__ADDITIONAL_LOCAL_VARIABLES); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testLocalVariableNullCheck() { + this.testSimilarityNullCheck(this.initElement(new AdditionalLocalVariable[] { this.createMinimalALV("alv1") }), + new LocalVariableInitialiser(), false, + VariablesPackage.Literals.LOCAL_VARIABLE__ADDITIONAL_LOCAL_VARIABLES); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleReferenceTest.java new file mode 100644 index 0000000000..4aca5da0ff --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleReferenceTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.containers.Module; +import org.emftext.language.java.modules.ModuleReference; +import org.emftext.language.java.modules.ModulesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModules; +import cipm.consistency.initialisers.jamopp.modules.ModuleReferenceInitialiser; + +public class ModuleReferenceTest extends AbstractJaMoPPSimilarityTest implements UsesModules { + protected ModuleReference initElement(Module target) { + var mrInit = new ModuleReferenceInitialiser(); + var mr = mrInit.instantiate(); + Assertions.assertTrue(mrInit.setTarget(mr, target)); + return mr; + } + + @Test + public void testTarget() { + var objOne = this.initElement(this.createMinimalModule("mod1")); + var objTwo = this.initElement(this.createMinimalModule("mod2")); + + this.testSimilarity(objOne, objTwo, ModulesPackage.Literals.MODULE_REFERENCE__TARGET); + } + + @Test + public void testTargetNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalModule("mod1")), + new ModuleReferenceInitialiser(), false, ModulesPackage.Literals.MODULE_REFERENCE__TARGET); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleTest.java new file mode 100644 index 0000000000..e83435c641 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ModuleTest.java @@ -0,0 +1,100 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.containers.Module; +import org.emftext.language.java.containers.ContainersPackage; +import org.emftext.language.java.containers.Package; +import org.emftext.language.java.modules.ModuleDirective; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModuleDirectives; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesNames; +import cipm.consistency.initialisers.jamopp.containers.ModuleInitialiser; +import cipm.consistency.initialisers.jamopp.modifiers.OpenInitialiser; + +public class ModuleTest extends AbstractJaMoPPSimilarityTest implements UsesModuleDirectives, UsesNames { + protected Module initElement(Package[] pacs, ModuleDirective[] targets, boolean isOpen) { + var initialiser = new ModuleInitialiser(); + Module result = initialiser.instantiate(); + + Assertions.assertTrue(initialiser.setName(result, this.getDefaultName())); + Assertions.assertTrue(initialiser.addPackages(result, pacs)); + Assertions.assertTrue(initialiser.addTargets(result, targets)); + + if (isOpen) { + Assertions.assertTrue(initialiser.setOpen(result, new OpenInitialiser().instantiate())); + } + + return result; + } + + @Test + public void testOpen() { + var objOne = this.initElement(null, null, true); + var objTwo = this.initElement(null, null, false); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.MODULE__OPEN); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testOpenNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, null, true), new ModuleInitialiser(), false, + ContainersPackage.Literals.MODULE__OPEN); + } + + @Test + public void testPackages() { + var objOne = this.initElement(new Package[] { this.createMinimalPackage(new String[] { "ns1" }) }, null, false); + var objTwo = this.initElement(new Package[] { this.createMinimalPackage(new String[] { "ns2" }) }, null, false); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.MODULE__PACKAGES); + } + + @Test + public void testPackagesSize() { + var objOne = this.initElement(new Package[] { this.createMinimalPackage(new String[] { "ns1" }), + this.createMinimalPackage(new String[] { "ns2" }) }, null, false); + var objTwo = this.initElement(new Package[] { this.createMinimalPackage(new String[] { "ns1" }) }, null, false); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.MODULE__PACKAGES); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testPackagesNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new Package[] { this.createMinimalPackage(new String[] { "ns1" }) }, null, false), + new ModuleInitialiser(), false, ContainersPackage.Literals.MODULE__PACKAGES); + } + + @Test + public void testTargets() { + var objOne = this.initElement(null, new ModuleDirective[] { this.createMinimalEMD(new String[] { "ns1" }) }, + false); + var objTwo = this.initElement(null, new ModuleDirective[] { this.createMinimalOMD(new String[] { "ns1" }) }, + false); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.MODULE__TARGET); + } + + @Test + public void testTargetsSize() { + var objOne = this.initElement(null, new ModuleDirective[] { this.createMinimalEMD(new String[] { "ns1" }), + this.createMinimalEMD(new String[] { "ns2" }) }, false); + var objTwo = this.initElement(null, new ModuleDirective[] { this.createMinimalEMD(new String[] { "ns1" }) }, + false); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.MODULE__TARGET); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testTargetsNullCheck() { + this.testSimilarityNullCheck( + this.initElement(null, new ModuleDirective[] { this.createMinimalEMD(new String[] { "ns1" }) }, false), + new ModuleInitialiser(), false, ContainersPackage.Literals.MODULE__TARGET); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/MultiplicativeExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/MultiplicativeExpressionTest.java new file mode 100644 index 0000000000..0b2e36fb52 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/MultiplicativeExpressionTest.java @@ -0,0 +1,72 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.MultiplicativeExpression; +import org.emftext.language.java.expressions.MultiplicativeExpressionChild; +import org.emftext.language.java.operators.MultiplicativeOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.MultiplicativeExpressionInitialiser; + +public class MultiplicativeExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected MultiplicativeExpression initElement(MultiplicativeExpressionChild[] children, + MultiplicativeOperator[] ops) { + var meInit = new MultiplicativeExpressionInitialiser(); + var me = meInit.instantiate(); + Assertions.assertTrue(meInit.addChildren(me, children)); + Assertions.assertTrue(meInit.addMultiplicativeOperators(me, ops)); + return me; + } + + @Test + public void testChild() { + this.testSimilarity( + this.initElement(new MultiplicativeExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + this.initElement(new MultiplicativeExpressionChild[] { this.createDecimalIntegerLiteral(2) }, null), + ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new MultiplicativeExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }, null), + this.initElement(new MultiplicativeExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new MultiplicativeExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + new MultiplicativeExpressionInitialiser(), false, + ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__CHILDREN); + } + + @Test + public void testMultiplicativeOperator() { + this.testSimilarity(this.initElement(null, new MultiplicativeOperator[] { this.createDivisionOperator() }), + this.initElement(null, new MultiplicativeOperator[] { this.createMultiplicationOperator() }), + ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__MULTIPLICATIVE_OPERATORS); + } + + @Test + public void testMultiplicativeOperatorSize() { + this.testSimilarity( + this.initElement(null, + new MultiplicativeOperator[] { this.createDivisionOperator(), this.createMultiplicationOperator() }), + this.initElement(null, new MultiplicativeOperator[] { this.createDivisionOperator() }), + ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__MULTIPLICATIVE_OPERATORS); + } + + @Test + public void testMultiplicativeOperatorNullCheck() { + this.testSimilarityNullCheck( + this.initElement(null, new MultiplicativeOperator[] { this.createDivisionOperator() }), + new MultiplicativeExpressionInitialiser(), false, + ExpressionsPackage.Literals.MULTIPLICATIVE_EXPRESSION__MULTIPLICATIVE_OPERATORS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NamespaceClassifierReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NamespaceClassifierReferenceTest.java new file mode 100644 index 0000000000..5244f0481f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NamespaceClassifierReferenceTest.java @@ -0,0 +1,66 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.Classifier; +import org.emftext.language.java.types.ClassifierReference; +import org.emftext.language.java.types.NamespaceClassifierReference; +import org.emftext.language.java.types.TypesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.types.ClassifierReferenceInitialiser; +import cipm.consistency.initialisers.jamopp.types.NamespaceClassifierReferenceInitialiser; + +public class NamespaceClassifierReferenceTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + protected NamespaceClassifierReference initElement(Classifier target, ClassifierReference[] clsRefs) { + var ncrInit = new NamespaceClassifierReferenceInitialiser(); + var ncr = ncrInit.instantiate(); + Assertions.assertTrue(ncrInit.setTarget(ncr, target)); + Assertions.assertTrue(ncrInit.addClassifierReferences(ncr, clsRefs)); + return ncr; + } + + @Test + public void testTarget() { + var objOne = this.initElement(this.createMinimalClassWithCU("cls1"), null); + var objTwo = this.initElement(this.createMinimalClassWithCU("cls2"), null); + + this.testSimilarity(objOne, objTwo, NamespaceClassifierReference.class, + TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } + + @Test + public void testTargetNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalClassWithCU("cls1"), null), + new ClassifierReferenceInitialiser(), false, NamespaceClassifierReference.class, + TypesPackage.Literals.CLASSIFIER_REFERENCE__TARGET); + } + + @Test + public void testClassifierReference() { + var objOne = this.initElement(null, new ClassifierReference[] { this.createMinimalClsRef("cls1") }); + var objTwo = this.initElement(null, new ClassifierReference[] { this.createMinimalClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, + TypesPackage.Literals.NAMESPACE_CLASSIFIER_REFERENCE__CLASSIFIER_REFERENCES); + } + + @Test + public void testClassifierReferenceSize() { + var objOne = this.initElement(null, + new ClassifierReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }); + var objTwo = this.initElement(null, new ClassifierReference[] { this.createMinimalClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, + TypesPackage.Literals.NAMESPACE_CLASSIFIER_REFERENCE__CLASSIFIER_REFERENCES); + } + + @Test + public void testClassifierReferenceNullCheck() { + this.testSimilarityNullCheck( + this.initElement(null, new ClassifierReference[] { this.createMinimalClsRef("cls1") }), + new NamespaceClassifierReferenceInitialiser(), false, + TypesPackage.Literals.NAMESPACE_CLASSIFIER_REFERENCE__CLASSIFIER_REFERENCES); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NestedExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NestedExpressionTest.java new file mode 100644 index 0000000000..c416bbdb65 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NestedExpressionTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.NestedExpression; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.NestedExpressionInitialiser; + +public class NestedExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected NestedExpression initElement(Expression expr) { + var init = new NestedExpressionInitialiser(); + var result = init.instantiate(); + Assertions.assertTrue(init.setExpression(result, expr)); + return result; + } + + @Test + public void testExpression() { + var objOne = this.initElement(this.createMinimalFalseEE()); + var objTwo = this.initElement(this.createMinimalTrueEE()); + + this.testSimilarity(objOne, objTwo, ExpressionsPackage.Literals.NESTED_EXPRESSION__EXPRESSION); + } + + @Test + public void testExpressionNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalFalseEE()), new NestedExpressionInitialiser(), + false, ExpressionsPackage.Literals.NESTED_EXPRESSION__EXPRESSION); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NewConstructorCallTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NewConstructorCallTest.java new file mode 100644 index 0000000000..aa3e29cea0 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NewConstructorCallTest.java @@ -0,0 +1,43 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.classifiers.AnonymousClass; +import org.emftext.language.java.instantiations.NewConstructorCall; +import org.emftext.language.java.instantiations.InstantiationsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnonymousClasses; +import cipm.consistency.initialisers.jamopp.classifiers.ClassInitialiser; +import cipm.consistency.initialisers.jamopp.initadapters.NewConstructorCallInitialiserAdapter; +import cipm.consistency.initialisers.jamopp.instantiations.NewConstructorCallInitialiser; +import cipm.consistency.initialisers.jamopp.types.ClassifierReferenceInitialiser; + +public class NewConstructorCallTest extends AbstractJaMoPPSimilarityTest implements UsesAnonymousClasses { + protected NewConstructorCall initElement(AnonymousClass anonymousCls) { + var nccInit = new NewConstructorCallInitialiser(); + nccInit.addAdaptingStrategy( + new NewConstructorCallInitialiserAdapter(new ClassifierReferenceInitialiser(), new ClassInitialiser())); + var ncc = nccInit.instantiate(); + Assertions.assertTrue(nccInit.initialise(ncc)); + Assertions.assertTrue(nccInit.setAnonymousClass(ncc, anonymousCls)); + return ncc; + } + + @Test + public void testAnonymousClass() { + var objOne = this.initElement(this.createMinimalAnonymousClassWithMethod("met1")); + var objTwo = this.initElement(this.createMinimalAnonymousClassWithMethod("met2")); + + this.testSimilarity(objOne, objTwo, InstantiationsPackage.Literals.NEW_CONSTRUCTOR_CALL__ANONYMOUS_CLASS); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testAnonymousClassNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalAnonymousClassWithMethod("met1")), + new NewConstructorCallInitialiser(), false, + InstantiationsPackage.Literals.NEW_CONSTRUCTOR_CALL__ANONYMOUS_CLASS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchCaseTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchCaseTest.java new file mode 100644 index 0000000000..bb2d2166fc --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchCaseTest.java @@ -0,0 +1,43 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.NormalSwitchCase; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.NormalSwitchCaseInitialiser; + +public class NormalSwitchCaseTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected NormalSwitchCase initElement(Expression[] additionalConds) { + var nscInit = new NormalSwitchCaseInitialiser(); + var nsc = nscInit.instantiate(); + Assertions.assertTrue(nscInit.addAdditionalConditions(nsc, additionalConds)); + return nsc; + } + + @Test + public void testAdditionalCondition() { + var objOne = this.initElement(new Expression[] { this.createMinimalFalseEE() }); + var objTwo = this.initElement(new Expression[] { this.createMinimalTrueNEE() }); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.NORMAL_SWITCH_CASE__ADDITIONAL_CONDITIONS); + } + + @Test + public void testAdditionalConditionSize() { + var objOne = this.initElement(new Expression[] { this.createMinimalFalseEE(), this.createMinimalTrueNEE() }); + var objTwo = this.initElement(new Expression[] { this.createMinimalFalseEE() }); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.NORMAL_SWITCH_CASE__ADDITIONAL_CONDITIONS); + } + + @Test + public void testAdditionalConditionNullCheck() { + this.testSimilarityNullCheck(this.initElement(new Expression[] { this.createMinimalFalseEE() }), + new NormalSwitchCaseInitialiser(), false, + StatementsPackage.Literals.NORMAL_SWITCH_CASE__ADDITIONAL_CONDITIONS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchRuleTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchRuleTest.java new file mode 100644 index 0000000000..be5e5f9caf --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/NormalSwitchRuleTest.java @@ -0,0 +1,43 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.NormalSwitchRule; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.NormalSwitchRuleInitialiser; + +public class NormalSwitchRuleTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected NormalSwitchRule initElement(Expression[] additionalConds) { + var nsrInit = new NormalSwitchRuleInitialiser(); + var nsr = nsrInit.instantiate(); + Assertions.assertTrue(nsrInit.addAdditionalConditions(nsr, additionalConds)); + return nsr; + } + + @Test + public void testAdditionalCondition() { + var objOne = this.initElement(new Expression[] { this.createMinimalFalseEE() }); + var objTwo = this.initElement(new Expression[] { this.createMinimalTrueNEE() }); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.NORMAL_SWITCH_RULE__ADDITIONAL_CONDITIONS); + } + + @Test + public void testAdditionalConditionSize() { + var objOne = this.initElement(new Expression[] { this.createMinimalFalseEE(), this.createMinimalTrueNEE() }); + var objTwo = this.initElement(new Expression[] { this.createMinimalFalseEE() }); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.NORMAL_SWITCH_RULE__ADDITIONAL_CONDITIONS); + } + + @Test + public void testAdditionalConditionNullCheck() { + this.testSimilarityNullCheck(this.initElement(new Expression[] { this.createMinimalFalseEE() }), + new NormalSwitchRuleInitialiser(), false, + StatementsPackage.Literals.NORMAL_SWITCH_RULE__ADDITIONAL_CONDITIONS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalIntegerLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalIntegerLiteralTest.java new file mode 100644 index 0000000000..f2612abe72 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalIntegerLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.LiteralsPackage; +import org.emftext.language.java.literals.OctalIntegerLiteral; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.OctalIntegerLiteralInitialiser; + +public class OctalIntegerLiteralTest extends AbstractJaMoPPSimilarityTest { + protected OctalIntegerLiteral initElement(int val) { + var init = new OctalIntegerLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setOctalValue(lit, val)); + return lit; + } + + @Test + public void testOctalValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.OCTAL_INTEGER_LITERAL__OCTAL_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testOctalValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new OctalIntegerLiteralInitialiser(), false, + LiteralsPackage.Literals.OCTAL_INTEGER_LITERAL__OCTAL_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalLongLiteralTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalLongLiteralTest.java new file mode 100644 index 0000000000..e43928e890 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/OctalLongLiteralTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.LiteralsPackage; +import org.emftext.language.java.literals.OctalLongLiteral; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.literals.OctalLongLiteralInitialiser; + +public class OctalLongLiteralTest extends AbstractJaMoPPSimilarityTest { + protected OctalLongLiteral initElement(long val) { + var init = new OctalLongLiteralInitialiser(); + var lit = init.instantiate(); + Assertions.assertTrue(init.setOctalValue(lit, val)); + return lit; + } + + @Test + public void testOctalValue() { + this.testSimilarity(this.initElement(1), this.initElement(2), + LiteralsPackage.Literals.OCTAL_LONG_LITERAL__OCTAL_VALUE); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testOctalValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(1), new OctalLongLiteralInitialiser(), false, + LiteralsPackage.Literals.OCTAL_LONG_LITERAL__OCTAL_VALUE); + } +} \ No newline at end of file diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PackageTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PackageTest.java new file mode 100644 index 0000000000..d01ac1c74a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PackageTest.java @@ -0,0 +1,62 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.containers.ContainersPackage; +import org.emftext.language.java.containers.Module; +import org.emftext.language.java.containers.Package; +import org.emftext.language.java.classifiers.ConcreteClassifier; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModules; +import cipm.consistency.initialisers.jamopp.containers.PackageInitialiser; + +public class PackageTest extends AbstractJaMoPPSimilarityTest implements UsesModules, UsesConcreteClassifiers { + protected Package initElement(Module mod, ConcreteClassifier[] clss) { + var initialiser = new PackageInitialiser(); + Package pac = initialiser.instantiate(); + Assertions.assertTrue(initialiser.setModule(pac, mod)); + Assertions.assertTrue(initialiser.addClassifiers(pac, clss)); + + return pac; + } + + @Test + public void testModule() { + var objOne = this.initElement(this.createMinimalModule("mod1"), null); + var objTwo = this.initElement(this.createMinimalModule("mod2"), null); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.PACKAGE__MODULE); + } + + @Test + public void testModuleNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalModule("mod1"), null), new PackageInitialiser(), + false, ContainersPackage.Literals.PACKAGE__MODULE); + } + + @Test + public void testClassifiers() { + var objOne = this.initElement(null, new ConcreteClassifier[] { this.createMinimalClass("cls1") }); + var objTwo = this.initElement(null, new ConcreteClassifier[] { this.createMinimalClass("cls2") }); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.PACKAGE__CLASSIFIERS); + } + + @Test + public void testClassifiersSize() { + var objOne = this.initElement(null, + new ConcreteClassifier[] { this.createMinimalClass("cls1"), this.createMinimalClass("cls2") }); + var objTwo = this.initElement(null, new ConcreteClassifier[] { this.createMinimalClass("cls1") }); + + this.testSimilarity(objOne, objTwo, ContainersPackage.Literals.PACKAGE__CLASSIFIERS); + } + + @Test + public void testClassifiersNullCheck() { + this.testSimilarityNullCheck( + this.initElement(null, new ConcreteClassifier[] { this.createMinimalClass("cls1") }), + new PackageInitialiser(), false, ContainersPackage.Literals.PACKAGE__CLASSIFIERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimaryExpressionReferenceExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimaryExpressionReferenceExpressionTest.java new file mode 100644 index 0000000000..22459a5f83 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimaryExpressionReferenceExpressionTest.java @@ -0,0 +1,50 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.MethodReferenceExpressionChild; +import org.emftext.language.java.expressions.PrimaryExpressionReferenceExpression; +import org.emftext.language.java.references.Reference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.PrimaryExpressionReferenceExpressionInitialiser; + +public class PrimaryExpressionReferenceExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected PrimaryExpressionReferenceExpression initElement(MethodReferenceExpressionChild child, Reference metRef) { + var pereInit = new PrimaryExpressionReferenceExpressionInitialiser(); + var pere = pereInit.instantiate(); + Assertions.assertTrue(pereInit.setChild(pere, child)); + Assertions.assertTrue(pereInit.setMethodReference(pere, metRef)); + return pere; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(this.createDecimalIntegerLiteral(1), null), + this.initElement(this.createDecimalIntegerLiteral(2), null), + ExpressionsPackage.Literals.PRIMARY_EXPRESSION_REFERENCE_EXPRESSION__CHILD); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1), null), + new PrimaryExpressionReferenceExpressionInitialiser(), false, + ExpressionsPackage.Literals.PRIMARY_EXPRESSION_REFERENCE_EXPRESSION__CHILD); + } + + @Test + public void testMethodReference() { + this.testSimilarity(this.initElement(null, this.createMinimalSR("str1")), + this.initElement(null, this.createMinimalSR("str2")), + ExpressionsPackage.Literals.PRIMARY_EXPRESSION_REFERENCE_EXPRESSION__METHOD_REFERENCE); + } + + @Test + public void testMethodReferenceNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createMinimalSR("str1")), + new PrimaryExpressionReferenceExpressionInitialiser(), false, + ExpressionsPackage.Literals.PRIMARY_EXPRESSION_REFERENCE_EXPRESSION__METHOD_REFERENCE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimitiveTypeReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimitiveTypeReferenceTest.java new file mode 100644 index 0000000000..8956442bbb --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/PrimitiveTypeReferenceTest.java @@ -0,0 +1,36 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.references.PrimitiveTypeReference; +import org.emftext.language.java.references.ReferencesPackage; +import org.emftext.language.java.types.PrimitiveType; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.references.PrimitiveTypeReferenceInitialiser; +import cipm.consistency.initialisers.jamopp.types.BooleanInitialiser; +import cipm.consistency.initialisers.jamopp.types.IntInitialiser; + +public class PrimitiveTypeReferenceTest extends AbstractJaMoPPSimilarityTest { + protected PrimitiveTypeReference initElement(PrimitiveType pType) { + var ptInit = new PrimitiveTypeReferenceInitialiser(); + var pt = ptInit.instantiate(); + Assertions.assertTrue(ptInit.setPrimitiveType(pt, pType)); + return pt; + } + + @Test + public void testPrimitiveType() { + var objOne = this.initElement(new BooleanInitialiser().instantiate()); + var objTwo = this.initElement(new IntInitialiser().instantiate()); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.PRIMITIVE_TYPE_REFERENCE__PRIMITIVE_TYPE); + } + + @Test + public void testPrimitiveTypeNullCheck() { + this.testSimilarityNullCheck(this.initElement(new BooleanInitialiser().instantiate()), + new PrimitiveTypeReferenceInitialiser(), false, + ReferencesPackage.Literals.PRIMITIVE_TYPE_REFERENCE__PRIMITIVE_TYPE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ProvidesModuleDirectiveTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ProvidesModuleDirectiveTest.java new file mode 100644 index 0000000000..950e47cbdb --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ProvidesModuleDirectiveTest.java @@ -0,0 +1,44 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.modules.ProvidesModuleDirective; +import org.emftext.language.java.modules.ModulesPackage; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.modules.ProvidesModuleDirectiveInitialiser; + +public class ProvidesModuleDirectiveTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + protected ProvidesModuleDirective initElement(TypeReference[] serviceProviders) { + var pmdInit = new ProvidesModuleDirectiveInitialiser(); + var pmd = pmdInit.instantiate(); + Assertions.assertTrue(pmdInit.addServiceProviders(pmd, serviceProviders)); + return pmd; + } + + @Test + public void testServiceProvider() { + var objOne = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, ModulesPackage.Literals.PROVIDES_MODULE_DIRECTIVE__SERVICE_PROVIDERS); + } + + @Test + public void testServiceProviderSize() { + var objOne = this.initElement( + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, ModulesPackage.Literals.PROVIDES_MODULE_DIRECTIVE__SERVICE_PROVIDERS); + } + + @Test + public void testServiceProviderNullCheck() { + this.testSimilarityNullCheck(this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }), + new ProvidesModuleDirectiveInitialiser(), false, + ModulesPackage.Literals.PROVIDES_MODULE_DIRECTIVE__SERVICE_PROVIDERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReceiverParameterTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReceiverParameterTest.java new file mode 100644 index 0000000000..f3d4de9d6a --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReceiverParameterTest.java @@ -0,0 +1,52 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.parameters.ReceiverParameter; +import org.emftext.language.java.literals.This; +import org.emftext.language.java.parameters.ParametersPackage; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLiterals; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.parameters.ReceiverParameterInitialiser; + +public class ReceiverParameterTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences, UsesLiterals { + protected ReceiverParameter initElement(This thisRef, TypeReference otRef) { + var rpInit = new ReceiverParameterInitialiser(); + var rp = rpInit.instantiate(); + Assertions.assertTrue(rpInit.setThisReference(rp, thisRef)); + Assertions.assertTrue(rpInit.setOuterTypeReference(rp, otRef)); + return rp; + } + + @Test + public void testThisTypeReference() { + var objOne = this.initElement(this.createThis(), null); + var objTwo = this.initElement(null, null); + + this.testSimilarity(objOne, objTwo, ParametersPackage.Literals.RECEIVER_PARAMETER__THIS_REFERENCE); + } + + @Test + public void testThisTypeReferenceNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createThis(), null), new ReceiverParameterInitialiser(), + false, ParametersPackage.Literals.RECEIVER_PARAMETER__THIS_REFERENCE); + } + + @Test + public void testOuterTypeReference() { + var objOne = this.initElement(null, this.createMinimalClsRef("cls1")); + var objTwo = this.initElement(null, this.createMinimalClsRef("cls2")); + + this.testSimilarity(objOne, objTwo, ParametersPackage.Literals.RECEIVER_PARAMETER__OUTER_TYPE_REFERENCE); + } + + @Test + public void testOuterTypeReferenceNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createMinimalClsRef("cls1")), + new ReceiverParameterInitialiser(), false, + ParametersPackage.Literals.RECEIVER_PARAMETER__OUTER_TYPE_REFERENCE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RelationExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RelationExpressionTest.java new file mode 100644 index 0000000000..1eabdd4ead --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RelationExpressionTest.java @@ -0,0 +1,70 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.RelationExpression; +import org.emftext.language.java.expressions.RelationExpressionChild; +import org.emftext.language.java.operators.RelationOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.RelationExpressionInitialiser; + +public class RelationExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected RelationExpression initElement(RelationExpressionChild[] children, RelationOperator[] ops) { + var reInit = new RelationExpressionInitialiser(); + var re = reInit.instantiate(); + Assertions.assertTrue(reInit.addChildren(re, children)); + Assertions.assertTrue(reInit.addRelationOperators(re, ops)); + return re; + } + + @Test + public void testChild() { + this.testSimilarity( + this.initElement(new RelationExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + this.initElement(new RelationExpressionChild[] { this.createDecimalIntegerLiteral(2) }, null), + ExpressionsPackage.Literals.RELATION_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new RelationExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }, null), + this.initElement(new RelationExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + ExpressionsPackage.Literals.RELATION_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new RelationExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + new RelationExpressionInitialiser(), false, ExpressionsPackage.Literals.RELATION_EXPRESSION__CHILDREN); + } + + @Test + public void testRelationOperator() { + this.testSimilarity(this.initElement(null, new RelationOperator[] { this.createGreaterThanOperator() }), + this.initElement(null, new RelationOperator[] { this.createLessThanOperator() }), + ExpressionsPackage.Literals.RELATION_EXPRESSION__RELATION_OPERATORS); + } + + @Test + public void testRelationOperatorSize() { + this.testSimilarity( + this.initElement(null, + new RelationOperator[] { this.createGreaterThanOperator(), this.createLessThanOperator() }), + this.initElement(null, new RelationOperator[] { this.createGreaterThanOperator() }), + ExpressionsPackage.Literals.RELATION_EXPRESSION__RELATION_OPERATORS); + } + + @Test + public void testRelationOperatorNullCheck() { + this.testSimilarityNullCheck( + this.initElement(null, new RelationOperator[] { this.createGreaterThanOperator() }), + new RelationExpressionInitialiser(), false, + ExpressionsPackage.Literals.RELATION_EXPRESSION__RELATION_OPERATORS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RequiresModuleDirectiveTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RequiresModuleDirectiveTest.java new file mode 100644 index 0000000000..0a1a4ef925 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/RequiresModuleDirectiveTest.java @@ -0,0 +1,54 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.modifiers.ModuleRequiresModifier; +import org.emftext.language.java.modules.ModuleReference; +import org.emftext.language.java.modules.ModulesPackage; +import org.emftext.language.java.modules.RequiresModuleDirective; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLiterals; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesModuleReferences; +import cipm.consistency.initialisers.jamopp.modules.RequiresModuleDirectiveInitialiser; + +public class RequiresModuleDirectiveTest extends AbstractJaMoPPSimilarityTest implements UsesLiterals, UsesModuleReferences { + protected RequiresModuleDirective initElement(ModuleRequiresModifier modif, ModuleReference reqMod) { + var rmdInit = new RequiresModuleDirectiveInitialiser(); + var rmd = rmdInit.instantiate(); + Assertions.assertTrue(rmdInit.setModifier(rmd, modif)); + Assertions.assertTrue(rmdInit.setRequiredModule(rmd, reqMod)); + return rmd; + } + + @Test + public void testModifier() { + var objOne = this.initElement(this.createStatic(), null); + var objTwo = this.initElement(this.createTransitive(), null); + + this.testSimilarity(objOne, objTwo, ModulesPackage.Literals.REQUIRES_MODULE_DIRECTIVE__MODIFIER); + } + + @Test + public void testModifierNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createStatic(), null), + new RequiresModuleDirectiveInitialiser(), false, + ModulesPackage.Literals.REQUIRES_MODULE_DIRECTIVE__MODIFIER); + } + + @Test + public void testRequiredModule() { + var objOne = this.initElement(null, this.createMinimalMR("mod1", new String[] { "ns1", "ns2" })); + var objTwo = this.initElement(null, this.createMinimalMR("mod2", new String[] { "ns3", "ns4" })); + + this.testSimilarity(objOne, objTwo, ModulesPackage.Literals.REQUIRES_MODULE_DIRECTIVE__REQUIRED_MODULE); + } + + @Test + public void testRequiredModuleNullCheck() { + this.testSimilarityNullCheck( + this.initElement(null, this.createMinimalMR("mod1", new String[] { "ns1", "ns2" })), + new RequiresModuleDirectiveInitialiser(), false, + ModulesPackage.Literals.REQUIRES_MODULE_DIRECTIVE__REQUIRED_MODULE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReturnTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReturnTest.java new file mode 100644 index 0000000000..c0a41c57cb --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ReturnTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.Return; +import org.emftext.language.java.statements.StatementsPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.ReturnInitialiser; + +public class ReturnTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected Return initElement(Expression retVal) { + var retInit = new ReturnInitialiser(); + var ret = retInit.instantiate(); + Assertions.assertTrue(retInit.setReturnValue(ret, retVal)); + return ret; + } + + @Test + public void testReturnValue() { + var objOne = this.initElement(this.createDecimalIntegerLiteral(1)); + var objTwo = this.initElement(this.createMinimalFalseEE()); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.RETURN__RETURN_VALUE); + } + + @Test + public void testReturnValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1)), new ReturnInitialiser(), + false, StatementsPackage.Literals.RETURN__RETURN_VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SelfReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SelfReferenceTest.java new file mode 100644 index 0000000000..4d9f60f461 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SelfReferenceTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.literals.Self; +import org.emftext.language.java.references.SelfReference; +import org.emftext.language.java.references.ReferencesPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLiterals; +import cipm.consistency.initialisers.jamopp.references.SelfReferenceInitialiser; + +public class SelfReferenceTest extends AbstractJaMoPPSimilarityTest implements UsesLiterals { + protected SelfReference initElement(Self self) { + var srInit = new SelfReferenceInitialiser(); + var sr = srInit.instantiate(); + Assertions.assertTrue(srInit.setSelf(sr, self)); + return sr; + } + + @Test + public void testSelf() { + var objOne = this.initElement(this.createThis()); + var objTwo = this.initElement(this.createSuper()); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.SELF_REFERENCE__SELF); + } + + @Test + public void testSelfNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createThis()), new SelfReferenceInitialiser(), false, + ReferencesPackage.Literals.SELF_REFERENCE__SELF); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ShiftExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ShiftExpressionTest.java new file mode 100644 index 0000000000..4caa0c8003 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ShiftExpressionTest.java @@ -0,0 +1,67 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.ShiftExpression; +import org.emftext.language.java.expressions.ShiftExpressionChild; +import org.emftext.language.java.operators.ShiftOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.ShiftExpressionInitialiser; + +public class ShiftExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected ShiftExpression initElement(ShiftExpressionChild[] children, ShiftOperator[] ops) { + var seInit = new ShiftExpressionInitialiser(); + var se = seInit.instantiate(); + Assertions.assertTrue(seInit.addChildren(se, children)); + Assertions.assertTrue(seInit.addShiftOperators(se, ops)); + return se; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(new ShiftExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + this.initElement(new ShiftExpressionChild[] { this.createDecimalIntegerLiteral(2) }, null), + ExpressionsPackage.Literals.SHIFT_EXPRESSION__CHILDREN); + } + + @Test + public void testChildSize() { + this.testSimilarity( + this.initElement(new ShiftExpressionChild[] { this.createDecimalIntegerLiteral(1), + this.createDecimalIntegerLiteral(2) }, null), + this.initElement(new ShiftExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + ExpressionsPackage.Literals.SHIFT_EXPRESSION__CHILDREN); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new ShiftExpressionChild[] { this.createDecimalIntegerLiteral(1) }, null), + new ShiftExpressionInitialiser(), false, ExpressionsPackage.Literals.SHIFT_EXPRESSION__CHILDREN); + } + + @Test + public void testShiftOperator() { + this.testSimilarity(this.initElement(null, new ShiftOperator[] { this.createLeftShiftOperator() }), + this.initElement(null, new ShiftOperator[] { this.createRightShiftOperator() }), + ExpressionsPackage.Literals.SHIFT_EXPRESSION__SHIFT_OPERATORS); + } + + @Test + public void testShiftOperatorSize() { + this.testSimilarity( + this.initElement(null, + new ShiftOperator[] { this.createLeftShiftOperator(), this.createRightShiftOperator() }), + this.initElement(null, new ShiftOperator[] { this.createLeftShiftOperator() }), + ExpressionsPackage.Literals.SHIFT_EXPRESSION__SHIFT_OPERATORS); + } + + @Test + public void testShiftOperatorNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, new ShiftOperator[] { this.createLeftShiftOperator() }), + new ShiftExpressionInitialiser(), false, ExpressionsPackage.Literals.SHIFT_EXPRESSION__SHIFT_OPERATORS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SingleAnnotationParameterTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SingleAnnotationParameterTest.java new file mode 100644 index 0000000000..409b18fb6d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SingleAnnotationParameterTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.annotations.AnnotationValue; +import org.emftext.language.java.annotations.AnnotationsPackage; +import org.emftext.language.java.annotations.SingleAnnotationParameter; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesAnnotationValues; +import cipm.consistency.initialisers.jamopp.annotations.SingleAnnotationParameterInitialiser; + +public class SingleAnnotationParameterTest extends AbstractJaMoPPSimilarityTest implements UsesAnnotationValues { + protected SingleAnnotationParameter initElement(AnnotationValue val) { + var sapInit = new SingleAnnotationParameterInitialiser(); + var sap = sapInit.instantiate(); + Assertions.assertTrue(sapInit.setValue(sap, val)); + return sap; + } + + @Test + public void testValue() { + var objOne = this.initElement(this.createNullLiteral()); + var objTwo = this.initElement(this.createMinimalSR("strVal")); + + this.testSimilarity(objOne, objTwo, AnnotationsPackage.Literals.SINGLE_ANNOTATION_PARAMETER__VALUE); + } + + @Test + public void testValueNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createNullLiteral()), + new SingleAnnotationParameterInitialiser(), false, + AnnotationsPackage.Literals.SINGLE_ANNOTATION_PARAMETER__VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StaticMemberImportTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StaticMemberImportTest.java new file mode 100644 index 0000000000..65a817b276 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StaticMemberImportTest.java @@ -0,0 +1,45 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.imports.ImportsPackage; +import org.emftext.language.java.imports.StaticMemberImport; +import org.emftext.language.java.references.ReferenceableElement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesMethods; +import cipm.consistency.initialisers.jamopp.imports.StaticMemberImportInitialiser; + +public class StaticMemberImportTest extends AbstractJaMoPPSimilarityTest implements UsesMethods { + protected StaticMemberImport initElement(ReferenceableElement[] staticMems) { + var smiInit = new StaticMemberImportInitialiser(); + var smi = smiInit.instantiate(); + Assertions.assertTrue(smiInit.addStaticMembers(smi, staticMems)); + return smi; + } + + @Test + public void testStaticMember() { + var objOne = this.initElement(new ReferenceableElement[] { this.createMinimalClsMethodWithNullReturn("met1") }); + var objTwo = this.initElement(new ReferenceableElement[] { this.createMinimalClsMethodWithNullReturn("met2") }); + + this.testSimilarity(objOne, objTwo, ImportsPackage.Literals.STATIC_MEMBER_IMPORT__STATIC_MEMBERS); + } + + @Test + public void testStaticMemberSize() { + var objOne = this.initElement(new ReferenceableElement[] { this.createMinimalClsMethodWithNullReturn("met1"), + this.createMinimalClsMethodWithNullReturn("met2") }); + var objTwo = this.initElement(new ReferenceableElement[] { this.createMinimalClsMethodWithNullReturn("met1") }); + + this.testSimilarity(objOne, objTwo, ImportsPackage.Literals.STATIC_MEMBER_IMPORT__STATIC_MEMBERS); + } + + @Test + public void testStaticMemberNullCheck() { + this.testSimilarityNullCheck( + this.initElement(new ReferenceableElement[] { this.createMinimalClsMethodWithNullReturn("met1") }), + new StaticMemberImportInitialiser(), false, + ImportsPackage.Literals.STATIC_MEMBER_IMPORT__STATIC_MEMBERS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StringReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StringReferenceTest.java new file mode 100644 index 0000000000..6cbf89a56e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/StringReferenceTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.references.ReferencesPackage; +import org.emftext.language.java.references.StringReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.references.StringReferenceInitialiser; + +public class StringReferenceTest extends AbstractJaMoPPSimilarityTest { + protected StringReference initElement(String val) { + var srInit = new StringReferenceInitialiser(); + var sr = srInit.instantiate(); + Assertions.assertTrue(srInit.setValue(sr, val)); + return sr; + } + + @Test + public void testValue() { + var objOne = this.initElement("val1"); + var objTwo = this.initElement("val2"); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.STRING_REFERENCE__VALUE); + } + + @Test + public void testValueNullCheck() { + this.testSimilarityNullCheck(this.initElement("val1"), new StringReferenceInitialiser(), false, + ReferencesPackage.Literals.STRING_REFERENCE__VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SuperTypeArgumentTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SuperTypeArgumentTest.java new file mode 100644 index 0000000000..213b079234 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SuperTypeArgumentTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.generics.GenericsPackage; +import org.emftext.language.java.generics.SuperTypeArgument; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.generics.SuperTypeArgumentInitialiser; + +public class SuperTypeArgumentTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences { + protected SuperTypeArgument initElement(TypeReference superType) { + var staInit = new SuperTypeArgumentInitialiser(); + var sta = staInit.instantiate(); + Assertions.assertTrue(staInit.setSuperType(sta, superType)); + return sta; + } + + @Test + public void testSuperType() { + var objOne = this.initElement(this.createMinimalClsRef("cls1")); + var objTwo = this.initElement(this.createMinimalClsRef("cls2")); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.SUPER_TYPE_ARGUMENT__SUPER_TYPE); + } + + @Test + public void testSuperTypeNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalClsRef("cls1")), + new SuperTypeArgumentInitialiser(), false, GenericsPackage.Literals.SUPER_TYPE_ARGUMENT__SUPER_TYPE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SwitchTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SwitchTest.java new file mode 100644 index 0000000000..71ed5767a3 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SwitchTest.java @@ -0,0 +1,58 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.statements.Switch; +import org.emftext.language.java.statements.SwitchCase; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesSwitchCases; +import cipm.consistency.initialisers.jamopp.statements.SwitchInitialiser; + +public class SwitchTest extends AbstractJaMoPPSimilarityTest implements UsesSwitchCases { + protected Switch initElement(SwitchCase[] cases, Expression var) { + var swInit = new SwitchInitialiser(); + var sw = swInit.instantiate(); + Assertions.assertTrue(swInit.addCases(sw, cases)); + Assertions.assertTrue(swInit.setVariable(sw, var)); + return sw; + } + + @Test + public void testCase() { + var objOne = this.initElement(new SwitchCase[] { this.createEmptyNSC() }, null); + var objTwo = this.initElement(new SwitchCase[] { this.createMinimalNSC() }, null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.SWITCH__CASES); + } + + @Test + public void testCaseSize() { + var objOne = this.initElement(new SwitchCase[] { this.createEmptyNSC(), this.createMinimalNSC() }, null); + var objTwo = this.initElement(new SwitchCase[] { this.createEmptyNSC() }, null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.SWITCH__CASES); + } + + @Test + public void testCaseNullCheck() { + this.testSimilarityNullCheck(this.initElement(new SwitchCase[] { this.createEmptyNSC() }, null), + new SwitchInitialiser(), false, StatementsPackage.Literals.SWITCH__CASES); + } + + @Test + public void testVariable() { + var objOne = this.initElement(null, this.createMinimalSR("str1")); + var objTwo = this.initElement(null, this.createMinimalSR("str2")); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.SWITCH__VARIABLE); + } + + @Test + public void testVariableNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, this.createMinimalSR("str1")), new SwitchInitialiser(), + false, StatementsPackage.Literals.SWITCH__VARIABLE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SynchronizedBlockTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SynchronizedBlockTest.java new file mode 100644 index 0000000000..c536a82328 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/SynchronizedBlockTest.java @@ -0,0 +1,35 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.statements.SynchronizedBlock; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.SynchronizedBlockInitialiser; + +public class SynchronizedBlockTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected SynchronizedBlock initElement(Expression lockProvider) { + var sbInit = new SynchronizedBlockInitialiser(); + var sb = sbInit.instantiate(); + Assertions.assertTrue(sbInit.setLockProvider(sb, lockProvider)); + return sb; + } + + @Test + public void testLockProvider() { + var objOne = this.initElement(this.createDecimalIntegerLiteral(1)); + var objTwo = this.initElement(this.createDecimalIntegerLiteral(2)); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.SYNCHRONIZED_BLOCK__LOCK_PROVIDER); + } + + @Test + public void testLockProviderNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1)), + new SynchronizedBlockInitialiser(), false, + StatementsPackage.Literals.SYNCHRONIZED_BLOCK__LOCK_PROVIDER); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TextBlockReferenceTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TextBlockReferenceTest.java new file mode 100644 index 0000000000..79eae8fd31 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TextBlockReferenceTest.java @@ -0,0 +1,32 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.references.ReferencesPackage; +import org.emftext.language.java.references.TextBlockReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.jamopp.references.TextBlockReferenceInitialiser; + +public class TextBlockReferenceTest extends AbstractJaMoPPSimilarityTest { + protected TextBlockReference initElement(String val) { + var tbrInit = new TextBlockReferenceInitialiser(); + var tbr = tbrInit.instantiate(); + Assertions.assertTrue(tbrInit.setValue(tbr, val)); + return tbr; + } + + @Test + public void testValue() { + var objOne = this.initElement("val1"); + var objTwo = this.initElement("val2"); + + this.testSimilarity(objOne, objTwo, ReferencesPackage.Literals.TEXT_BLOCK_REFERENCE__VALUE); + } + + @Test + public void testValueNullCheck() { + this.testSimilarityNullCheck(this.initElement("val1"), new TextBlockReferenceInitialiser(), false, + ReferencesPackage.Literals.TEXT_BLOCK_REFERENCE__VALUE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ThrowTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ThrowTest.java new file mode 100644 index 0000000000..ab1268f9de --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/ThrowTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.statements.Throw; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.ThrowInitialiser; + +public class ThrowTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected Throw initElement(Expression throwable) { + var thInit = new ThrowInitialiser(); + var th = thInit.instantiate(); + Assertions.assertTrue(thInit.setThrowable(th, throwable)); + return th; + } + + @Test + public void testThrowable() { + var objOne = this.initElement(this.createMinimalSR("str1")); + var objTwo = this.initElement(this.createMinimalSR("str2")); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.THROW__THROWABLE); + } + + @Test + public void testThrowableNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createMinimalSR("str1")), new ThrowInitialiser(), false, + StatementsPackage.Literals.THROW__THROWABLE); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TryBlockTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TryBlockTest.java new file mode 100644 index 0000000000..b3856f34b0 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TryBlockTest.java @@ -0,0 +1,87 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.statements.Block; +import org.emftext.language.java.statements.CatchBlock; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.statements.TryBlock; +import org.emftext.language.java.variables.Resource; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesCatchBlocks; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesLocalVariables; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.statements.TryBlockInitialiser; + +public class TryBlockTest extends AbstractJaMoPPSimilarityTest implements UsesCatchBlocks, UsesStatements, UsesLocalVariables { + protected TryBlock initElement(Resource[] ress, CatchBlock[] catchBlocks, Block finallyBlock) { + var tbInit = new TryBlockInitialiser(); + var tb = tbInit.instantiate(); + Assertions.assertTrue(tbInit.addResources(tb, ress)); + Assertions.assertTrue(tbInit.addCatchBlocks(tb, catchBlocks)); + Assertions.assertTrue(tbInit.setFinallyBlock(tb, finallyBlock)); + return tb; + } + + @Test + public void testResource() { + var objOne = this.initElement(new Resource[] { this.createMinimalLV("lv1") }, null, null); + var objTwo = this.initElement(new Resource[] { this.createMinimalLV("lv2") }, null, null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.TRY_BLOCK__RESOURCES); + } + + @Test + public void testResourceSize() { + var objOne = this.initElement(new Resource[] { this.createMinimalLV("lv1"), this.createMinimalLV("lv2") }, null, + null); + var objTwo = this.initElement(new Resource[] { this.createMinimalLV("lv1") }, null, null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.TRY_BLOCK__RESOURCES); + } + + @Test + public void testResourceNullCheck() { + this.testSimilarityNullCheck(this.initElement(new Resource[] { this.createMinimalLV("lv1") }, null, null), + new TryBlockInitialiser(), false, StatementsPackage.Literals.TRY_BLOCK__RESOURCES); + } + + @Test + public void testCatchBlock() { + var objOne = this.initElement(null, new CatchBlock[] { this.createMinimalCB("p1", "t1") }, null); + var objTwo = this.initElement(null, new CatchBlock[] { this.createMinimalCB("p2", "t2") }, null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.TRY_BLOCK__CATCH_BLOCKS); + } + + @Test + public void testCatchBlockSize() { + var objOne = this.initElement(null, + new CatchBlock[] { this.createMinimalCB("p1", "t1"), this.createMinimalCB("p2", "t2") }, null); + var objTwo = this.initElement(null, new CatchBlock[] { this.createMinimalCB("p1", "t1") }, null); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.TRY_BLOCK__CATCH_BLOCKS); + } + + @Test + public void testCatchBlockNullCheck() { + this.testSimilarityNullCheck( + this.initElement(null, new CatchBlock[] { this.createMinimalCB("p1", "t1") }, null), + new TryBlockInitialiser(), false, StatementsPackage.Literals.TRY_BLOCK__CATCH_BLOCKS); + } + + @Test + public void testFinallyBlock() { + var objOne = this.initElement(null, null, this.createMinimalBlockWithNullReturn()); + var objTwo = this.initElement(null, null, this.createMinimalBlockWithTrivialAssert()); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.TRY_BLOCK__FINALLY_BLOCK); + } + + @Test + public void testFinallyBlockNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, null, this.createMinimalBlockWithNullReturn()), + new TryBlockInitialiser(), false, StatementsPackage.Literals.TRY_BLOCK__FINALLY_BLOCK); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TypeParameterTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TypeParameterTest.java new file mode 100644 index 0000000000..bb606d4bc9 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/TypeParameterTest.java @@ -0,0 +1,47 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.generics.GenericsPackage; +import org.emftext.language.java.generics.TypeParameter; +import org.emftext.language.java.types.TypeReference; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesNames; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesTypeReferences; +import cipm.consistency.initialisers.jamopp.generics.TypeParameterInitialiser; + +public class TypeParameterTest extends AbstractJaMoPPSimilarityTest implements UsesTypeReferences, UsesNames { + protected TypeParameter initElement(TypeReference[] extTypes) { + var tpInit = new TypeParameterInitialiser(); + var tp = tpInit.instantiate(); + Assertions.assertTrue(tpInit.setName(tp, this.getDefaultName())); + Assertions.assertTrue(tpInit.addExtendTypes(tp, extTypes)); + return tp; + } + + @Test + public void testExtendType() { + var objOne = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls2") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.TYPE_PARAMETER__EXTEND_TYPES); + } + + @Test + public void testExtendTypeSize() { + var objOne = this.initElement( + new TypeReference[] { this.createMinimalClsRef("cls1"), this.createMinimalClsRef("cls2") }); + var objTwo = this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }); + + this.testSimilarity(objOne, objTwo, GenericsPackage.Literals.TYPE_PARAMETER__EXTEND_TYPES); + } + + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void testExtendTypeNullCheck() { + this.testSimilarityNullCheck(this.initElement(new TypeReference[] { this.createMinimalClsRef("cls1") }), + new TypeParameterInitialiser(), false, GenericsPackage.Literals.TYPE_PARAMETER__EXTEND_TYPES); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/UnaryExpressionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/UnaryExpressionTest.java new file mode 100644 index 0000000000..518103f6aa --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/UnaryExpressionTest.java @@ -0,0 +1,57 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.ExpressionsPackage; +import org.emftext.language.java.expressions.UnaryExpression; +import org.emftext.language.java.expressions.UnaryExpressionChild; +import org.emftext.language.java.operators.UnaryOperator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.expressions.UnaryExpressionInitialiser; + +public class UnaryExpressionTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected UnaryExpression initElement(UnaryExpressionChild child, UnaryOperator[] ops) { + var ueInit = new UnaryExpressionInitialiser(); + var ue = ueInit.instantiate(); + Assertions.assertTrue(ueInit.setChild(ue, child)); + Assertions.assertTrue(ueInit.addOperators(ue, ops)); + return ue; + } + + @Test + public void testChild() { + this.testSimilarity(this.initElement(this.createDecimalIntegerLiteral(1), null), + this.initElement(this.createDecimalIntegerLiteral(2), null), + ExpressionsPackage.Literals.UNARY_EXPRESSION__CHILD); + } + + @Test + public void testChildNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1), null), + new UnaryExpressionInitialiser(), false, ExpressionsPackage.Literals.UNARY_EXPRESSION__CHILD); + } + + @Test + public void testOperator() { + this.testSimilarity(this.initElement(null, new UnaryOperator[] { this.createAdditionOperator() }), + this.initElement(null, new UnaryOperator[] { this.createSubtractionOperator() }), + ExpressionsPackage.Literals.UNARY_EXPRESSION__OPERATORS); + } + + @Test + public void testOperatorSize() { + this.testSimilarity( + this.initElement(null, + new UnaryOperator[] { this.createAdditionOperator(), this.createSubtractionOperator() }), + this.initElement(null, new UnaryOperator[] { this.createAdditionOperator() }), + ExpressionsPackage.Literals.UNARY_EXPRESSION__OPERATORS); + } + + @Test + public void testOperatorNullCheck() { + this.testSimilarityNullCheck(this.initElement(null, new UnaryOperator[] { this.createAdditionOperator() }), + new UnaryExpressionInitialiser(), false, ExpressionsPackage.Literals.UNARY_EXPRESSION__OPERATORS); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/YieldStatementTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/YieldStatementTest.java new file mode 100644 index 0000000000..41a2058ba5 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/YieldStatementTest.java @@ -0,0 +1,34 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; + +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.statements.StatementsPackage; +import org.emftext.language.java.statements.YieldStatement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesExpressions; +import cipm.consistency.initialisers.jamopp.statements.YieldStatementInitialiser; + +public class YieldStatementTest extends AbstractJaMoPPSimilarityTest implements UsesExpressions { + protected YieldStatement initElement(Expression yieldExpr) { + var ysInit = new YieldStatementInitialiser(); + var ys = ysInit.instantiate(); + Assertions.assertTrue(ysInit.setYieldExpression(ys, yieldExpr)); + return ys; + } + + @Test + public void testYieldExpression() { + var objOne = this.initElement(this.createDecimalIntegerLiteral(1)); + var objTwo = this.initElement(this.createDecimalIntegerLiteral(2)); + + this.testSimilarity(objOne, objTwo, StatementsPackage.Literals.YIELD_STATEMENT__YIELD_EXPRESSION); + } + + @Test + public void testYieldExpressionNullCheck() { + this.testSimilarityNullCheck(this.initElement(this.createDecimalIntegerLiteral(1)), + new YieldStatementInitialiser(), false, StatementsPackage.Literals.YIELD_STATEMENT__YIELD_EXPRESSION); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/package-info.java new file mode 100644 index 0000000000..a6ecf6918f --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/impltests/package-info.java @@ -0,0 +1,22 @@ +/** + * Contains unit tests for {@link EObject} types, which have a concrete + * implementation in form of a non-abstract class in the {@link Commentable} + * type hierarchy. In the said tests, {@link EObject} instances are constructed + * programmatically and are checked for similarity.
+ *
+ * The tests within this package are meant to be minimal and only to test + * similarity checking with respect to individual attributes of {@link EObject} + * instances, in an isolated fashion. This means, each test performs similarity + * checking on 2 {@link EObject} instances, whose attributes are equal except + * for one of them. This way, one can pinpoint basic similarity checking errors + * regarding certain attributes of certain {@link EObject} implementors.
+ *
+ * It is highly recommended to make the construction of the "main" + * {@link EObject} instances as obvious and visible as possible, as their + * construction can get complicated and not knowing all the construction steps + * can lead to tests not fulfilling their goal.
+ *
+ * See {@link cipm.consistency.fitests.similarity.jamopp.unittests} to find out + * more about what test methods do. + */ +package cipm.consistency.fitests.similarity.jamopp.unittests.impltests; \ No newline at end of file From 052e23b3208f6e39a85ca7f26efed1b6ca8bc532 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:59:11 +0100 Subject: [PATCH 81/87] Add advanced tests for JaMoPP-related similarity checking These tests aim to verify similarity checking of JaMoPP objects, whose construction is not as simple as those from "impltests" and "interfacetests". The cases addressed in these tests were separated from "impltests", because they each require a complicated setup, in order to cover certain branches of the similarity checking logic. IdentifierReferenceContainerTest is disabled till NPEs are fixed. --- .../DummyClassImplAndReference.java | 124 ++++++++ .../IdentifierReferenceContainerTest.java | 290 ++++++++++++++++++ .../complextests/MemberInContainerTest.java | 159 ++++++++++ .../complextests/StatementPositionTest.java | 210 +++++++++++++ .../unittests/complextests/package-info.java | 21 ++ 5 files changed, 804 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/DummyClassImplAndReference.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/IdentifierReferenceContainerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/MemberInContainerTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/StatementPositionTest.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/DummyClassImplAndReference.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/DummyClassImplAndReference.java new file mode 100644 index 0000000000..bb2f1c2203 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/DummyClassImplAndReference.java @@ -0,0 +1,124 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.complextests; + +import org.eclipse.emf.common.util.EList; +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.classifiers.impl.ClassImpl; +import org.emftext.language.java.generics.TypeArgument; +import org.emftext.language.java.references.IdentifierReference; +import org.emftext.language.java.references.Reference; +import org.emftext.language.java.references.ReferenceableElement; +import org.emftext.language.java.types.Type; +import org.emftext.language.java.types.TypeReference; + +/** + * A dummy class that implements both {@link ReferenceableElement} (via + * {@link ClassImpl}) and {@link Reference} interfaces. Can be used to test + * cases, where for an {@link IdentifierReference} instance {@code IR} the + * following holds:
+ *
+ * {@code IR.getNext() == IR.getTarget()}
+ *
+ * Currently there is no actual class used by JaMoPP, which implements both + * interfaces named above. This class was implemented to test for the mentioned + * scenario regardless, as references are very commonly used in programming and + * should therefore be extensively tested.
+ *
+ * This dummy class takes two {@link Reference} instances: It wraps and uses one + * of them for the method implementations needed by the {@link Reference} + * interface, except for the {@link #getPrevious()} method. The other + * {@link Reference} instance is the return value for the {@link #getPrevious()} + * method. This is necessary, as setting the previous attribute of a + * {@link Reference} instance directly is currently not possible.
+ *
+ * !!! IMPORTANT: This class is NOT a proper implementation of its + * super-types. The sole purpose of this class is to be used as a parameter for + * {@code IR.setNext(...)} and {@code IR.setTarget(...)} in tests !!! + * + * @author Alp Torac Genc + */ +public class DummyClassImplAndReference extends ClassImpl implements Reference { + private Reference innerRef; + private Reference prev; + + /** + * Constructs an instance. + * + * @param prev The return value of {@code this.}{@link #getPrevious()} + * @param innerRef The {@link Reference} instance, to whom the calls to methods + * required by the {@link Reference} interface will be + * delegated, except for {@link #getPrevious()}. + */ + public DummyClassImplAndReference(Reference prev, Reference innerRef) { + this.prev = prev; + this.innerRef = innerRef; + } + + @Override + public Type getAlternativeType() { + return innerRef.getAlternativeType(); + } + + @Override + public long getArrayDimension() { + return innerRef.getArrayDimension(); + } + + @Override + public Type getOneType(boolean arg0) { + return innerRef.getOneType(arg0); + } + + @Override + public TypeReference getOneTypeReference(boolean arg0) { + return innerRef.getOneTypeReference(arg0); + } + + @Override + public Type getType() { + return innerRef.getType(); + } + + @Override + public EList getTypeArguments() { + return innerRef.getTypeArguments(); + } + + @Override + public EList getActualTargets() { + return innerRef.getActualTargets(); + } + + @Override + public EList getArraySelectors() { + return innerRef.getArraySelectors(); + } + + @Override + public Reference getNext() { + return innerRef.getNext(); + } + + /** + * @return The parameter prev that was passed to the constructor. + * @see {@link DummyClassImplAndReference#DummyClassDecorator(Reference, Reference)} + */ + @Override + public Reference getPrevious() { + return prev; + } + + @Override + public Type getReferencedType() { + return innerRef.getReferencedType(); + } + + @Override + public TypeReference getReferencedTypeReference() { + return innerRef.getReferencedTypeReference(); + } + + @Override + public void setNext(Reference arg0) { + innerRef.setNext(arg0); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/IdentifierReferenceContainerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/IdentifierReferenceContainerTest.java new file mode 100644 index 0000000000..3216f97d8b --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/IdentifierReferenceContainerTest.java @@ -0,0 +1,290 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.complextests; + +import org.eclipse.emf.ecore.EObject; +import org.emftext.language.java.arrays.ArraySelector; +import org.emftext.language.java.expressions.Expression; +import org.emftext.language.java.references.IdentifierReference; +import org.emftext.language.java.references.ReferenceableElement; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesConcreteClassifiers; +import cipm.consistency.initialisers.jamopp.classifiers.ClassInitialiser; +import cipm.consistency.initialisers.jamopp.instantiations.ExplicitConstructorCallInitialiser; +import cipm.consistency.initialisers.jamopp.references.IdentifierReferenceInitialiser; +import cipm.consistency.initialisers.jamopp.references.StringReferenceInitialiser; +import cipm.consistency.initialisers.jamopp.statements.ExpressionStatementInitialiser; + +/** + * Contains tests for similarity checking {@link IdentifierReference} instances. + * These tests cover cases, which are not addressed in other, simpler tests. + * + * @author Alp Torac Genc + */ +@Disabled("Disabled till null pointer exceptions are fixed") +public class IdentifierReferenceContainerTest extends AbstractJaMoPPSimilarityTest implements UsesConcreteClassifiers { + /** + * Realises the functionality of + * {@code JaMoPPElementUtil.getFirstContainerNotOfGivenType(...)}
+ *
+ * Implementation of that method is copied into this method, since it cannot be + * accessed in the current project setup. + */ + protected EObject getFirstEligibleContainer(IdentifierReference ref) { + var currentContainer = ref.eContainer(); + + while (currentContainer != null + && (currentContainer instanceof Expression || currentContainer instanceof ArraySelector)) { + currentContainer = currentContainer.eContainer(); + } + + if (!(currentContainer instanceof Expression) && !(currentContainer instanceof ArraySelector)) { + return currentContainer; + } + + return null; + } + + /** + * Conditions here were copied from the + * {@code ReferencesSimilaritySwitch.caseIdentifierReference(...)} for the sake + * of testing.
+ *
+ * This method is used to determine, whether similarity checking will be + * performed on the containers of the target attribute of the given references. + * Since reaching the said state requires an advanced setup, it is important to + * know if it actually is reached. + * + * @return Whether the similarity of {@code refX.getTarget().eContainer()} will + * be computed, where X = {1, 2}. + */ + protected boolean isTargetContainerSimilarityCheckReached(IdentifierReference ref1, IdentifierReference ref2) { + var ref1Container = this.getFirstEligibleContainer(ref1); + var ref2Container = this.getFirstEligibleContainer(ref2); + + var target1 = ref1.getTarget(); + var target2 = ref2.getTarget(); + + EObject target1Container = null; + if (target1 != null) { + target1Container = target1.eContainer(); + } + + EObject target2Container = null; + if (target2 != null) { + target2Container = target2.eContainer(); + } + + return target1Container != ref1Container && target2Container != ref2Container && + + // refX cannot be null and there is currently no EObject implementor that can be + // the target of an IdentifierReference IR and have IR as its container. + // Currently impossible to break the following conditions with actual EObject + // implementors + target1Container != ref1 && target2Container != ref2; + } + + /** + * Nests an {@link ExpressionStatement} es instance within an + * {@link ExplicitConstructorCall} ecc instance and sets ref's container to ecc. + *
+ *
+ * Can be used to add a container to ref (as in {@code ref.eContainer()}).
+ *
+ * Note: ref's eligible container {@code this.getFirstEligibleContainer(ref)} + * will be es. This is ensured by assertions. + */ + protected void initialiseIdentifierReference(IdentifierReference ref) { + var insInit = new ExplicitConstructorCallInitialiser(); + var ecc = insInit.instantiate(); + Assertions.assertTrue(insInit.addArgument(ecc, ref)); + + var esInit = new ExpressionStatementInitialiser(); + var es = esInit.instantiate(); + Assertions.assertTrue(esInit.setExpression(es, ecc)); + + Assertions.assertEquals(ref.eContainer(), ecc); + Assertions.assertEquals(this.getFirstEligibleContainer(ref), es); + } + + /** + * Checks whether similarity checking works as intended as far as comparing the + * containers of both targets is concerned. Note that the said target containers + * will only be compared, if + * {@link #isTargetContainerSimilarityCheckReached(IdentifierReference, IdentifierReference)} + * returns true for both {@link IdentifierReference} instances.
+ *
+ * The said targets are accessed via + * {@code identifierReference.getTarget().eContainer()}
+ *
+ * This test method considers only the currently possible scenarios, where + * actual {@link EObject} implementors are used throughout the entire test. + */ + @Test + public void test_AllRealisticCases() { + var targetName = "cls1"; + var targetWCon1 = this.createMinimalClassifierWithCU(new ClassInitialiser(), targetName, "cu1"); + var targetWCon2 = this.createMinimalClassifierWithCU(new ClassInitialiser(), targetName, "cu2"); + var targetWOCon = this.createMinimalClass(targetName); + + // Ensure that the containers are set correctly + Assertions.assertNotNull(targetWCon1.eContainer()); + Assertions.assertNotNull(targetWCon2.eContainer()); + Assertions.assertFalse(this.getActualEquality(targetWCon1.eContainer(), targetWCon2.eContainer())); + Assertions.assertNull(targetWOCon.eContainer()); + + var objInit = new IdentifierReferenceInitialiser(); + + var objWCon = objInit.instantiate(); + this.initialiseIdentifierReference(objWCon); + + var objWOCon = objInit.instantiate(); + + var targetArr = new ReferenceableElement[] { targetWCon1, targetWCon2, targetWOCon }; + var objArr = new IdentifierReference[] { objWCon, objWOCon }; + + var targetCloneArr = new ReferenceableElement[targetArr.length]; + var objCloneArr = new IdentifierReference[objArr.length]; + + // Make sure that the clones also have containers, if the + // original object had one. + + for (int i = 0; i < targetArr.length; i++) { + targetCloneArr[i] = this.cloneEObjWithContainers(targetArr[i]); + Assertions.assertTrue(this.getActualEquality(targetArr[i], targetCloneArr[i])); + } + + for (int i = 0; i < objArr.length; i++) { + objCloneArr[i] = this.cloneEObjWithContainers(objArr[i]); + Assertions.assertTrue(this.getActualEquality(objArr[i], objCloneArr[i])); + } + + // Test for all possible realistic container situations of identifier reference + // instances and that of their target + for (var targetOne : targetArr) { + for (var targetTwo : targetCloneArr) { + for (var objOne : objArr) { + for (var objTwo : objCloneArr) { + Assertions.assertTrue(this.getActualEquality(targetOne, targetTwo)); + Assertions.assertTrue(objInit.setTarget(objOne, targetOne)); + Assertions.assertTrue(objInit.setTarget(objTwo, targetTwo)); + + var expectedResult = !this.isTargetContainerSimilarityCheckReached(objOne, objTwo) + || this.isSimilar(targetOne.eContainer(), targetTwo.eContainer()); + + this.testSimilarity(objOne, objTwo, expectedResult); + } + } + } + } + } + + /** + * Checks whether similarity checking works as intended as far as comparing the + * containers of both targets is concerned. Note that the said target containers + * will only be compared, if + * {@link #isTargetContainerSimilarityCheckReached(IdentifierReference, IdentifierReference)} + * returns true for both {@link IdentifierReference} instances.
+ *
+ * The said targets are accessed via + * {@code identifierReference.getTarget().eContainer()}
+ *
+ * This test method tackles the case, where two {@link IdentifierReference} + * instances IR_1 and IR_2 each have their target as their next: + * {@code IR_i.getTarget() == IR_i.getNext()}
+ *
+ * Currently, this case is not realistic. + */ + @Test + public void test_TargetEqualsNext_InBothRefs() { + var objInit = new IdentifierReferenceInitialiser(); + var objOne = objInit.instantiate(); + + var objTwo = objInit.instantiate(); + + var targetOne = new DummyClassImplAndReference(objOne, new StringReferenceInitialiser().instantiate()); + var targetTwo = new DummyClassImplAndReference(objTwo, new StringReferenceInitialiser().instantiate()); + + Assertions.assertTrue(objInit.setTarget(objOne, targetOne)); + Assertions.assertTrue(objInit.setNext(objOne, (DummyClassImplAndReference) targetOne)); + + Assertions.assertTrue(objInit.setTarget(objTwo, targetTwo)); + Assertions.assertTrue(objInit.setNext(objTwo, (DummyClassImplAndReference) targetTwo)); + + /* + * Make sure that: + * + * targetOne.eContainer() != objOne.eContainer() && targetTwo.eContainer() != + * objTwo.eContainer() && targetOne.eContainer() == objOne && + * targetTwo.eContainer() == objTwo + */ + Assertions.assertNull(objOne.eContainer()); + Assertions.assertNull(objTwo.eContainer()); + Assertions.assertEquals(targetOne.eContainer(), objOne); + Assertions.assertEquals(targetTwo.eContainer(), objTwo); + Assertions.assertTrue(this.getActualEquality(targetOne, targetTwo)); + Assertions.assertFalse(this.isTargetContainerSimilarityCheckReached(objOne, objTwo)); + + // Swap parameter positions to make sure that the symmetry of similarity + // checking is asserted + Assertions.assertTrue(this.isSimilar(objOne, objTwo)); + Assertions.assertTrue(this.isSimilar(objTwo, objOne)); + } + + /** + * Checks whether similarity checking works as intended as far as comparing the + * containers of both targets is concerned. Note that the said target containers + * will only be compared, if + * {@link #isTargetContainerSimilarityCheckReached(IdentifierReference, IdentifierReference)} + * returns true for both {@link IdentifierReference} instances.
+ *
+ * The said targets are accessed via + * {@code identifierReference.getTarget().eContainer()}
+ *
+ * This test method tackles the case, where one {@link IdentifierReference} + * instance IR_1 has its target as its next: + * {@code IR_1.getTarget() == IR_1.getNext()}. In this case, IR_2 only has its + * target set: {@code IR_2.getTarget() != null && IR_2.getNext() == null}
+ *
+ * Currently, this case is not realistic. + */ + @Test + public void test_TargetEqualsNext_InOneRef() { + var objInit = new IdentifierReferenceInitialiser(); + + var objOne = objInit.instantiate(); + var objTwo = objInit.instantiate(); + + var targetOne = new DummyClassImplAndReference(objOne, new StringReferenceInitialiser().instantiate()); + var targetTwo = new DummyClassImplAndReference(objTwo, new StringReferenceInitialiser().instantiate()); + + Assertions.assertTrue(objInit.setTarget(objOne, targetOne)); + Assertions.assertTrue(objInit.setNext(objOne, (DummyClassImplAndReference) targetOne)); + + // Only set targetTwo as target in objTwo and not also as next, since that will + // make objTwo its container + Assertions.assertTrue(objInit.setTarget(objTwo, targetTwo)); + + /* + * Make sure that: + * + * targetOne.eContainer() != objOne.eContainer() && targetTwo.eContainer() != + * objTwo.eContainer() && targetOne.eContainer() == objOne && + * targetTwo.eContainer() != objTwo + */ + Assertions.assertNull(objOne.eContainer()); + Assertions.assertNull(objTwo.eContainer()); + Assertions.assertEquals(targetOne.eContainer(), objOne); + Assertions.assertNotEquals(targetTwo.eContainer(), objTwo); + Assertions.assertTrue(this.getActualEquality(targetOne, targetTwo)); + Assertions.assertFalse(this.isTargetContainerSimilarityCheckReached(objOne, objTwo)); + + // Swap parameter positions to make sure that the symmetry of similarity + // checking is asserted + // objX.getNext() matters for similarity checking + Assertions.assertFalse(this.isSimilar(objOne, objTwo)); + Assertions.assertFalse(this.isSimilar(objTwo, objOne)); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/MemberInContainerTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/MemberInContainerTest.java new file mode 100644 index 0000000000..8c7bbfd202 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/MemberInContainerTest.java @@ -0,0 +1,159 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.complextests; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import org.emftext.language.java.members.MembersPackage; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.params.JaMoPPInitialiserParameters; +import cipm.consistency.initialisers.jamopp.members.IMemberContainerInitialiser; +import cipm.consistency.initialisers.jamopp.members.IMemberInitialiser; + +/** + * Tests whether {@link MemberContainer} implementors' similarity is computed as + * expected, if they contain different types of {@link Member} instances. + * {@link Member} instances are added as members to {@link MemberContainer}s in + * some tests and as default members in tests in others.
+ *
+ * There are differences between this test class and the + * {@link cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests.MemberContainerTest}. + * This test class checks the similarity of 2 {@link MemberContainer} instances + * of the same type but with varying {@link Member} instances. The latter only + * tests the similarity of {@link MemberContainer} instances of the same type + * with the same {@link Member} instances.
+ *
+ * This test class is overshadowed by neither + * {@link cipm.consistency.fitests.similarity.jamopp.unittests.impltests} nor + * {@link cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests}, + * because the type of the {@link MemberContainer} containing a certain + * {@link Member} can indirectly influence the similarity checking result of + * both {@link MemberContainer} instances and {@link Member} instances (via + * qualified name differences for instance). + * + * @author Alp Torac Genc + */ +public class MemberInContainerTest extends AbstractJaMoPPSimilarityTest { + /** + * @return A list of all initialisers that implement {@link IMemberInitialiser}. + * If an initialiser is adaptable, it will be adapted. Non-adaptable + * initialisers will be unaffected. + */ + private static List getAllMemberInitInstances() { + var res = new ArrayList(); + var inits = new JaMoPPInitialiserParameters().getEachInitialiserOnceBySuper(IMemberInitialiser.class); + inits.forEach((i) -> res.add(((IMemberInitialiser) i))); + return res; + } + + /** + * @return A list of all initialisers that implement + * {@link IMemberContainerInitialiser}. If an initialiser is adaptable, + * it will be adapted. Non-adaptable initialisers will be unaffected. + */ + private static List getAllMemberContainerInitInstances() { + var res = new ArrayList(); + var inits = new JaMoPPInitialiserParameters().getEachInitialiserOnceBySuper(IMemberContainerInitialiser.class); + inits.forEach((i) -> res.add(((IMemberContainerInitialiser) i))); + return res; + } + + /** + * @return Parameters for the test methods in this test class. Refer to their + * documentation for more information. + */ + private static Stream getMemConMemPairs() { + var res = new ArrayList(); + + for (var memConInit : getAllMemberContainerInitInstances()) { + for (var memInit1 : getAllMemberInitInstances()) { + for (var memInit2 : getAllMemberInitInstances()) { + var displayName = memInit1.getClass().getSimpleName() + " - " + memInit2.getClass().getSimpleName() + + " in " + memConInit.getClass().getSimpleName(); + res.add(Arguments.of(displayName, memConInit, memInit1, memInit2)); + } + } + } + + return res.stream(); + } + + /** + * Tests whether 2 {@link MemberContainer} instances of the same type are + * considered to be similar, if certain {@link Member} instances are added to + * them as ordinary members ({@code via memConInit.addMember(member)}). + * + * @param displayName The display name of the test + * @param memConInit The initialiser that will be used to instantiate both + * member containers + * @param memInit1 The member that will be added to the first member + * container instance (as ordinary member) + * @param memInit2 The member that will be added to the second member + * container instance (as ordinary member) + */ + @ParameterizedTest(name = "{0}") + @MethodSource("getMemConMemPairs") + public void testMembersInContainers(String displayName, IMemberContainerInitialiser memConInit, + IMemberInitialiser memInit1, IMemberInitialiser memInit2) { + var mem1 = memInit1.instantiate(); + var mem2 = memInit2.instantiate(); + + var memCon1 = memConInit.instantiate(); + Assertions.assertTrue(memConInit.initialise(memCon1)); + var memCon2 = memConInit.instantiate(); + Assertions.assertTrue(memConInit.initialise(memCon2)); + + this.assertSimilarityResult(memCon1, memCon2, true); + + Assertions.assertTrue(memConInit.addMember(memCon1, mem1)); + Assertions.assertTrue(memConInit.addMember(memCon2, mem2)); + + this.assertSimilarityResult(memCon1, memCon2, + mem1.getClass().equals(mem2.getClass()) || (this.getExpectedSimilarityResult(memCon1.getClass(), + MembersPackage.Literals.MEMBER_CONTAINER__MEMBERS) + && this.getExpectedSimilarityResult(memCon2.getClass(), + MembersPackage.Literals.MEMBER_CONTAINER__MEMBERS))); + } + + /** + * Tests whether 2 {@link MemberContainer} instances of the same type are + * considered to be similar, if certain {@link Member} instances are added to + * them as default members ({@code via memConInit.addDefaultMember(member)}). + * + * @param displayName The display name of the test + * @param memConInit The initialiser that will be used to instantiate both + * member containers + * @param memInit1 The member that will be added to the first member + * container instance (as default member) + * @param memInit2 The member that will be added to the second member + * container instance (as default member) + */ + @ParameterizedTest(name = "{0}") + @MethodSource("getMemConMemPairs") + public void testDefaultMembersInContainers(String displayName, IMemberContainerInitialiser memConInit, + IMemberInitialiser memInit1, IMemberInitialiser memInit2) { + var mem1 = memInit1.instantiate(); + var mem2 = memInit2.instantiate(); + + var memCon1 = memConInit.instantiate(); + Assertions.assertTrue(memConInit.initialise(memCon1)); + var memCon2 = memConInit.instantiate(); + Assertions.assertTrue(memConInit.initialise(memCon2)); + + this.assertSimilarityResult(memCon1, memCon2, true); + + Assertions.assertTrue(memConInit.addDefaultMember(memCon1, mem1)); + Assertions.assertTrue(memConInit.addDefaultMember(memCon2, mem2)); + + this.assertSimilarityResult(memCon1, memCon2, + mem1.getClass().equals(mem2.getClass()) || (this.getExpectedSimilarityResult(memCon1.getClass(), + MembersPackage.Literals.MEMBER_CONTAINER__DEFAULT_MEMBERS) + && this.getExpectedSimilarityResult(memCon2.getClass(), + MembersPackage.Literals.MEMBER_CONTAINER__DEFAULT_MEMBERS))); + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/StatementPositionTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/StatementPositionTest.java new file mode 100644 index 0000000000..aeda8611b9 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/StatementPositionTest.java @@ -0,0 +1,210 @@ +package cipm.consistency.fitests.similarity.jamopp.unittests.complextests; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import org.emftext.language.java.statements.ExpressionStatement; +import org.emftext.language.java.statements.LocalVariableStatement; +import org.emftext.language.java.statements.Statement; +import org.emftext.language.java.statements.SynchronizedBlock; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.fitests.similarity.jamopp.params.JaMoPPInitialiserParameters; +import cipm.consistency.fitests.similarity.jamopp.unittests.UsesStatements; +import cipm.consistency.initialisers.jamopp.statements.IStatementInitialiser; +import cipm.consistency.initialisers.jamopp.statements.IStatementListContainerInitialiser; + +/** + * Tests whether similarity checking works as intended for {@link Statement} + * instances, which are contained in {@link StatementListContainer} instances. + * Since testing that requires setup effort that goes beyond simplistic tests, + * it is done here.
+ *
+ * Tests are parameterised over all possible combinations of + * {@link StatementListContainer} and {@link Statement} implementors. + * + * @author Alp Torac Genc + */ +public class StatementPositionTest extends AbstractJaMoPPSimilarityTest implements UsesStatements { + /** + * @return A list of all initialisers that implement + * {@link IStatementListContainerInitialiser}. If an initialiser is + * adaptable, it will be adapted. Non-adaptable initialisers will be + * unaffected. + */ + private static List getAllSLCInitInstances() { + var res = new ArrayList(); + var inits = new JaMoPPInitialiserParameters() + .getEachInitialiserOnceBySuper(IStatementListContainerInitialiser.class); + inits.forEach((i) -> res.add(((IStatementListContainerInitialiser) i))); + return res; + } + + /** + * @return A list of all initialisers that implement + * {@link IStatementInitialiser}. If an initialiser is adaptable, it + * will be adapted. Non-adaptable initialisers will be unaffected. + */ + private static List getAllStatementInitInstances() { + var res = new ArrayList(); + var inits = new JaMoPPInitialiserParameters().getEachInitialiserOnceBySuper(IStatementInitialiser.class); + inits.forEach((i) -> res.add(((IStatementInitialiser) i))); + return res; + } + + /** + * The return value of this method was derived from the implementation of the + * current similarity checker. + * + * @return Whether the position of an instance of the given class within its + * container matters. + */ + private static Boolean doesStatementPositionMatter(Class cls) { + return ExpressionStatement.class.isAssignableFrom(cls) || LocalVariableStatement.class.isAssignableFrom(cls) + || SynchronizedBlock.class.isAssignableFrom(cls); + } + + /** + * @return Parameters for the test methods in this test class. Refer to their + * documentation for more information. + */ + private static Stream genTestParams() { + var res = new ArrayList(); + + for (var stInit : getAllStatementInitInstances()) { + for (var slcInit : getAllSLCInitInstances()) { + var displayName = stInit.getClass().getSimpleName() + " in " + slcInit.getClass().getSimpleName(); + + res.add(Arguments.of(displayName, slcInit, stInit)); + } + } + + return res.stream(); + } + + /** + * Tests if similar {@link Statement} instances contained by their respective + * {@link StatementListContainer} instance are similar, provided they are + * contained in the same order. + * + * @param displayName The display name of the test + * @param containerInit The initialiser that will be used to instantiate the + * statement list container + * @param containeeInit The initialiser that will be used to instantiate the + * statement that will be added to the constructed + * container + */ + @ParameterizedTest(name = "{0}") + @MethodSource("genTestParams") + public void testSameStatementPosition(String displayName, IStatementListContainerInitialiser containerInit, + IStatementInitialiser containeeInit) { + var slc1 = containerInit.instantiate(); + Assertions.assertTrue(containerInit.initialise(slc1)); + var slc2 = containerInit.instantiate(); + Assertions.assertTrue(containerInit.initialise(slc2)); + + var lv1name = "lv1"; + var lv2name = "lv2"; + + // Use 3 statements to make sure that there is always a predecessor and a + // successor for the statement generated by containeeInit + + var st11 = this.createMinimalLVS(lv1name); + var st12 = containeeInit.instantiate(); + var st13 = this.createMinimalLVS(lv2name); + + // Make sure that the surrounding statements are not similar + this.assertSimilarityResult(st11, st13, false); + var sts1 = new Statement[] { st11, st12, st13 }; + + var st21 = this.cloneEObj(st11); + var st22 = this.cloneEObj(st12); + var st23 = this.cloneEObj(st13); + + // Make sure that clones of surrounding statements are not similar + this.assertSimilarityResult(st21, st23, false); + var sts2 = new Statement[] { st21, st22, st23 }; + + Assertions.assertTrue(containerInit.addStatements(slc1, sts1)); + Assertions.assertTrue(containerInit.addStatements(slc2, sts2)); + + // Since similar statements are added in the same order, they are similar, if + // their position within the respective arrays is the same + for (int i = 0; i < sts1.length; i++) { + for (int j = 0; j < sts2.length; j++) { + var st1 = sts1[i]; + var st2 = sts2[j]; + + this.assertSimilarityResult(st1, st2, i == j); + } + } + } + + /** + * Tests if similar {@link Statement} instances contained by their respective + * {@link StatementListContainer} instance are not similar, provided their order + * within their container differ. + * + * @param displayName The display name of the test + * @param containerInit The initialiser that will be used to instantiate the + * statement list container + * @param containeeInit The initialiser that will be used to instantiate the + * statement that will be added to the constructed + * container + */ + @ParameterizedTest + @MethodSource("genTestParams") + public void testDifferentStatementPosition(String displayName, IStatementListContainerInitialiser containerInit, + IStatementInitialiser containeeInit) { + var containeeCls = containeeInit.instantiate().getClass(); + + var slc1 = containerInit.instantiate(); + Assertions.assertTrue(containerInit.initialise(slc1)); + var slc2 = containerInit.instantiate(); + Assertions.assertTrue(containerInit.initialise(slc2)); + + var lv1name = "lv1"; + var lv2name = "lv2"; + + // Use 3 statements to make sure that there is always a predecessor and a + // successor for the statement generated by containeeInit + + var st11 = this.createMinimalLVS(lv1name); + var st12 = containeeInit.instantiate(); + var st13 = this.createMinimalLVS(lv2name); + + // Make sure that the surrounding statements are not similar + this.assertSimilarityResult(st11, st13, false); + var sts1 = new Statement[] { st11, st12, st13 }; + + var st21 = this.cloneEObj(st11); + var st22 = this.cloneEObj(st12); + var st23 = this.cloneEObj(st13); + + // Make sure that clones of surrounding statements are not similar + this.assertSimilarityResult(st21, st23, false); + var sts2 = new Statement[] { st23, st22, st21 }; + + Assertions.assertTrue(containerInit.addStatements(slc1, sts1)); + Assertions.assertTrue(containerInit.addStatements(slc2, sts2)); + + // Since similar statements are added in the reverse order, only the statements + // generated by containeeInit are similar, if similarity checking ignores their + // positioning within their container. The order of the surrounding st variables + // never match and they are not similar, as asserted above. + for (int i = 0; i < sts1.length; i++) { + for (int j = 0; j < sts2.length; j++) { + var st1 = sts1[i]; + var st2 = sts2[j]; + + this.assertSimilarityResult(st1, st2, containeeCls.isAssignableFrom(st1.getClass()) + && containeeCls.isAssignableFrom(st2.getClass()) && !doesStatementPositionMatter(containeeCls)); + } + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/package-info.java new file mode 100644 index 0000000000..3e96529b1e --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/complextests/package-info.java @@ -0,0 +1,21 @@ +/** + * Contains unit tests for {@link EObject} classes/interfaces within JaMoPP. In + * the said tests, {@link EObject} instances are constructed programmatically + * and are checked for similarity.
+ *
+ * The tests within this package are meant to test more advanced cases, which + * are not covered in + * {@link cipm.consistency.fitests.similarity.jamopp.unittests.impltests} or + * {@link cipm.consistency.fitests.similarity.jamopp.unittests.interfacetests}. + * Such cases involve multiple attributes of 2 {@link EObject} instances being + * different and/or more advanced test setup. + * + * TODO Add complex tests for AdditionalField (once the missing case methods are + * added) + * + * TODO Add complex tests for LocalVariableStatement with container Variable + * + * TODO Look for further complex test cases (once the missing case methods are + * added) + */ +package cipm.consistency.fitests.similarity.jamopp.unittests.complextests; \ No newline at end of file From 19f5d16f07568d02e99e934174f6739585e474c9 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 19:59:25 +0100 Subject: [PATCH 82/87] Add package commentary --- .../jamopp/unittests/package-info.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/package-info.java new file mode 100644 index 0000000000..8752dcd7c2 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/unittests/package-info.java @@ -0,0 +1,41 @@ +/** + * Contains interfaces that can be implemented by tests, where initialisers are + * used to instantiate {@link EObject} implementors present in JaMoPP. Each + * initialiser in this package offers default methods that help encapsulate the + * creation of such EObject instances, which are needed in tests.
+ *
+ * It is recommended to only use the interfaces in this package to instantiate + * EObject instances that are needed to setup the "main" EObject instances under + * test (i.e. instances used in similarity checking methods). The creation of + * the "main" EObject instances should be done within the corresponding test + * class explicitly via initialisers, in order to avoid implicit steps as much + * as possible.
+ *
+ * While adding further interfaces to this package, it is suggested to check the + * existing interfaces and to extend them, if possible. Doing so will help keep + * consistency across test cases.
+ *
+ * The sub-packages of this package contain unit tests for EObject + * classes/interfaces using initialisers. For each attribute X of EObject + * implementor/interface EO, there are currently up to 3 test categories. Let + * eo1 and eo2 be instances of type EO, then test categories do the following: + *

    + *
  • testX: Performs similarity checking on eo1 and eo2, whose + * attributes are all equal except for X, and checks the result. + *
  • testXSize: Same as testX, where X's value is an array and the + * corresponding arrays in eo1 and eo2 contain different amounts of elements: X + * of one eo contains 2 elements elem1 and elem2 (elem1 and elem2 are NOT + * similar), whereas the X of other eo only contains elem1. These test methods + * make sure that array-valued attributes are compared accordingly. + *
  • testXNullCheck: Same as testX, where eo1's X attribute is set and + * eo2's X attribute is not. These test methods ensure that no exceptions are + * thrown while performing similarity checking on EObject instances that are not + * initialised properly. + *
+ * Note that multiple similarity checks are performed in each test, in order + * to ensure that similarity checking is symmetric and that similarity checking + * yields the same result, if the EObject instances are cloned. Refer to the + * documentation of the similarity checking methods concrete test methods use + * for more information. + */ +package cipm.consistency.fitests.similarity.jamopp.unittests; \ No newline at end of file From a0460ef35bafe211446a68ad6cd586c8b1daad54 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 20:02:38 +0100 Subject: [PATCH 83/87] Add a "meta-test" It ensures that each JaMoPP object has a test class (as a Java source file) and that the initialiser of each JaMoPP object type can be accessed from tests. Adding such a meta-test was necessary, due to the vast number of JaMoPP object types and their complicated type hierarchy. --- .../jamopp/utiltests/UtilityTests.java | 129 ++++++++++++++++++ .../jamopp/utiltests/package-info.java | 5 + 2 files changed, 134 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/UtilityTests.java create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/UtilityTests.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/UtilityTests.java new file mode 100644 index 0000000000..a00994bc76 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/UtilityTests.java @@ -0,0 +1,129 @@ +package cipm.consistency.fitests.similarity.jamopp.utiltests; + +import java.io.File; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.List; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import cipm.consistency.fitests.similarity.jamopp.AbstractJaMoPPSimilarityTest; +import cipm.consistency.initialisers.IInitialiser; +import cipm.consistency.initialisers.jamopp.IJaMoPPUtilityTest; + +/** + * A test class, whose tests can be used to make sure no initialiser interfaces, + * concrete initialisers or initialiser tests are missing. + * + * @author Alp Torac Genc + */ +public class UtilityTests extends AbstractJaMoPPSimilarityTest implements IJaMoPPUtilityTest { + /** + * Points at the parent package. Used by discovering methods in this class. + */ + private static final File root = new File(Paths + .get(new File("").toPath().toString(), "src", UtilityTests.class.getPackageName() + .substring(0, UtilityTests.class.getPackageName().lastIndexOf(".")).replace(".", File.separator)) + .toAbsolutePath().toUri()); + + /** + * The suffix used in tests. + */ + private static final String testSuffix = "Test"; + + /** + * @return The name of the test corresponding to cls. + */ + public String getTestName(Class cls) { + return cls.getSimpleName() + testSuffix; + } + + /** + * @return A list of all files under {@link #root}. + */ + public Collection getAllFiles() { + return this.getAllFiles(root); + } + + /** + * Checks if all necessary concrete initialisers can be accessed under the used + * initialiser package, which is used in initialiser tests.
+ *
+ * Prints the amount of accessible/registered initialiser types. The missing + * types can be found in the assertion message. + */ + @Test + public void testAllConcreteInitialisersRegistered() { + var clss = this.getAllConcreteInitialiserCandidates(); + var registeredInits = this.getUsedInitialiserPackage().getAllInitialiserInstances(); + + var matches = List.of( + clss.stream().filter((cls) -> registeredInits.stream().anyMatch((init) -> init.isInitialiserFor(cls))) + .toArray(Class[]::new)); + + this.getLogger().info(matches.size() + " out of " + clss.size() + " concrete initialisers are registered"); + + if (matches.size() != clss.size()) { + Assertions.fail("Concrete initialisers not registered: " + + this.clsStreamToString(clss.stream().filter((cls) -> !matches.contains(cls)))); + } + } + + /** + * Checks if all necessary initialiser interface types can be accessed under the + * used initialiser package, which is used in initialiser tests.
+ *
+ * Prints the amount of accessible/registered initialiser interface types. The + * missing types can be found in the assertion message. + */ + @Test + public void testAllInitialiserInterfacesRegistered() { + var clss = this.getAllInitialiserCandidates(); + var registeredInits = this.getUsedInitialiserPackage().getAllInitialiserInterfaceTypes(); + + var matches = List.of(clss.stream() + .filter((cls) -> registeredInits.stream() + .anyMatch((init) -> this.getInitialiserInterfaceName(cls).equals(init.getSimpleName()))) + .toArray(Class[]::new)); + + this.getLogger().info(matches.size() + " out of " + clss.size() + " initialiser interfaces are registered"); + + if (matches.size() != clss.size()) { + Assertions.fail("Initialiser interfaces not registered: " + + this.clsStreamToString(clss.stream().filter((cls) -> !matches.contains(cls)))); + } + } + + /** + * Checks if all classes in the need of an initialiser, which have their own + * methods that modify them (the methods they do not get from inheritance), have + * their corresponding test file.
+ *
+ * In short, checks if all necessary initialiser test files are present.
+ *
+ * Prints the number of required test files that are actually present. + * Information on the missing test files can be found in the assertion message. + *
+ *
+ * Only checks whether there are corresponding test files. Does not check + * the unit tests they implement. + */ + @Test + public void testAllInterfaceTestsPresent() { + var intfcs = this.getAllInitialiserCandidates(); + var allFiles = this.getAllFiles(); + + var matches = List.of(intfcs.stream() + .filter((c) -> !IInitialiser.declaresModificationMethods(this.getInitialiserInterfaceFor(c)) + || allFiles.stream().anyMatch((tf) -> fileNameEquals(tf, getTestName(c)))) + .toArray(Class[]::new)); + + this.getLogger().info(matches.size() + " out of " + intfcs.size() + " interfaces are covered by tests"); + + if (matches.size() != intfcs.size()) { + Assertions.fail("Tests missing for: " + + this.clsStreamToString(intfcs.stream().filter((e) -> !matches.contains(e)))); + } + } +} diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/package-info.java new file mode 100644 index 0000000000..7f61f646ce --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/utiltests/package-info.java @@ -0,0 +1,5 @@ +/** + * Contains "meta-tests" that check whether other tests are setup properly, + * rather than testing similarity checking. + */ +package cipm.consistency.fitests.similarity.jamopp.utiltests; \ No newline at end of file From a5c12d83679c22c093a18aef55fdc8ae991e96c3 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 20:07:17 +0100 Subject: [PATCH 84/87] Add general tests for JaMoPP-related similarity checking This test class focuses on testing the control flow of the similarity checking process at a high-level. This way, it covers some edge cases that are not addressed in the "unittests". Some general tests are disabled till NPEs are fixed. --- .../jamopp/GeneralJaMoPPSimilarityTest.java | 595 ++++++++++++++++++ 1 file changed, 595 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/GeneralJaMoPPSimilarityTest.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/GeneralJaMoPPSimilarityTest.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/GeneralJaMoPPSimilarityTest.java new file mode 100644 index 0000000000..aff61aa660 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/GeneralJaMoPPSimilarityTest.java @@ -0,0 +1,595 @@ +package cipm.consistency.fitests.similarity.jamopp; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import org.eclipse.emf.ecore.EObject; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import cipm.consistency.initialisers.IInitialiserBase; +import cipm.consistency.initialisers.jamopp.IJaMoPPEObjectInitialiser; +import cipm.consistency.initialisers.jamopp.containers.ModuleInitialiser; +import cipm.consistency.initialisers.jamopp.containers.PackageInitialiser; + +import org.emftext.language.java.containers.Module; + +/** + * A test class dedicated to test the general control flow of similarity + * checking.
+ *
+ * Also contains some tests for lists, from which some abstract from + * {@link EObject} instances, whereas others make use of {@link Module} + * instances, as they can easily be compared after their name + * ({@code module.getName()}). + * + * @author Alp Torac Genc + */ +public class GeneralJaMoPPSimilarityTest extends AbstractJaMoPPSimilarityTest { + /** + * Provides all non-adapted versions of {@link IJaMoPPEObjectInitialiser} + * implementors. + */ + private static Stream provideNonAdaptedInitialisers() { + return AbstractJaMoPPSimilarityTest.getNonAdaptedInitialiserArgumentsFor(IJaMoPPEObjectInitialiser.class); + } + + /** + * Provides all adapted versions of {@link IJaMoPPEObjectInitialiser} + * implementors. + */ + private static Stream provideAdaptedInitialisers() { + return AbstractJaMoPPSimilarityTest.getAdaptedInitialiserArgumentsFor(IJaMoPPEObjectInitialiser.class); + } + + /** + * Provides all versions of {@link IJaMoPPEObjectInitialiser} implementors. + */ + private static Stream provideAllInitialisers() { + return AbstractJaMoPPSimilarityTest.getAllInitialiserArgumentsFor(IJaMoPPEObjectInitialiser.class); + } + + /** + * Provides one instance of each {@link IJaMoPPEObjectInitialiser} implementor. + * The initialiser instance will be adapted, if possible. + */ + private static Stream provideEachInitialiserOnce() { + return AbstractJaMoPPSimilarityTest.getEachInitialiserArgumentsOnceFor(IJaMoPPEObjectInitialiser.class); + } + + /** + * @return An empty, immutable list + */ + private List toList() { + return List.of(); + } + + /** + * @return An immutable list containing the given elements + */ + private List toList(EObject... eos) { + return List.of(eos); + } + + /** + * Instantiates an object using init, initialises that object and returns it. + * Asserts that the initialisation is successful. + */ + private EObject instantiateAndInitialise(IJaMoPPEObjectInitialiser init) { + var obj = init.instantiate(); + Assertions.assertTrue(init.initialise(obj)); + return obj; + } + + /** + * @return A mutable list with a single null element. + */ + private List makeListWithSingleNullElement() { + var list = new ArrayList(); + list.add(null); + + // Make sure that the null element is in the list + Assertions.assertEquals(1, list.size()); + Assertions.assertNull(list.get(0)); + + return list; + } + + /** + * A variant of {@link #assertAreSimilar(List, List, Boolean)}, where the last + * parameter is true. + */ + private void assertAreSimilar(List eos1, List eos2) { + this.assertAreSimilar(eos1, eos2, Boolean.TRUE); + } + + /** + * Makes the following assertions: + * + *
    + *
  • The similarity value of both lists with respect to + * {@link #areSimilar(java.util.Collection, java.util.Collection)} is + * expectedResult. + *
  • The object within the lists are pairwise similar with respect to + * {@link #isSimilar(Object, Object)}, if expectedResult is true. Otherwise + * asserts that there is at least one pair, which is not similar. + *
  • The similarity checking is symmetrical, meaning that changing positions + * of parameters within similarity checking methods has no effect on the result. + *
+ */ + private void assertAreSimilar(List eos1, List eos2, Boolean expectedResult) { + Assertions.assertEquals(expectedResult, this.areSimilar(eos1, eos2)); + Assertions.assertEquals(expectedResult, this.areSimilar(eos2, eos1), "areSimilar is not symmetric"); + + if (eos1 != null && eos2 != null) { + int size = eos1.size() == eos2.size() ? eos1.size() : -1; + + if (expectedResult.booleanValue()) { + // Ensure that the objects are pairwise similar as well + for (int i = 0; i < size; i++) { + this.assertIsSimilar(eos1.get(i), eos2.get(i)); + } + } else if (size > 0) { + // Ensure that there is at least one object pair that is not similar, if list + // sizes are equal yet they not similar + for (int i = 0; i < size; i++) { + var eo1 = eos1.get(i); + var eo2 = eos2.get(i); + + var res1 = this.isSimilar(eo1, eo2); + var res2 = this.isSimilar(eo2, eo1); + + Assertions.assertEquals(res1, res2, "isSimilar checking is not symmetric"); + if (res1 == Boolean.FALSE) { + return; + } + } + Assertions.fail("areSimilar returns false, even though all objects are pairwise similar"); + } + } + } + + /** + * A variant of {@link #assertIsSimilar(EObject, EObject, Boolean)}, where the + * last parameter is true. + */ + private void assertIsSimilar(EObject obj1, EObject obj2) { + this.assertIsSimilar(obj1, obj2, Boolean.TRUE); + } + + /** + * Asserts that similarity checking obj1 and obj2 results in expectedResult. + * Additionally asserts that similarity checking is symmetrical, meaning that + * changing positions of obj1 and obj2 inside the similarity checking method has + * no effect on the result. + */ + private void assertIsSimilar(EObject obj1, EObject obj2, Boolean expectedResult) { + var res1 = this.isSimilar(obj1, obj2); + var res2 = this.isSimilar(obj2, obj1); + + // FIXME: Remove the null check and deal with the cause of the issues + + if (expectedResult == null || (res1 != null && res2 != null)) { + Assertions.assertEquals(expectedResult, res1); + Assertions.assertEquals(expectedResult, res2, "isSimilar is not symmetric"); + } else { + this.getLogger().warn("isSimilar returned null"); + } + } + + /** + * Ensure that the inherited {@link IJaMoPPEObjectInitialiser#newInitialiser()} + * returns an initialiser instance of the same type.
+ *
+ * All versions of initialisers are included to make sure that adapting + * initialisers does not break type equality of the returned initialiser. + */ + @ParameterizedTest + @MethodSource("provideAllInitialisers") + public void test_NewInitialiser_TypeCheck(IJaMoPPEObjectInitialiser initialiser) { + Assertions.assertEquals(initialiser.getClass(), initialiser.newInitialiser().getClass()); + } + + /** + * Ensure that the inherited {@link IJaMoPPEObjectInitialiser#newInitialiser()} + * does not consider adaptation strategies. + */ + @ParameterizedTest + @MethodSource("provideAdaptedInitialisers") + public void test_NewInitialiser_AdaptationStrategiesNotCopied(IInitialiserBase initialiser) { + var newInit = (IInitialiserBase) initialiser.newInitialiser(); + Assertions.assertFalse(newInit.isAdapted()); + } + + /** + * Ensure that adaptation strategies of adapted initialisers are copied for the + * new initialiser instance. Also make sure that the new adaptation strategies + * are not reference equal. + */ + @ParameterizedTest + @MethodSource("provideAdaptedInitialisers") + public void test_NewInitialiser_WithAdaptationStrategies(IInitialiserBase initialiser) { + var newInit = initialiser.newInitialiserWithStrategies(); + + Assertions.assertEquals(initialiser.getClass(), newInit.getClass()); + + if (initialiser.isAdapted()) { + Assertions.assertTrue(newInit.isAdapted()); + + var strats = initialiser.getAdaptingStrategies(); + var newStrats = newInit.getAdaptingStrategies(); + + Assertions.assertEquals(strats.size(), newStrats.size()); + + // Ensure that new adaptation strategies are not reference equal + for (var s : strats) { + Assertions.assertTrue(newStrats.stream().noneMatch((ns) -> ns == s)); + + // Approximate equality of contents by checking amount of elements of same type + Assertions.assertEquals(strats.stream().filter((s2) -> s2.getClass().equals(s.getClass())).count(), + newStrats.stream().filter((ns) -> ns.getClass().equals(s.getClass())).count()); + } + } else { + Assertions.assertFalse(newInit.isAdapted()); + } + } + + /** + * Checks if similarity checking causes issues, if the {@link EObject} instances + * on both sides are not properly initialised.
+ *
+ * Only non-adapted initialisers are used, since the generated instances should + * not be initialised. + */ + @ParameterizedTest + @Disabled("Disabled till null pointer exceptions are fixed") + @MethodSource("provideNonAdaptedInitialisers") + public void test_IsSimilar_Uninitialised_ObjectsEqual(IJaMoPPEObjectInitialiser initialiser) { + var obj1 = initialiser.instantiate(); + var obj2 = initialiser.instantiate(); + + this.assertIsSimilar(obj1, obj2); + } + + /** + * Checks if two minimally initialised {@link EObject} instances are + * similar.
+ *
+ * Only adapted initialisers are used, since the generated instances should be + * initialised. + */ + @ParameterizedTest + @MethodSource("provideAdaptedInitialisers") + public void test_IsSimilar_Initialised_ObjectsEqual(IJaMoPPEObjectInitialiser initialiser) { + var obj11 = this.instantiateAndInitialise(initialiser); + var obj12 = this.instantiateAndInitialise(initialiser); + + this.assertIsSimilar(obj11, obj12); + } + + /** + * Checks if the same {@link EObject} instance is similar to itself. + */ + @ParameterizedTest + @MethodSource("provideAllInitialisers") + public void test_IsSimilar_SameReference(IJaMoPPEObjectInitialiser initialiser) { + var obj11 = initialiser.instantiate(); + + this.assertIsSimilar(obj11, obj11); + } + + /** + * Checks if an {@link EObject} instance is similar to its clone. + */ + @ParameterizedTest + @Disabled("Disabled till null pointer exceptions are fixed") + @MethodSource("provideAllInitialisers") + public void test_IsSimilar_CloneEqual(IJaMoPPEObjectInitialiser initialiser) { + var obj11 = initialiser.instantiate(); + var objClone = this.cloneEObj(obj11); + + this.assertIsSimilar(obj11, objClone); + } + + /** + * Checks whether similarity checking causes issues, if one side is null. + */ + @Test + public void test_IsSimilar_OneSide_Null() { + var initialiser = new ModuleInitialiser(); + var obj = initialiser.instantiate(); + + this.assertIsSimilar(null, obj, Boolean.FALSE); + } + + /** + * Checks whether similarity checking causes issues, if both sides are null. + */ + @Test + public void test_IsSimilar_BothSides_Null() { + this.assertIsSimilar(null, null); + } + + /** + * Checks if two {@link EObject} instances that implement different interfaces + * are not similar. + */ + @Test + public void test_IsSimilar_ClassMismatch() { + var mod = new ModuleInitialiser().instantiate(); + var pac = new PackageInitialiser().instantiate(); + + this.assertIsSimilar(mod, pac, Boolean.FALSE); + } + + /** + * Checks whether similarity checking causes issues, if 2 lists each with 1 + * {@link EObject} instance cause issues, where the mentioned instances are not + * initialised properly.
+ *
+ * Only non-adapted initialisers are used, since the generated instances should + * not be initialised. + */ + @ParameterizedTest + @Disabled("Disabled till null pointer exceptions are fixed") + @MethodSource("provideNonAdaptedInitialisers") + public void test_AreSimilar_Uninitialised_SingleObject(IJaMoPPEObjectInitialiser initialiser) { + var obj1 = initialiser.instantiate(); + var obj2 = initialiser.instantiate(); + + this.assertAreSimilar(this.toList(obj1), this.toList(obj2)); + } + + /** + * Checks if similarity checking causes issues, if 2 lists each with 2 + * {@link EObject} instance cause issues, where the mentioned {@link EObject} + * instances are not initialised properly.
+ *
+ * Only non-adapted initialisers are used, since the generated instances should + * not be initialised. + */ + @ParameterizedTest + @Disabled("Disabled till null pointer exceptions are fixed") + @MethodSource("provideNonAdaptedInitialisers") + public void test_AreSimilar_Uninitialised_MultipleObjects(IJaMoPPEObjectInitialiser initialiser) { + var obj11 = initialiser.instantiate(); + var obj12 = initialiser.instantiate(); + var obj21 = initialiser.instantiate(); + var obj22 = initialiser.instantiate(); + + this.assertAreSimilar(this.toList(obj11, obj12), this.toList(obj21, obj22)); + } + + /** + * Checks whether similarity checking causes issues, if 2 lists each with 1 + * {@link EObject} instance cause issues, where the mentioned instances are not + * initialised properly.
+ *
+ * Only adapted initialisers are used, since the generated instances should be + * initialised. + */ + @ParameterizedTest + @MethodSource("provideAdaptedInitialisers") + public void test_AreSimilar_Initialised_SingleObject(IJaMoPPEObjectInitialiser initialiser) { + var obj1 = this.instantiateAndInitialise(initialiser); + var obj2 = this.instantiateAndInitialise(initialiser); + + this.assertAreSimilar(this.toList(obj1), this.toList(obj2)); + } + + /** + * Checks if similarity checking causes issues, if 2 lists each with 2 + * {@link EObject} instance cause issues, where the mentioned {@link EObject} + * instances are not initialised properly.
+ *
+ * Only adapted initialisers are used, since the generated instances should be + * initialised. + */ + @ParameterizedTest + @MethodSource("provideAdaptedInitialisers") + public void test_AreSimilar_Initialised_MultipleObjects(IJaMoPPEObjectInitialiser initialiser) { + var obj11 = this.instantiateAndInitialise(initialiser); + var obj12 = this.instantiateAndInitialise(initialiser); + var obj21 = this.instantiateAndInitialise(initialiser); + var obj22 = this.instantiateAndInitialise(initialiser); + + this.assertAreSimilar(this.toList(obj11, obj12), this.toList(obj21, obj22)); + } + + /** + * Checks if similarity checking returns true, when a list is compared to + * itself. The said list contains one {@link EObject} instance. + */ + @ParameterizedTest + @MethodSource("provideNonAdaptedInitialisers") + public void test_AreSimilar_SingleObject_SameReference(IJaMoPPEObjectInitialiser initialiser) { + var obj = initialiser.instantiate(); + var list = this.toList(obj); + + this.assertAreSimilar(list, list); + } + + /** + * Checks if a list containing only an {@link EObject} instance is similar to + * another list that contains only a clone of that {@link EObject} instance. + */ + @ParameterizedTest + @Disabled("Disabled till null pointer exceptions are fixed") + @MethodSource("provideAllInitialisers") + public void test_AreSimilar_SingleObject_CloneEqual(IJaMoPPEObjectInitialiser initialiser) { + var obj = initialiser.instantiate(); + var objCopy = this.cloneEObj(obj); + + this.assertAreSimilar(this.toList(obj), this.toList(objCopy)); + } + + /** + * Checks if similarity checking returns true, when a list is compared to + * itself. The said list contains two different {@link EObject} instances. + */ + @Test + public void test_AreSimilar_MultipleObjects_SameReference() { + var modInit = new ModuleInitialiser(); + + var obj1 = modInit.instantiate(); + Assertions.assertTrue(modInit.setName(obj1, "mod1")); + + var obj2 = modInit.instantiate(); + Assertions.assertTrue(modInit.setName(obj2, "mod2")); + + // Make sure both objects are different + this.assertIsSimilar(obj1, obj2, Boolean.FALSE); + + var list = this.toList(obj1, obj2); + + this.assertAreSimilar(list, list); + } + + /** + * Checks if a list containing 2 different {@link EObject} instances is similar + * to another list that is its clone. + */ + @Test + public void test_AreSimilar_MultipleObjects_CloneEqual() { + var initialiser = new ModuleInitialiser(); + + var obj1 = initialiser.instantiate(); + Assertions.assertTrue(initialiser.setName(obj1, "mod1")); + + var obj2 = initialiser.instantiate(); + Assertions.assertTrue(initialiser.setName(obj2, "mod2")); + + // Make sure both objects are different + this.assertIsSimilar(obj1, obj2, Boolean.FALSE); + + var obj1Copy = this.cloneEObj(obj1); + var obj2Copy = this.cloneEObj(obj2); + + this.assertAreSimilar(this.toList(obj1, obj2), this.toList(obj1Copy, obj2Copy)); + } + + /** + * Checks if similarity checking lists of {@link EObject} instances causes + * issues, if one side is null. + */ + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void test_AreSimilar_OneSide_Null() { + var initialiser = new ModuleInitialiser(); + var obj = initialiser.instantiate(); + + this.assertAreSimilar(null, this.toList(obj), Boolean.FALSE); + } + + /** + * Checks if two lists, where one list is empty and the other one is not, are + * not similar. + */ + @ParameterizedTest + @MethodSource("provideNonAdaptedInitialisers") + public void test_AreSimilar_OneSide_EmptyList(IJaMoPPEObjectInitialiser initialiser) { + var obj = initialiser.instantiate(); + + this.assertAreSimilar(this.toList(), this.toList(obj), Boolean.FALSE); + } + + /** + * Checks if similarity checking lists of {@link EObject} instances causes + * issues, if one of the lists contains a null element. + */ + @Test + public void test_AreSimilar_OneSide_ListWithNullElement() { + var initialiser = new ModuleInitialiser(); + var obj = initialiser.instantiate(); + + this.assertAreSimilar(this.toList(obj), this.makeListWithSingleNullElement(), Boolean.FALSE); + } + + /** + * Checks if two lists, where one of them is a sublist of another, are not + * similar. + */ + @Test + public void test_AreSimilar_OneSide_SubList() { + var modInit = new ModuleInitialiser(); + + var obj1 = modInit.instantiate(); + Assertions.assertTrue(modInit.setName(obj1, "mod1")); + + var obj2 = modInit.instantiate(); + Assertions.assertTrue(modInit.setName(obj2, "mod2")); + + // Make sure both objects are different + this.assertIsSimilar(obj1, obj2, Boolean.FALSE); + + this.assertAreSimilar(this.toList(obj1), this.toList(obj1, obj2), Boolean.FALSE); + } + + /** + * Checks if similarity checking lists of {@link EObject} instances causes + * issues, if both sides are null. + */ + @Disabled("Disabled till null pointer exceptions are fixed") + @Test + public void test_AreSimilar_BothSides_Null() { + this.assertAreSimilar(null, null); + } + + /** + * Checks if two empty lists are similar. + */ + @Test + public void test_AreSimilar_BothSides_EmptyList() { + Assertions.assertTrue(this.areSimilar(this.toList(), this.toList())); + } + + /** + * Checks if similarity checking lists of {@link EObject} instances causes + * issues, if both lists each contain a null element. + */ + @Test + public void test_AreSimilar_BothSides_ListsWithNullElement() { + this.assertAreSimilar(this.makeListWithSingleNullElement(), this.makeListWithSingleNullElement()); + } + + /** + * Checks whether lists with the same size, same elements (clones of them) but + * in different order are successfully identified as different.
+ *
+ * Implemented by cloning and comparing 2 + * {@link org.emftext.language.java.containers.Module}. + */ + @Test + public void test_AreSimilar_SameObjectDifferentOrder() { + var modInit = new ModuleInitialiser(); + + var obj1 = modInit.instantiate(); + Assertions.assertTrue(modInit.setName(obj1, "mod1")); + + var obj2 = modInit.instantiate(); + Assertions.assertTrue(modInit.setName(obj2, "mod2")); + + // Make sure both objects are different + this.assertIsSimilar(obj1, obj2, Boolean.FALSE); + + this.assertAreSimilar(this.toList(obj1, obj2), this.toList(obj2, obj1), Boolean.FALSE); + } + + /** + * Checks if two {@link EObject} instances that implement different interfaces + * are not similar. + */ + @Test + public void test_AreSimilar_ClassMismatch() { + var mod = new ModuleInitialiser().instantiate(); + var pac = new PackageInitialiser().instantiate(); + + this.assertAreSimilar(this.toList(mod), this.toList(pac), Boolean.FALSE); + } +} From cafa800708d2322f1fe308b8514fa36093bd605f Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 20:07:24 +0100 Subject: [PATCH 85/87] Add package commentary --- .../consistency/fitests/similarity/jamopp/package-info.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/package-info.java new file mode 100644 index 0000000000..a940456970 --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/jamopp/package-info.java @@ -0,0 +1,6 @@ +/** + * Contains test classes that can be used to test the similarity checking of + * Java-model elements, which are stored and represented by {@link EObject} + * implementors present in JaMoPP. + */ +package cipm.consistency.fitests.similarity.jamopp; \ No newline at end of file From fb90fd3ca3f4df13bd0a336580daf5ff89928e45 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Sun, 27 Oct 2024 20:08:00 +0100 Subject: [PATCH 86/87] Add package commentary --- .../consistency/fitests/similarity/package-info.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/package-info.java diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/package-info.java b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/package-info.java new file mode 100644 index 0000000000..f01efa969d --- /dev/null +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/src/cipm/consistency/fitests/similarity/package-info.java @@ -0,0 +1,11 @@ +/** + * This package contains classes and interfaces that can be used to test + * similarity checking, regardless of which objects are compared during + * similarity checking.
+ *
+ * Sub-packages contain tests and utility classes that test similarity checking. + * They are named and structured to minimise dependencies concerning the context + * of similarity checking (such as {@link EObject} or JaMoPP). This way, + * re-using the contents of sub-packages is easier. + */ +package cipm.consistency.fitests.similarity; \ No newline at end of file From 030fc77216ce4dd1ca4463c727e36bf51ecf7207 Mon Sep 17 00:00:00 2001 From: AlpTorac Date: Mon, 10 Feb 2025 15:05:54 +0100 Subject: [PATCH 87/87] Change JUnit dependencies Use the same JUnit related dependencies as vsum tests Add JUnit Argument dependencies as well --- .../fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF b/commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF index 2d5f43ff4c..2e60c40bf7 100644 --- a/commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF +++ b/commit-based-cipm/fi-tests/cipm.consistency.fitests/META-INF/MANIFEST.MF @@ -5,9 +5,9 @@ Bundle-SymbolicName: cipm.consistency.fitests Bundle-Version: 1.0.0.qualifier Automatic-Module-Name: cipm.consistency.fitests Bundle-RequiredExecutionEnvironment: JavaSE-11 -Require-Bundle: org.junit, - org.junit.jupiter.api, - org.junit.jupiter.params, +Require-Bundle: junit-jupiter-api, + junit-jupiter-engine, + junit-jupiter-params, org.eclipse.emf.common, org.eclipse.emf.ecore, org.eclipse.emf.compare,