svn commit: r15374 - branches/gsoc2008/work_issue5042_maurelio1234: src/org/argouml/profile/internal/ocl src/org/argouml/profile/internal/ocl/uml14 tests/org/argouml/profile/internal/ocl

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: maurelio1234
Date: 2008-07-26 07:51:12-0700
New Revision: 15374

Modified:
   branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/DefaultOclEvaluator.java
   branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/EvaluateExpression.java
   branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/CollectionsModelInterpreter.java
   branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/HashBag.java
   branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestCrOCL2.java
   branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestDefaultOclEvaluator.java

Log:
writing more tests to OCL evaluator and fixing implementation



Modified: branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/DefaultOclEvaluator.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/DefaultOclEvaluator.java?view=diff&rev=15374&p1=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/DefaultOclEvaluator.java&p2=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/DefaultOclEvaluator.java&r1=15373&r2=15374
==============================================================================
--- branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/DefaultOclEvaluator.java	(original)
+++ branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/DefaultOclEvaluator.java	2008-07-26 07:51:12-0700
@@ -35,7 +35,7 @@
 /**
  * Evaluates ocl expressions
  *
- * @author maurelio
+ * @author maurelio1234
  */
 public class DefaultOclEvaluator implements OclExpressionEvaluator {
 

Modified: branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/EvaluateExpression.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/EvaluateExpression.java?view=diff&rev=15374&p1=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/EvaluateExpression.java&p2=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/EvaluateExpression.java&r1=15373&r2=15374
==============================================================================
--- branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/EvaluateExpression.java	(original)
+++ branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/EvaluateExpression.java	2008-07-26 07:51:12-0700
@@ -230,7 +230,7 @@
         Object right = val;
         val = null;
 
-        if (left != null && op != null && right != null) {
+        if (op != null) {
             if (op instanceof AAndLogicalOperator) {
                 val = asBoolean(left, node) && asBoolean(right, node);
             } else if (op instanceof AImpliesLogicalOperator) {
@@ -577,13 +577,14 @@
         }
         if (node.getExpression() != null) {
             node.getExpression().apply(this);
+            value = val;
         }
         if (node.getTIn() != null) {
             node.getTIn().apply(this);
         }
 
         vt.put(("" + name).trim(), value);
-        val = value;
+        val = null;
         outALetExpression(node);
     }
 
@@ -642,12 +643,12 @@
         {
             node.getCollectionKind().apply(this);
             
-            String kind = node.getCollectionKind().toString();
+            String kind = node.getCollectionKind().toString().trim();
             if (kind.equalsIgnoreCase("Set")) {
                 col = new HashSet<Object>();
-            } else if (kind.equals("Sequence")) {
+            } else if (kind.equalsIgnoreCase("Sequence")) {
                 col = new ArrayList<Object>();
-            } else if (kind.equals("Bag")) {
+            } else if (kind.equalsIgnoreCase("Bag")) {
                 col = new HashBag<Object>();                
             }
         }        
@@ -803,8 +804,22 @@
             parameters = new Vector<Object>();
         }
 
-        return interp.invokeFeature(vt, subject, feature.toString().trim(),
-                type.toString().trim(), parameters.toArray());
+        // XXX this should be done in CollectionsModelInterpreter
+        // but it can't trigger another invokeFeature...
+        
+        if ((subject instanceof Collection)
+                && type.toString().trim().equals(".")) {
+            Collection col = (Collection) subject;
+            HashBag<Object> res = new HashBag<Object>();
+            for (Object obj : col) {
+                res.add(interp.invokeFeature(vt, obj,
+                        feature.toString().trim(), ".", parameters.toArray()));
+            }
+            return res;
+        } else {
+            return interp.invokeFeature(vt, subject, feature.toString().trim(),
+                    type.toString().trim(), parameters.toArray());
+        }
     }
 
     /** Error Handling * */

Modified: branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/CollectionsModelInterpreter.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/CollectionsModelInterpreter.java?view=diff&rev=15374&p1=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/CollectionsModelInterpreter.java&p2=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/CollectionsModelInterpreter.java&r1=15373&r2=15374
==============================================================================
--- branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/CollectionsModelInterpreter.java	(original)
+++ branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/CollectionsModelInterpreter.java	2008-07-26 07:51:12-0700
@@ -58,7 +58,7 @@
                 subject = ns;
             }
         }
-        
+
         if (subject instanceof Collection) {
             if (type.equals("->")) {
                 if (feature.toString().trim().equals("select")) {
@@ -142,7 +142,7 @@
 
                     vt.put(varName, oldVal);
 
-                    return col;
+                    return res;
                 } else if (feature.toString().trim().equals("exists")) {
                     Vector<String> vars = (Vector<String>) parameters[0];
                     Object exp = parameters[1];
@@ -191,63 +191,63 @@
                     vt.put(varName, oldVal);
 
                     return true;
-                }
-            } else if (feature.toString().trim().equals("one")) {
-                Vector<String> vars = (Vector<String>) parameters[0];
-                Object exp = parameters[1];
-                LambdaEvaluator eval = (LambdaEvaluator) parameters[2];
-
-                Collection col = (Collection) subject;
-
-                // TODO is it possible to use more than one variable?
-                String varName = vars.elementAt(0);
-                Object oldVal = vt.get(varName);
-                boolean found = false;
-
-                for (Object object : col) {
-                    vt.put(varName, object);
-
-                    Object val = eval.evaluate(vt, exp);
-                    if (val instanceof Boolean && (Boolean) val) {
-                        if (!found) {
-                            found = true;
-                        } else {
-                            return false;
+                } else if (feature.toString().trim().equals("one")) {
+                    Vector<String> vars = (Vector<String>) parameters[0];
+                    Object exp = parameters[1];
+                    LambdaEvaluator eval = (LambdaEvaluator) parameters[2];
+
+                    Collection col = (Collection) subject;
+
+                    // TODO is it possible to use more than one variable?
+                    String varName = vars.elementAt(0);
+                    Object oldVal = vt.get(varName);
+                    boolean found = false;
+
+                    for (Object object : col) {
+                        vt.put(varName, object);
+
+                        Object val = eval.evaluate(vt, exp);
+                        if (val instanceof Boolean && (Boolean) val) {
+                            if (!found) {
+                                found = true;
+                            } else {
+                                return false;
+                            }
                         }
                     }
-                }
 
-                vt.put(varName, oldVal);
+                    vt.put(varName, oldVal);
 
-                return found;
-            } else if (feature.toString().trim().equals("any")) {
-                Vector<String> vars = (Vector<String>) parameters[0];
-                Object exp = parameters[1];
-                LambdaEvaluator eval = (LambdaEvaluator) parameters[2];
+                    return found;
+                } else if (feature.toString().trim().equals("any")) {
+                    Vector<String> vars = (Vector<String>) parameters[0];
+                    Object exp = parameters[1];
+                    LambdaEvaluator eval = (LambdaEvaluator) parameters[2];
 
-                Collection col = (Collection) subject;
+                    Collection col = (Collection) subject;
 
-                // TODO is it possible to use more than one variable?
-                String varName = vars.elementAt(0);
-                Object oldVal = vt.get(varName);
+                    // TODO is it possible to use more than one variable?
+                    String varName = vars.elementAt(0);
+                    Object oldVal = vt.get(varName);
 
-                for (Object object : col) {
-                    vt.put(varName, object);
+                    for (Object object : col) {
+                        vt.put(varName, object);
 
-                    Object val = eval.evaluate(vt, exp);
-                    if (val instanceof Boolean && (Boolean) val) {
-                        return object;
+                        Object val = eval.evaluate(vt, exp);
+                        if (val instanceof Boolean && (Boolean) val) {
+                            return object;
+                        }
                     }
-                }
 
-                vt.put(varName, oldVal);
+                    vt.put(varName, oldVal);
 
-                return null;
-            }
+                    return null;
+                }
 
-            // TODO implement iterate()
-            // TODO implement sortedBy()
-            // TODO implement subSequence()
+                // TODO implement iterate()
+                // TODO implement sortedBy()
+                // TODO implement subSequence()
+            }
         }
 
         // these operations are ok for lists too

Modified: branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/HashBag.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/HashBag.java?view=diff&rev=15374&p1=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/HashBag.java&p2=branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/HashBag.java&r1=15373&r2=15374
==============================================================================
--- branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/HashBag.java	(original)
+++ branches/gsoc2008/work_issue5042_maurelio1234/src/org/argouml/profile/internal/ocl/uml14/HashBag.java	2008-07-26 07:51:12-0700
@@ -70,7 +70,7 @@
      */
     public boolean add(E e) {
         if (map.get(e) == null) {
-            map.put(e, 0);
+            map.put(e, 1);
         } else {
             map.put(e, map.get(e) + 1);
         }
@@ -186,4 +186,35 @@
         return map.keySet().toArray(a);
     }
 
+    /**
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        return map.toString();
+    }
+    
+    /**
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @SuppressWarnings("unchecked")
+    public boolean equals(Object obj) {
+        if (obj instanceof Bag) {
+            Bag bag = (Bag) obj;
+            for (Object object : bag) {
+                if (count(object) != bag.count(object)) {
+                    return false;
+                }
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+    
+    /**
+     * @see java.lang.Object#hashCode()
+     */
+    public int hashCode() {
+        return map.hashCode() * 35;
+    }
 }

Modified: branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestCrOCL2.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestCrOCL2.java?view=diff&rev=15374&p1=branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestCrOCL2.java&p2=branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestCrOCL2.java&r1=15373&r2=15374
==============================================================================
--- branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestCrOCL2.java	(original)
+++ branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestCrOCL2.java	2008-07-26 07:51:12-0700
@@ -45,18 +45,6 @@
     }
 
     /**
-     * Test collections operations in objects (section ?)
-     * 
-     * @throws Exception if something goes wrong
-     */
-    public void testObjectAsCollection() throws Exception {
-        Object obj = Model.getUseCasesFactory().createActor();
-
-        testOclOK(obj, "context Actor inv: 2->size() = 1");
-        testOclFails(obj, "context Actor inv: 2->size() = 0");
-    }
-
-    /**
      * Test the self variable (section 8.3.1)
      * 
      * @throws Exception if something goes wrong
@@ -69,7 +57,8 @@
         testOclFails(obj, "context Actor inv: self.name.size() = 7");
     }
     
-    private void testOclOK(Object obj, String oclExp) throws InvalidOclException {
+    private void testOclOK(Object obj, String oclExp) 
+            throws InvalidOclException {
         CrOCL ocl = new CrOCL(oclExp, null, null,
                 null, null, null, null);
 
@@ -77,7 +66,8 @@
                 Critic.NO_PROBLEM);
     }
 
-    private void testOclFails(Object obj, String oclExp) throws InvalidOclException {
+    private void testOclFails(Object obj, String oclExp) 
+            throws InvalidOclException {
         CrOCL ocl = new CrOCL(oclExp, null, null,
                 null, null, null, null);
 

Modified: branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestDefaultOclEvaluator.java
Url: http://argouml.tigris.org/source/browse/argouml/branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestDefaultOclEvaluator.java?view=diff&rev=15374&p1=branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestDefaultOclEvaluator.java&p2=branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestDefaultOclEvaluator.java&r1=15373&r2=15374
==============================================================================
--- branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestDefaultOclEvaluator.java	(original)
+++ branches/gsoc2008/work_issue5042_maurelio1234/tests/org/argouml/profile/internal/ocl/TestDefaultOclEvaluator.java	2008-07-26 07:51:12-0700
@@ -24,12 +24,18 @@
 
 package org.argouml.profile.internal.ocl;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import junit.framework.TestCase;
 
-import org.argouml.cognitive.Critic;
-import org.argouml.cognitive.Designer;
 import org.argouml.model.InitializeModel;
 import org.argouml.model.Model;
+import org.argouml.profile.internal.ocl.uml14.Bag;
+import org.argouml.profile.internal.ocl.uml14.Uml14ModelInterpreter;
 
 /**
  * Tests for the EvaluateExpression class.
@@ -38,6 +44,27 @@
  */
 public class TestDefaultOclEvaluator extends TestCase {
 
+    private class DummyModelInterpreter implements ModelInterpreter {
+
+        /**
+         * @see org.argouml.profile.internal.ocl.ModelInterpreter#getBuiltInSymbol(java.lang.String)
+         */
+        public Object getBuiltInSymbol(String sym) {
+            return null;
+        }
+
+        /**
+         * @see org.argouml.profile.internal.ocl.ModelInterpreter#invokeFeature(java.util.HashMap,
+         *      java.lang.Object, java.lang.String, java.lang.String,
+         *      java.lang.Object[])
+         */
+        public Object invokeFeature(HashMap<String, Object> vt, Object subject,
+                String feature, String type, Object[] parameters) {
+            return null;
+        }
+        
+    }
+    
     @Override
     protected void setUp() throws Exception {
         super.setUp();
@@ -51,6 +78,283 @@
      */
     public void testBasicValuesAndTypes() throws Exception {
         assertEquals(DefaultOclEvaluator.getInstance()
-                .evaluate(null, null, "5"), 5);
+                .evaluate(null, null, "true"), true);
+        assertEquals(DefaultOclEvaluator.getInstance()
+                .evaluate(null, null, "false"), false);
+        assertEquals(DefaultOclEvaluator.getInstance()
+                .evaluate(null, null, "5"), 5);        
+        assertEquals(DefaultOclEvaluator.getInstance()
+                .evaluate(null, null, "-2"), -2);
+
+        // TODO real numbers not yet supported
+        //assertEquals(DefaultOclEvaluator.getInstance()
+                //.evaluate(null, null, "1.5"), 1.5);
+        
+        // TODO write test for enumerations, although they are not yet supported
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(null, null,
+                "'to be or not to be'"), "to be or not to be");
+    }
+    
+    /**
+     * Test the let expressions (section 8.4.3)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    public void testLetExpressions() throws Exception {
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(
+                new HashMap<String, Object>(), new DummyModelInterpreter(),
+                "let x : Integer = 12 in x * 5"), 60);
+    }
+    
+    // TODO do tests for type conformance (8.4.4),
+    // even though it is not yet supported
+    
+    // TODO do tests for infix operators (8.4.7),
+    // even though it is not yet supported
+
+    /**
+     * Test the undefined values (section 8.4.10)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    public void testUndefined() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new DummyModelInterpreter();
+        
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "false and x"), false);
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "x and false"), false);
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "true or x"), true);
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "x or true"), true);        
+    }
+    
+    /**
+     * Test collections operations in objects (section 8.5.4.2)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    public void testObjectAsCollection() throws Exception {
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(null,
+                new Uml14ModelInterpreter(), "2->size()"), 1);
+    }
+
+    // TODO do tests for navigation to association classes (8.5.5),
+    // even though it is not yet supported
+
+    /**
+     * Test predefined properties on all objects (section 8.5.10)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    public void testPredefinedPropertiesAllObjects() throws Exception {
+        Object iface = Model.getCoreFactory().buildInterface();
+        
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        vt.put("x", iface);
+
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi, "x"),
+                iface);
+        
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+            "x.oclIsTypeOf(Interface)"), true);
+        
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "x.oclIsKindOf(Classifier)"), true);               
+    }
+
+    // TODO do tests for allInstances (8.5.11),
+    // even though it is not yet supported
+
+    // TODO do tests for ranges in collection definition (8.5.12),
+    // even though it is not yet supported
+
+    /**
+     * Test set constructor (section 8.5.12)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testSetConstructors() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        Object obj = DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Set{1,2,5,88}");
+
+        assertTrue(obj instanceof Set);
+        
+        Set<Object> oset = (Set<Object>) obj;
+        assertTrue(oset.size() == 4);
+        assertTrue(oset.contains(1));
+        assertTrue(oset.contains(2));
+        assertTrue(oset.contains(5));        
+        assertTrue(oset.contains(88));
+
+    }
+    
+    /**
+     * Test bag constructor (section 8.5.12)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testBagConstructors() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        Object obj = DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Bag{1,3,4,3,5}");
+
+        assertTrue(obj instanceof Bag);
+        
+        Bag<Object> obag = (Bag<Object>) obj;
+        assertTrue(obag.size() == 5);
+        assertTrue(obag.contains(1));
+        assertTrue(obag.contains(3));
+        assertTrue(obag.contains(4));        
+        assertTrue(obag.contains(5));
+        assertTrue(obag.count(1) == 1);
+        assertTrue(obag.count(3) == 2);
+    }
+
+    /**
+     * Test sequence constructor (section 8.5.12)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testSequenceConstructors() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        Object obj = DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Sequence{'ape', 'nut'}");
+
+        assertTrue(obj instanceof List);
+        
+        List<Object> oseq = (List<Object>) obj;
+        assertTrue(oseq.size() == 2);
+        assertTrue(oseq.contains("ape"));
+        assertTrue(oseq.contains("nut"));
+        assertTrue(oseq.get(0).equals("ape"));
+        assertTrue(oseq.get(1).equals("nut"));
     }
+
+    // TODO do tests for collections of collections (8.5.13),
+    // even though it is not yet supported 
+    // question: should this happen with all collections or only 
+    // the constructed ones?
+
+    /**
+     * Test select operation (section 8.6.1)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testSelectOperation() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        Object obj = DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Set{1,2,3,4,5}->select(x|x>3)");
+
+        assertTrue(obj instanceof Collection);
+        
+        Collection<Object> ocol = (Collection<Object>) obj;
+        assertTrue(ocol.size() == 2);
+        assertTrue(ocol.contains(4));
+        assertTrue(ocol.contains(5));
+    }
+  
+    /**
+     * Test reject operation (section 8.6.1)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testRejectOperation() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        Object obj = DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Set{1,2,3,4,5}->reject(x|x>3)");
+
+        assertTrue(obj instanceof Collection);
+        
+        Collection<Object> ocol = (Collection<Object>) obj;
+        assertTrue(ocol.size() == 3);
+        assertTrue(ocol.contains(1));
+        assertTrue(ocol.contains(2));
+        assertTrue(ocol.contains(3));
+    }
+
+    /**
+     * Test collect operation (section 8.6.2 & 8.6.2.1)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testCollectOperation() throws Exception {        
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+
+        Set<Object> classes = new HashSet<Object>();
+        classes.add(Model.getCoreFactory().buildClass("class1"));
+        classes.add(Model.getCoreFactory().buildClass("class2"));
+        classes.add(Model.getCoreFactory().buildClass("class2"));
+        
+        vt.put("x", classes);
+        
+        Object obj1 = DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "x.name");
+        assertTrue(obj1 instanceof Collection);        
+        assertTrue(((Collection<Object>) obj1).size() == 3);
+
+        Object obj2 = DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "x->collect(x|x.name)");
+        assertTrue(obj2 instanceof Collection);        
+        assertTrue(((Collection<Object>) obj2).size() == 3);
+        assertEquals(obj1, obj2);
+    }
+
+    /**
+     * Test forAll operation (section 8.6.3)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testForAllOperation() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Set{1,2,3,4,5}->forAll(x|x>0)"), true);
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Set{1,2,3,4,5}->forAll(x|x<4)"), false);
+        
+    }
+
+    /**
+     * Test exists operation (section 8.6.4)
+     * 
+     * @throws Exception if something goes wrong
+     */
+    @SuppressWarnings("unchecked")
+    public void testExistsOperation() throws Exception {
+        HashMap<String, Object> vt = new HashMap<String, Object>();
+        ModelInterpreter mi = new Uml14ModelInterpreter();
+        
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Set{1,2,3,4,5}->exists(x|x>3)"), true);
+        assertEquals(DefaultOclEvaluator.getInstance().evaluate(vt, mi,
+                "Set{1,2,3,4,5}->exists(x|x>40)"), false);
+        
+    }
+        
 }
+
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.