[jboss-svn-commits] JBL Code SVN: r10565 - in labs/jbossrules/trunk/drools-clips/src: main/java/org/drools/clp/functions and 3 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Mar 27 23:03:38 EDT 2007


Author: mark.proctor at jboss.com
Date: 2007-03-27 23:03:37 -0400 (Tue, 27 Mar 2007)
New Revision: 10565

Added:
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java
   labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java
   labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java
Removed:
   labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java
   labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java
Modified:
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java
   labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java
   labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf
Log:
JBRULES-720 Clips Parser
-(break) now works
-added switch
-added equals(ValueHandler, Context) to each ValueHandler
-added printout, with the route defined from a Map in the context, currently returns a PrintStream


Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/BuiltinFunctions.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -39,6 +39,9 @@
 
         try {
             while ( (line = reader.readLine()) != null ) {
+                if ( line.startsWith( "#" ) || line.equals( "" )) {
+                    continue;
+                }
                 Class clazz = getClass().getClassLoader().loadClass( line );
                 Function function = (Function) clazz.newInstance();
                 this.functions.put( function.getName(),

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ExecutionContext.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,5 +1,10 @@
 package org.drools.clp;
 
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteTuple;
 
@@ -8,6 +13,7 @@
     private ReteTuple             tuple;
     private Object                object;
     private ValueHandler[]        localVariables;
+    private Map                   printoutRouters;             
 
     public ExecutionContext(InternalWorkingMemory workingMemory,
                             ReteTuple tuple,
@@ -26,7 +32,17 @@
         this.tuple = tuple;
         this.object = object;
         this.localVariables = new ValueHandler[localVariableSize];
+        this.printoutRouters = new HashMap();
+        this.printoutRouters.put( "t", System.out );
     }
+    
+    public void setPrintoutRouters(Map printoutRouters) {
+        this.printoutRouters = printoutRouters;
+    }
+    
+    public PrintStream getPrintoutRouters(String identifier) {
+        return ( PrintStream ) this.printoutRouters.get( identifier );
+    }
 
     public ReteTuple getTuple() {
         return tuple;

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionDelegator.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -37,7 +37,7 @@
     public ValueHandler execute(ValueHandler[] args,
                                 ExecutionContext context) {
         if ( this.function == null ) {
-            throw new RuntimeException( "Unable to find and bine Function '" + this.name + "'" );
+            throw new RuntimeException( "Unable to find and bind Function '" + this.name + "'" );
         }
         return function.execute( args,
                                  context );

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/FunctionRegistry.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -15,68 +15,57 @@
 
     public FunctionRegistry(BuiltinFunctions builtin) {
         this.functions = new HashMap();
-        //this.variables = new HashMap();
 
         this.builtin = builtin;
 
-        try {
-            loadFunctions();
-        } catch ( IOException e ) {
-            throw new RuntimeException( e );
-        } catch ( ClassNotFoundException e ) {
-            throw new RuntimeException( e );
-        }
+//        try {
+//            loadFunctions();
+//        } catch ( IOException e ) {
+//            throw new RuntimeException( e );
+//        } catch ( ClassNotFoundException e ) {
+//            throw new RuntimeException( e );
+//        }
     }
 
-    public void loadFunctions() throws IOException,
-                               ClassNotFoundException {
-        BufferedReader reader = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "functions.conf" ) ) );
-        loadFunctions( reader );
-    }
+//    public void loadFunctions() throws IOException,
+//                               ClassNotFoundException {
+//        BufferedReader reader = new BufferedReader( new InputStreamReader( getClass().getResourceAsStream( "functions.conf" ) ) );
+//        loadFunctions( reader );
+//    }
+//
+//    public void loadFunctions(BufferedReader reader) throws IOException,
+//                                                    ClassNotFoundException {
+//        String line = null;
+//
+//        try {
+//            while ( (line = reader.readLine()) != null ) {
+//                Class clazz = getClass().getClassLoader().loadClass( line );
+//                Function function = (Function) clazz.newInstance();
+//                addFunction( function );
+//            }
+//        } catch ( IllegalAccessException e ) {
+//            throw new RuntimeException( e );
+//        } catch ( InstantiationException e ) {
+//            throw new RuntimeException( e );
+//        }
+//    }
 
-    public void loadFunctions(BufferedReader reader) throws IOException,
-                                                    ClassNotFoundException {
-        String line = null;
-
-        try {
-            while ( (line = reader.readLine()) != null ) {
-                Class clazz = getClass().getClassLoader().loadClass( line );
-                Function function = (Function) clazz.newInstance();
-                addFunction( function );
-            }
-        } catch ( IllegalAccessException e ) {
-            throw new RuntimeException( e );
-        } catch ( InstantiationException e ) {
-            throw new RuntimeException( e );
-        }
-    }
-
     public Function getFunction(String name) {
         Function function = (Function) this.functions.get( name );
 
         if ( function == null ) {
-            // Allows for late binidng FunctionDelegators
-            function = new FunctionDelegator( name );
+            function = this.builtin.getFunction( name );
+            if ( function == null ) {
+                function = new FunctionDelegator( name );
+            } else {
+                function = new FunctionDelegator(function);
+            }
             this.functions.put( name,
                                 function );
         }
         return function;
-    }
+    }   
 
-    //    public Function createFunction(String name) {
-    //        try {
-    //            Class clazz = ( Class ) this.functions.get( name );
-    //            if ( clazz == null ) {
-    //                throw new RuntimeException( "Function '" + name + "' does not exist" );
-    //            }
-    //            return (Function) clazz.newInstance();
-    //        } catch ( InstantiationException e ) {
-    //            throw new RuntimeException( e );
-    //        } catch ( IllegalAccessException e ) {
-    //            throw new RuntimeException( e );
-    //        }
-    //    }        
-
     public void addFunction(Function function) {
         FunctionDelegator delegator = (FunctionDelegator) this.functions.get( function.getName() );
 
@@ -88,28 +77,7 @@
         delegator.setFunction( function );
     }
 
-    //    public void init() {
-    //        this.variables.clear();
-    //    }
-    //    
-    //    public void setVariable(LocalVariableValue variable) {
-    //        this.variables.put( variable.getIdentifier(), variable );
-    //    }
-    //    
-    //    public VariableValueHandler getVariable(String identifier) {
-    //        VariableValueHandler variable = ( VariableValueHandler ) this.variables.get( identifier );
-    //        if ( identifier == null ) {
-    //            variable = new TempTokenVariable( identifier );
-    //            this.variables.put( identifier, variable );
-    //        }
-    //        return variable;
-    //    }
-
     public int getFunctionSize() {
         return this.functions.size();
     }
-
-    //    public int getVariablesSize() {
-    //        return this.variables.size();
-    //    }
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/ValueHandler.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -64,4 +64,6 @@
      */     
     public BigDecimal getBigDecimalValue(ExecutionContext context) throws NumberFormatException;
 
+    
+    public boolean equals(ValueHandler other, ExecutionContext context);
 }
\ No newline at end of file

Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/BreakFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,26 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+
+public class BreakFunction extends BaseFunction
+    implements
+    Function {
+    private static final String name = "break";
+
+    public BreakFunction() {
+
+    }
+
+    public ValueHandler execute(ValueHandler[] args,
+                                ExecutionContext context) {
+        return BaseValueHandler.BREAK;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/EqFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,26 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+
+public class EqFunction extends BaseFunction
+    implements
+    Function {
+    private static final String name = "eq";
+
+    public EqFunction() {
+
+    }
+
+    public ValueHandler execute(ValueHandler[] args,
+                                ExecutionContext context) {
+
+        return new BooleanValueHandler( args[0].equals( args[1], context ) );
+    }
+
+    public String getName() {
+        return name;
+    }
+}

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/ForeachFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -4,6 +4,7 @@
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.Function;
 import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
 import org.drools.clp.valuehandlers.ListValueHandler;
 import org.drools.clp.valuehandlers.TempTokenVariable;
 
@@ -50,6 +51,13 @@
             for (int j = 2, length2 = args.length; j < length2; j++ ) {
                 // iterate for each action
                 result = args[j].getValue( context );
+                if ( result == BaseValueHandler.BREAK ) {
+                    break;
+                }
+            }
+            if ( result == BaseValueHandler.BREAK ) {
+                // need to do this twice as its a nested loop here, a single loop in the lisp
+                break;
             }            
         }
 

Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/PrintoutFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,46 @@
+package org.drools.clp.functions;
+
+import java.io.OutputStream;
+import java.io.PrintStream;
+
+import org.drools.base.SimpleValueType;
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.FunctionDelegator;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.ListValueHandler;
+
+public class PrintoutFunction extends BaseFunction
+    implements
+    Function {
+    private static final String name = "printout";
+
+    public PrintoutFunction() {
+
+    }
+
+    public ValueHandler execute(ValueHandler[] args,
+                                ExecutionContext context) {
+        PrintStream route = context.getPrintoutRouters( args[0].getStringValue( context ) );
+        
+        for ( int i = 1; i < args.length; i++ ) {
+            ValueHandler value = args[i].getValue( context );
+            if ( value != null && value.getValueType( context ) == SimpleValueType.LIST ) {
+                ValueHandler[] list = ((ListValueHandler)value).getList();
+                for ( int j = 0; j < list.length; j++ ) {
+                    route.print( list[j].getStringValue( context ) );
+                }
+            } else {
+                System.out.print( args[i].getStringValue( context ) );
+            }
+        }
+        
+        return null;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchCaseFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,48 +1,54 @@
 package org.drools.clp.functions;
 
+import org.drools.clp.ExecutionBuildContext;
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.Function;
 import org.drools.clp.LispForm;
 import org.drools.clp.LispList;
 import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
 import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
+import org.drools.clp.valuehandlers.TempTokenVariable;
 
 public class SwitchCaseFunction extends BaseFunction
     implements
     Function {
-    private static final String name = "switch";
+    private static final String name = "case";
 
     public SwitchCaseFunction() {
 
     }
 
+    public ValueHandler addParameterCallback(int index,
+                                             ValueHandler valueHandler,
+                                             ExecutionBuildContext context) {
+        if ( index == 0 ) {
+            // swap the element for an equality check        
+            FunctionCaller caller  = new FunctionCaller( context.getFunctionRegistry().getFunction( "eq" ) );
+            caller.addParameter( (ValueHandler) context.getProperty( "switch-variable"  ) );
+            caller.addParameter( valueHandler );
+            valueHandler = caller;
+        }
+        return valueHandler;
+    }      
+    
     public ValueHandler execute(ValueHandler[] args,
                                 ExecutionContext context) {
-        ValueHandler value = args[0].getValue( context );
-        
         ValueHandler result = null;
         
-        //ValueHandler
+        if ( args[0].getBooleanValue( context ) ) {
+            for (int i = 2, length = args.length; i < length; i++ ) {
+                result = args[i].getValue( context );   
+                if ( result == BaseValueHandler.BREAK ) {
+                    break;
+                }
+            }
+        } else {
+            result = new BooleanValueHandler( false );
+        }
         
-        for (int j = 2, length = args.length; j < length; j++ ) {
-            
-            
-            // iterate for each action
-            //result = args[j].getValue( context );
-            
-        }   
-        
         return result;
-        
-        /*
-        if ( result ) {
-            return args[2].getValue( context );
-        } else if ( args[3] != null && args[4] != null ) {
-            return args[4].getValue( context );
-        } else {
-            return new BooleanValueHandler( result );
-        }
-        */
     }
 
     public String getName() {

Added: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchDefaultFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,30 @@
+package org.drools.clp.functions;
+
+import org.drools.clp.ExecutionBuildContext;
+import org.drools.clp.ExecutionContext;
+import org.drools.clp.Function;
+import org.drools.clp.LispForm;
+import org.drools.clp.LispList;
+import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
+import org.drools.clp.valuehandlers.TempTokenVariable;
+
+public class SwitchDefaultFunction extends BaseFunction
+    implements
+    Function {
+    private static final String name = "default";
+
+    public SwitchDefaultFunction() {
+
+    }
+
+    public ValueHandler execute(ValueHandler[] args,
+                                ExecutionContext context) {
+        return args[0].getValue( context );
+    }
+
+    public String getName() {
+        return name;
+    }
+}

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/SwitchFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,11 +1,15 @@
 package org.drools.clp.functions;
 
+import org.drools.clp.ExecutionBuildContext;
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.Function;
 import org.drools.clp.LispForm;
 import org.drools.clp.LispList;
 import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
 import org.drools.clp.valuehandlers.BooleanValueHandler;
+import org.drools.clp.valuehandlers.LocalVariableValue;
+import org.drools.clp.valuehandlers.TempTokenVariable;
 
 public class SwitchFunction extends BaseFunction
     implements
@@ -15,34 +19,38 @@
     public SwitchFunction() {
 
     }
+    
+    public ValueHandler addParameterCallback(int index,
+                                             ValueHandler valueHandler,
+                                             ExecutionBuildContext context) {
+        if ( index == 0 ) {
+            if ( !(valueHandler instanceof LocalVariableValue ) ) {
+                // this should already be bound as a local variable
+                throw new RuntimeException( "The variable must already have been declared to use it in a switch statement" );
+            } else {
+                context.setProperty( "switch-variable", valueHandler );
+            }
+        }
 
+        return valueHandler;
+    }     
+
     public ValueHandler execute(ValueHandler[] args,
-                                ExecutionContext context) {
-        ValueHandler value = args[0].getValue( context );
-        
+                                ExecutionContext context) {        
         ValueHandler result = null;
         
-        //ValueHandler
+        // binds the variable for the case function to use
+        args[0].getValue( context );
         
-        for (int j = 2, length = args.length; j < length; j++ ) {
-            
-            
-            // iterate for each action
-            //result = args[j].getValue( context );
-            
+        // now its bound we can execute each case statement in turn
+        for (int i = 1, length = args.length; i < length; i++ ) {
+            result = args[i].getValue( context );   
+            if ( result == BaseValueHandler.BREAK ) {
+                break;
+            }
         }   
         
         return result;
-        
-        /*
-        if ( result ) {
-            return args[2].getValue( context );
-        } else if ( args[3] != null && args[4] != null ) {
-            return args[4].getValue( context );
-        } else {
-            return new BooleanValueHandler( result );
-        }
-        */
     }
 
     public String getName() {

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/functions/WhileFunction.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -3,6 +3,7 @@
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.Function;
 import org.drools.clp.ValueHandler;
+import org.drools.clp.valuehandlers.BaseValueHandler;
 
 public class WhileFunction extends BaseFunction
     implements
@@ -23,7 +24,14 @@
             for (int i = 2, length = args.length; i < length; i++ ) {
                 // iterate for each action                
                 result = args[i].getValue( context );
+                if ( result == BaseValueHandler.BREAK ) {
+                    break;
+                }                  
             }
+            if ( result == BaseValueHandler.BREAK ) {
+                // need to do this twice as its a nested loop here, a single loop in the lisp
+                break;
+            }              
         }
 
         return result;

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BaseValueHandler.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -7,6 +7,8 @@
 import org.drools.clp.ValueHandler;
 
 public abstract class BaseValueHandler implements ValueHandler {        
+    public static final ObjectValueHandler NULL = new ObjectValueHandler( "null" );    
+    public static final ObjectValueHandler BREAK = new ObjectValueHandler( "break" );    
     
     public BigDecimal getBigDecimalValue(ExecutionContext context) throws NumberFormatException {
         Object object = getObject( context );        
@@ -51,7 +53,7 @@
     }
 
     public String getStringValue(ExecutionContext context) {
-        return (String) getObject(context);
+        return getObject(context).toString();
     }      
     
     public String toString() {
@@ -64,4 +66,11 @@
         }
     }
     
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        Object o1 = getObject(context);
+        Object o2 = other.getObject( context );
+        return o1.equals(o2);
+    }
+    
+    
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/BooleanValueHandler.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -90,5 +90,7 @@
         return true;
     }
     
-    
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        return getBooleanValue( context ) == other.getBooleanValue( context );
+    }
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPLocalDeclarationVariable.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -91,5 +91,10 @@
         String name = getClass().getName();
         name = name.substring( name.lastIndexOf( "." ) + 1 );
         return "[" + name + " identifier = '" + getIdentifier()  + "']";
+    }  
+    
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        // FIXME
+        return false;
     }    
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/CLPPreviousDeclarationVariable.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -103,5 +103,10 @@
         name = name.substring( name.lastIndexOf( "." ) + 1 );
         return "[" + name + " identifier = '" + getIdentifier()  + "']";
     }    
+    
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        // FIXME
+        return false;
+    }        
         
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/DoubleValueHandler.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -92,5 +92,9 @@
         return true;
     }
     
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        return getDoubleValue( context ) == other.getDoubleValue( context );        
+    }     
     
+    
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/FunctionCaller.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -79,6 +79,9 @@
     }
 
     public void replaceTempTokens(Map variables) {
+        if ( this.parameters == null ) {
+            return;
+        }
         for ( int i = 0, length = this.parameters.length; i < length; i++ ) {
             if ( this.parameters[i] instanceof TempTokenVariable ) {
                 TempTokenVariable var = (TempTokenVariable) this.parameters[i];
@@ -130,5 +133,9 @@
     public String toString() {
         return "[FunctionCaller " + this.function + "]";
     }
+    
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        return this == other;
+    }
 
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ListValueHandler.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -151,4 +151,13 @@
 
         return b.toString();
     }
+    
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        for ( int i = 0, length = this.list.length; i < length; i++ ) {
+            if ( !getValue( context ).equals( other.getValue( context ), context) ) {
+                return false;
+            }
+        }         
+        return true;
+    }     
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/LongValueHandler.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -90,5 +90,8 @@
         return true;
     }      
     
+    public boolean equals(ValueHandler other, ExecutionContext context) {
+        return getLongValue( context ) == other.getLongValue( context );        
+    } 
     
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/java/org/drools/clp/valuehandlers/ObjectValueHandler.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -4,9 +4,7 @@
 import org.drools.clp.ExecutionContext;
 import org.drools.clp.ValueHandler;
 
-public class ObjectValueHandler extends BaseValueHandler {
-    public static final ObjectValueHandler NULL = new ObjectValueHandler( "null" );    
-    
+public class ObjectValueHandler extends BaseValueHandler {    
     private Object objectValue;       
     
     public ObjectValueHandler(Object objectValue) {
@@ -27,6 +25,6 @@
     
     public Object getObject(ExecutionContext context) {
         return this.objectValue;
-    }
-
+    }    
+    
 }

Modified: labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/main/resources/org/drools/clp/functions.conf	2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,8 +1,23 @@
+#working with vars
+org.drools.clp.functions.BindFunction
+org.drools.clp.functions.ModifyFunction
 org.drools.clp.functions.CreateListFunction
-org.drools.clp.functions.AddFunction
+
+#flow control
 org.drools.clp.functions.IfFunction
+org.drools.clp.functions.BreakFunction
+org.drools.clp.functions.SwitchFunction
+org.drools.clp.functions.SwitchCaseFunction
+org.drools.clp.functions.SwitchDefaultFunction
 org.drools.clp.functions.WhileFunction
 org.drools.clp.functions.ForeachFunction
+
+#math comparators
 org.drools.clp.functions.LessThanFunction
-org.drools.clp.functions.BindFunction
-org.drools.clp.functions.ModifyFunction
\ No newline at end of file
+org.drools.clp.functions.EqFunction
+
+#math operators
+org.drools.clp.functions.AddFunction
+
+#io
+org.drools.clp.functions.PrintoutFunction

Deleted: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,410 +0,0 @@
-package org.drools.clp;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CharStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.TokenStream;
-import org.drools.clp.valuehandlers.DoubleValueHandler;
-import org.drools.clp.valuehandlers.FunctionCaller;
-import org.drools.clp.valuehandlers.LongValueHandler;
-import org.drools.compiler.SwitchingCommonTokenStream;
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.AttributeDescr;
-import org.drools.lang.descr.ColumnDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.PredicateDescr;
-import org.drools.lang.descr.RestrictionConnectiveDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-
-public class ClpParserTest extends TestCase {
-
-    private CLPParser parser;
-    
-    FunctionRegistry registry;
-    
-    public void setUp() {
-        this.registry = new FunctionRegistry( BuiltinFunctions.getInstance() );
-    }
-    
-    protected void tearDown() throws Exception {
-        super.tearDown();
-        this.parser = null;
-    }
-
-    public void testParseFunction() throws Exception {        
-        ExecutionBuildContext context = new ExecutionBuildContext( new CLPPredicate(), this.registry );
-        FunctionCaller fc = ( FunctionCaller ) parse( "(< 1 2)" ).lisp_list( context, new LispForm(context) );
-        
-        assertEquals( "<", fc.getName() );        
-        assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
-        assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );
-    }
-    
-    public void testPatternsRule() throws Exception {
-        RuleDescr rule = parse( "(defrule xxx ?b <- (person (name \"yyy\"&?bf|~\"zzz\"|~=(+ 2 3)&:(< 1 2)) ) ?c <- (hobby (type ?bf2&~iii) (rating fivestar) ) => )" ).defrule();
-
-        assertEquals( "xxx",
-                      rule.getName() );
-
-        AndDescr lhs = rule.getLhs();
-        List lhsList = lhs.getDescrs();
-        assertEquals( 2,
-                      lhsList.size() );
-
-        // Parse the first column
-        ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
-        assertEquals( "?b",
-                      col.getIdentifier() );
-        assertEquals( "person",
-                      col.getObjectType() );
-
-        List colList = col.getDescrs();
-        assertEquals( 2,
-                      colList.size() );
-        FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
-        List restrictionList = fieldConstraintDescr.getRestrictions();
-
-        assertEquals( "name",
-                      fieldConstraintDescr.getFieldName() );
-        // @todo the 7th one has no constraint, as its a predicate, have to figure out how to handle this
-        assertEquals( 8,
-                      restrictionList.size() );
-
-        LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
-        assertEquals( "==",
-                      litDescr.getEvaluator() );
-        assertEquals( "yyy",
-                      litDescr.getText() );
-
-        RestrictionConnectiveDescr connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
-        assertEquals( RestrictionConnectiveDescr.AND,
-                      connDescr.getConnective() );
-
-        VariableRestrictionDescr varDescr = (VariableRestrictionDescr) restrictionList.get( 2 );
-        assertEquals( "==",
-                      varDescr.getEvaluator() );
-        assertEquals( "?bf",
-                      varDescr.getIdentifier() );
-
-        connDescr = (RestrictionConnectiveDescr) restrictionList.get( 3 );
-        assertEquals( RestrictionConnectiveDescr.OR,
-                      connDescr.getConnective() );
-
-        litDescr = (LiteralRestrictionDescr) restrictionList.get( 4 );
-        assertEquals( "!=",
-                      litDescr.getEvaluator() );
-        assertEquals( "zzz",
-                      litDescr.getText() );
-
-        connDescr = (RestrictionConnectiveDescr) restrictionList.get( 5 );
-        assertEquals( RestrictionConnectiveDescr.OR,
-                      connDescr.getConnective() );
-
-        ReturnValueRestrictionDescr retDescr = (ReturnValueRestrictionDescr) restrictionList.get( 6 );
-        assertEquals( "!=",
-                      retDescr.getEvaluator() );
-        CLPReturnValue clprv = ( CLPReturnValue ) retDescr.getContent();
-        FunctionCaller fc = clprv.getFunctions()[0];
-        assertEquals( "+", fc.getName() );        
-        assertEquals( new LongValueHandler( 2 ), fc.getParameters()[0] );
-        assertEquals( new LongValueHandler( 3 ), fc.getParameters()[1] );       
-
-        PredicateDescr predicateDescr = (PredicateDescr) colList.get( 1 );        
-        CLPPredicate clpp = ( CLPPredicate ) predicateDescr.getContent();
-        fc = clpp.getFunctions()[0];
-        assertEquals( "<", fc.getName() );        
-        assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
-        assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );        
-
-        // Parse the second column
-        col = (ColumnDescr) lhsList.get( 1 );
-        assertEquals( "?c",
-                      col.getIdentifier() );
-        assertEquals( "hobby",
-                      col.getObjectType() );
-
-        colList = col.getDescrs();
-        assertEquals( 2,
-                      colList.size() );
-        fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
-        restrictionList = fieldConstraintDescr.getRestrictions();
-
-        assertEquals( "type",
-                      fieldConstraintDescr.getFieldName() );
-
-        varDescr = (VariableRestrictionDescr) restrictionList.get( 0 );
-        assertEquals( "==",
-                      varDescr.getEvaluator() );
-        assertEquals( "?bf2",
-                      varDescr.getIdentifier() );
-
-        connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
-        assertEquals( RestrictionConnectiveDescr.AND,
-                      connDescr.getConnective() );
-
-        litDescr = (LiteralRestrictionDescr) restrictionList.get( 2 );
-        assertEquals( "!=",
-                      litDescr.getEvaluator() );
-        assertEquals( "iii",
-                      litDescr.getText() );
-
-        fieldConstraintDescr = (FieldConstraintDescr) colList.get( 1 );
-        restrictionList = fieldConstraintDescr.getRestrictions();
-
-        assertEquals( "rating",
-                      fieldConstraintDescr.getFieldName() );
-
-        litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
-        assertEquals( "==",
-                      litDescr.getEvaluator() );
-        assertEquals( "fivestar",
-                      litDescr.getText() );
-    }
-
-    public void testNestedCERule() throws Exception {
-        RuleDescr rule = parse( "(defrule xxx ?b <- (person (name yyy)) (or (and (hobby1 (type qqq1)) (hobby2 (type ~qqq2))) (food (veg ~shroom) ) ) => )" ).defrule();
-
-        assertEquals( "xxx",
-                      rule.getName() );
-
-        AndDescr lhs = rule.getLhs();
-        List lhsList = lhs.getDescrs();
-        assertEquals( 2,
-                      lhsList.size() );
-
-        // Parse the first column
-        ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
-        assertEquals( "?b",
-                      col.getIdentifier() );
-        assertEquals( "person",
-                      col.getObjectType() );
-        FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
-        assertEquals( "name",
-                      fieldConstraintDescr.getFieldName() ); //         
-        LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "==",
-                      litDescr.getEvaluator() );
-        assertEquals( "yyy",
-                      litDescr.getText() );
-
-        OrDescr orDescr = (OrDescr) lhsList.get( 1 );
-        assertEquals( 2,
-                      orDescr.getDescrs().size() );
-
-        AndDescr andDescr = (AndDescr) orDescr.getDescrs().get( 0 );
-        col = (ColumnDescr) andDescr.getDescrs().get( 0 );
-        assertEquals( "hobby1",
-                      col.getObjectType() );
-        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
-        assertEquals( "type",
-                      fieldConstraintDescr.getFieldName() ); //         
-        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "==",
-                      litDescr.getEvaluator() );
-        assertEquals( "qqq1",
-                      litDescr.getText() );
-
-        col = (ColumnDescr) andDescr.getDescrs().get( 1 );
-        assertEquals( "hobby2",
-                      col.getObjectType() );
-        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
-        assertEquals( "type",
-                      fieldConstraintDescr.getFieldName() ); //         
-        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "!=",
-                      litDescr.getEvaluator() );
-        assertEquals( "qqq2",
-                      litDescr.getText() );
-
-        col = (ColumnDescr) orDescr.getDescrs().get( 1 );
-        assertEquals( "food",
-                      col.getObjectType() );
-        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
-        assertEquals( "veg",
-                      fieldConstraintDescr.getFieldName() ); //         
-        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "!=",
-                      litDescr.getEvaluator() );
-        assertEquals( "shroom",
-                      litDescr.getText() );
-    }
-
-    public void testNotExistsRule() throws Exception {
-        RuleDescr rule = parse( "(defrule xxx (or (hobby1 (type qqq1)) (not (and (exists (person (name ppp))) (person (name yyy))))) => )" ).defrule();
-
-        assertEquals( "xxx",
-                      rule.getName() );
-
-        AndDescr lhs = rule.getLhs();
-        List lhsList = lhs.getDescrs();
-        assertEquals( 1,
-                      lhsList.size() );
-
-        OrDescr orDescr = (OrDescr) lhsList.get( 0 );
-        assertEquals( 2,
-                      orDescr.getDescrs().size() );
-
-        ColumnDescr col = (ColumnDescr) orDescr.getDescrs().get( 0 );
-        assertEquals( "hobby1",
-                      col.getObjectType() );
-        FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
-        assertEquals( "type",
-                      fieldConstraintDescr.getFieldName() ); //         
-        LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "==",
-                      litDescr.getEvaluator() );
-        assertEquals( "qqq1",
-                      litDescr.getText() );
-
-        NotDescr notDescr = (NotDescr) orDescr.getDescrs().get( 1 );
-        assertEquals( 1,
-                      notDescr.getDescrs().size() );
-        
-        AndDescr andDescr = (AndDescr) notDescr.getDescrs().get( 0 );
-        assertEquals( 2, andDescr.getDescrs().size() );
-        ExistsDescr existsDescr = (ExistsDescr) andDescr.getDescrs().get( 0 );
-        col = (ColumnDescr) existsDescr.getDescrs().get( 0 );
-        assertEquals( "person",
-                      col.getObjectType() );
-        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
-        assertEquals( "name",
-                      fieldConstraintDescr.getFieldName() ); //         
-        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "==",
-                      litDescr.getEvaluator() );
-        assertEquals( "ppp",
-                      litDescr.getText() );              
-        
-        col = (ColumnDescr) andDescr.getDescrs().get( 1 );
-        assertEquals( "person",
-                      col.getObjectType() );
-        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
-        assertEquals( "name",
-                      fieldConstraintDescr.getFieldName() ); //         
-        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
-        assertEquals( "==",
-                      litDescr.getEvaluator() );
-        assertEquals( "yyy",
-                      litDescr.getText() );  
-    }
-    
-    public void testTestRule() throws Exception {
-        RuleDescr rule = parse( "(defrule xxx (test (< 9.0 1.3) ) => )" ).defrule();
-
-        assertEquals( "xxx",
-                      rule.getName() );
-
-        AndDescr lhs = rule.getLhs();
-        List lhsList = lhs.getDescrs();
-        assertEquals( 1,
-                      lhsList.size() );
-
-        EvalDescr evalDescr = (EvalDescr) lhsList.get( 0 );
-        
-        CLPEval clpe = ( CLPEval ) evalDescr.getContent();
-        FunctionCaller f = clpe.getFunctions()[0];
-        assertEquals( "<", f.getName() );        
-        assertEquals( new DoubleValueHandler( 9.0 ), f.getParameters()[0] );
-        assertEquals( new DoubleValueHandler( 1.3 ), f.getParameters()[1] );          
-    }
-
-    public void testRuleHeader() throws Exception {
-        RuleDescr rule = parse( "(defrule MAIN::name \"docs\"(declare (salience -100) ) => )" ).defrule();
-        
-        List attributes = rule.getAttributes();
-        AttributeDescr module = ( AttributeDescr ) attributes.get( 0 );
-        assertEquals( "agenda-group", module.getName() );
-        assertEquals( "MAIN", module.getValue() );
-        
-        assertEquals("name", rule.getName() );
-        
-        AttributeDescr salience = ( AttributeDescr ) attributes.get( 1 );
-        assertEquals( "salience", salience.getName() );
-        assertEquals( "-100", salience.getValue() );
-        
-        
-    }
-    
-    private CLPParser parse(final String text) throws Exception {
-        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
-        return this.parser;
-    }
-
-    private CLPParser parse(final String source,
-                            final String text) throws Exception {
-        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
-        this.parser.setSource( source );
-        return this.parser;
-    }
-
-    private Reader getReader(final String name) throws Exception {
-        final InputStream in = getClass().getResourceAsStream( name );
-
-        return new InputStreamReader( in );
-    }
-
-    private CLPParser parseResource(final String name) throws Exception {
-
-        //        System.err.println( getClass().getResource( name ) );
-        Reader reader = getReader( name );
-
-        final StringBuffer text = new StringBuffer();
-
-        final char[] buf = new char[1024];
-        int len = 0;
-
-        while ( (len = reader.read( buf )) >= 0 ) {
-            text.append( buf,
-                         0,
-                         len );
-        }
-
-        return parse( name,
-                      text.toString() );
-    }
-
-    private CharStream newCharStream(final String text) {
-        return new ANTLRStringStream( text );
-    }
-
-    private CLPLexer newLexer(final CharStream charStream) {
-        return new CLPLexer( charStream );
-    }
-
-    private TokenStream newTokenStream(final Lexer lexer) {
-        return new SwitchingCommonTokenStream( lexer );
-    }
-
-    private CLPParser newParser(final TokenStream tokenStream) {
-        final CLPParser p = new CLPParser( tokenStream );
-        p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() )  );
-        //p.setParserDebug( true );
-        return p;
-    }
-
-    private void assertEqualsIgnoreWhitespace(final String expected,
-                                              final String actual) {
-        final String cleanExpected = expected.replaceAll( "\\s+",
-                                                          "" );
-        final String cleanActual = actual.replaceAll( "\\s+",
-                                                      "" );
-
-        assertEquals( cleanExpected,
-                      cleanActual );
-    }
-
-}

Copied: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java (from rev 10555, labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledFunctionsTest.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,281 @@
+package org.drools.clp;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.Lexer;
+import org.antlr.runtime.TokenStream;
+import org.drools.Person;
+import org.drools.clp.valuehandlers.ListValueHandler;
+import org.drools.clp.valuehandlers.LocalVariableValue;
+import org.drools.clp.valuehandlers.LongValueHandler;
+import org.drools.clp.valuehandlers.ObjectValueHandler;
+import org.drools.compiler.SwitchingCommonTokenStream;
+
+import junit.framework.TestCase;
+
+public class CompiledFunctionsTest extends TestCase {
+    private CLPParser parser;
+
+    public void testBindAndModify() throws Exception {
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (+ 20 11) ) (modify ?p (age ?x) )" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         2 );
+
+        Map vars = new HashMap();
+        Person p = new Person( "mark" );
+        vars.put( "?p",
+                  new ObjectValueHandler( p ) );
+        engine.replaceTempTokens( vars );
+
+        engine.execute( context );
+
+        assertEquals( 31,
+                      p.getAge() );
+    }
+
+    public void testSimpleCreate$() throws Exception {
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 3) )" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         1 );
+        engine.execute( context );
+
+        ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
+
+        assertEquals( 3,
+                      list.size() );
+
+        assertEquals( 1,
+                      list.getList()[0].getIntValue( context ) );
+        assertEquals( 2,
+                      list.getList()[1].getIntValue( context ) );
+        assertEquals( 3,
+                      list.getList()[2].getIntValue( context ) );
+    }
+
+    public void testNestedCreate$() throws Exception {
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 (+ 1 2) ) ) (bind ?y (create$ (+ 1 0) ?x (create$ a b ?x (+ 1 1) ) 3) )" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         2 );
+        engine.execute( context );
+
+        // check ?x
+        ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
+        assertEquals( 3,
+                      list.size() );
+        assertEquals( 1,
+                      list.getList()[0].getIntValue( context ) );
+        assertEquals( 2,
+                      list.getList()[1].getIntValue( context ) );
+        assertEquals( new BigDecimal( 3 ),
+                      list.getList()[2].getBigDecimalValue( context ) );
+
+        // check ?y
+        list = (ListValueHandler) context.getLocalVariable( 1 );
+        assertEquals( 11,
+                      list.size() );
+
+        assertEquals( new BigDecimal( 1 ),
+                      list.getList()[0].getBigDecimalValue( context ) );
+        assertEquals( 1,
+                      list.getList()[1].getIntValue( context ) );
+        assertEquals( 2,
+                      list.getList()[2].getIntValue( context ) );
+        assertEquals( new BigDecimal( 3 ),
+                      list.getList()[3].getBigDecimalValue( context ) );
+        assertEquals( "a",
+                      list.getList()[4].getStringValue( context ) );
+        assertEquals( "b",
+                      list.getList()[5].getStringValue( context ) );
+        assertEquals( 1,
+                      list.getList()[6].getIntValue( context ) );
+        assertEquals( 2,
+                      list.getList()[7].getIntValue( context ) );
+        assertEquals( new BigDecimal( 3 ),
+                      list.getList()[8].getBigDecimalValue( context ) );
+        assertEquals( new BigDecimal( 2 ),
+                      list.getList()[9].getBigDecimalValue( context ) );
+        assertEquals( 3,
+                      list.getList()[10].getIntValue( context ) );
+    }
+
+    public void testIf() throws Exception {
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(if (< ?x ?y ) then (modify ?p (age 15) ) else (modify ?p (age 5)))" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         2 );
+
+        Person p = new Person( "mark" );
+        Map vars = new HashMap();
+
+        vars.put( "?x",
+                  new LongValueHandler( 10 ) );
+        vars.put( "?y",
+                  new LocalVariableValue( "?y",
+                                          0 ) );
+        vars.put( "?p",
+                  new ObjectValueHandler( p ) );
+        engine.replaceTempTokens( vars );
+
+        context.setLocalVariable( 0,
+                                  new LongValueHandler( 20 ) );
+
+        engine.execute( context );
+        assertEquals( 15,
+                      p.getAge() );
+
+        context.setLocalVariable( 0,
+                                  new LongValueHandler( 7 ) );
+        engine.execute( context );
+        assertEquals( 5,
+                      p.getAge() );
+    }
+
+    public void testWhile() throws Exception {
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(while (< ?x ?y) do (bind ?x (+ ?x 1) ) )" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         2 );
+
+        Map vars = new HashMap();
+
+        vars.put( "?x",
+                  new LocalVariableValue( "?x",
+                                          0 ) );
+        vars.put( "?y",
+                  new LocalVariableValue( "?y",
+                                          1 ) );
+        engine.replaceTempTokens( vars );
+
+        context.setLocalVariable( 0,
+                                  new LongValueHandler( 0 ) );
+        context.setLocalVariable( 1,
+                                  new LongValueHandler( 10 ) );
+
+        engine.execute( context );
+        assertEquals( new BigDecimal( 10 ),
+                      context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
+    }
+
+    public void testForeach() throws Exception {
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x 0) (foreach ?e (create$ 1 2 3) (bind ?x (+ ?x ?e) ) )" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         2 );
+        engine.execute( context );
+        assertEquals( new BigDecimal( 6 ),
+                      context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
+    }
+    
+    public void testSwitch() throws Exception {
+        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?cheese ?var) (switch ?cheese (case stilton then (bind ?x ?cheese ) (printout t xxx (eq 1 1) (create$ x y) zzz) (break) ) (case cheddar then (bind ?x ?cheese ) (break) ) (default (bind ?x \"default\" ) ) )" ).rhs();
+        ExecutionContext context = new ExecutionContext( null,
+                                                         null,
+                                                         3 );
+
+        Map vars = new HashMap();
+
+        vars.put( "?var",
+                  new LocalVariableValue( "?var",
+                                          2 ) );        
+        engine.replaceTempTokens( vars );
+
+        // try it with stilton
+        context.setLocalVariable( 2,
+                                  new ObjectValueHandler( "stilton" ) );
+        engine.execute( context );        
+        assertEquals( "stilton" ,
+                      context.getLocalVariable( 1 ).getObject( context ) );
+
+        // try it with cheddar        
+        context.setLocalVariable( 2,
+                                  new ObjectValueHandler( "cheddar" ) );
+        engine.execute( context );        
+        assertEquals( "cheddar" ,
+                      context.getLocalVariable( 1 ).getObject( context ) );        
+        
+        // try it with a brie, which has no matching case        
+        context.setLocalVariable( 2,
+                                  new ObjectValueHandler( "brie" ) );
+        engine.execute( context );        
+        assertEquals( "default" ,
+                      context.getLocalVariable( 1 ).getObject( context ) );          
+        
+        
+    }    
+
+    private CLPParser parse(final String text) throws Exception {
+        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+        return this.parser;
+    }
+
+    private CLPParser parse(final String source,
+                            final String text) throws Exception {
+        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+        this.parser.setSource( source );
+        return this.parser;
+    }
+
+    private Reader getReader(final String name) throws Exception {
+        final InputStream in = getClass().getResourceAsStream( name );
+
+        return new InputStreamReader( in );
+    }
+
+    private CLPParser parseResource(final String name) throws Exception {
+        Reader reader = getReader( name );
+
+        final StringBuffer text = new StringBuffer();
+
+        final char[] buf = new char[1024];
+        int len = 0;
+
+        while ( (len = reader.read( buf )) >= 0 ) {
+            text.append( buf,
+                         0,
+                         len );
+        }
+
+        return parse( name,
+                      text.toString() );
+    }
+
+    private CharStream newCharStream(final String text) {
+        return new ANTLRStringStream( text );
+    }
+
+    private CLPLexer newLexer(final CharStream charStream) {
+        return new CLPLexer( charStream );
+    }
+
+    private TokenStream newTokenStream(final Lexer lexer) {
+        return new SwitchingCommonTokenStream( lexer );
+    }
+
+    private CLPParser newParser(final TokenStream tokenStream) {
+        final CLPParser p = new CLPParser( tokenStream );
+        p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() ) );
+        //p.setParserDebug( true );
+        return p;
+    }
+
+    private void assertEqualsIgnoreWhitespace(final String expected,
+                                              final String actual) {
+        final String cleanExpected = expected.replaceAll( "\\s+",
+                                                          "" );
+        final String cleanActual = actual.replaceAll( "\\s+",
+                                                      "" );
+
+        assertEquals( cleanExpected,
+                      cleanActual );
+    }
+}

Deleted: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java	2007-03-27 21:46:41 UTC (rev 10564)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/CompiledParserTest.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -1,254 +0,0 @@
-package org.drools.clp;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CharStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.TokenStream;
-import org.drools.Person;
-import org.drools.clp.valuehandlers.ListValueHandler;
-import org.drools.clp.valuehandlers.LocalVariableValue;
-import org.drools.clp.valuehandlers.LongValueHandler;
-import org.drools.clp.valuehandlers.ObjectValueHandler;
-import org.drools.compiler.SwitchingCommonTokenStream;
-
-import junit.framework.TestCase;
-
-public class CompiledParserTest extends TestCase {
-    private CLPParser parser;
-
-    public void testBindAndModify() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (+ 20 11) ) (modify ?p (age ?x) )" ).rhs();
-        ExecutionContext context = new ExecutionContext( null,
-                                                         null,
-                                                         2 );
-
-        Map vars = new HashMap();
-        Person p = new Person( "mark" );
-        vars.put( "?p",
-                  new ObjectValueHandler( p ) );
-        engine.replaceTempTokens( vars );
-
-        engine.execute( context );
-
-        assertEquals( 31,
-                      p.getAge() );
-    }
-
-    public void testSimpleCreate$() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 3) )" ).rhs();
-        ExecutionContext context = new ExecutionContext( null,
-                                                         null,
-                                                         1 );
-        engine.execute( context );
-
-        ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
-
-        assertEquals( 3,
-                      list.size() );
-
-        assertEquals( 1,
-                      list.getList()[0].getIntValue( context ) );
-        assertEquals( 2,
-                      list.getList()[1].getIntValue( context ) );
-        assertEquals( 3,
-                      list.getList()[2].getIntValue( context ) );
-    }
-
-    public void testNestedCreate$() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x (create$ 1 2 (+ 1 2) ) ) (bind ?y (create$ (+ 1 0) ?x (create$ a b ?x (+ 1 1) ) 3) )" ).rhs();
-        ExecutionContext context = new ExecutionContext( null,
-                                                         null,
-                                                         2 );
-        engine.execute( context );
-
-        // check ?x
-        ListValueHandler list = (ListValueHandler) context.getLocalVariable( 0 );
-        assertEquals( 3,
-                      list.size() );
-        assertEquals( 1,
-                      list.getList()[0].getIntValue( context ) );
-        assertEquals( 2,
-                      list.getList()[1].getIntValue( context ) );
-        assertEquals( new BigDecimal( 3 ),
-                      list.getList()[2].getBigDecimalValue( context ) );
-
-        // check ?y
-        list = (ListValueHandler) context.getLocalVariable( 1 );
-        assertEquals( 11,
-                      list.size() );
-
-        assertEquals( new BigDecimal( 1 ),
-                      list.getList()[0].getBigDecimalValue( context ) );
-        assertEquals( 1,
-                      list.getList()[1].getIntValue( context ) );
-        assertEquals( 2,
-                      list.getList()[2].getIntValue( context ) );
-        assertEquals( new BigDecimal( 3 ),
-                      list.getList()[3].getBigDecimalValue( context ) );
-        assertEquals( "a",
-                      list.getList()[4].getStringValue( context ) );
-        assertEquals( "b",
-                      list.getList()[5].getStringValue( context ) );
-        assertEquals( 1,
-                      list.getList()[6].getIntValue( context ) );
-        assertEquals( 2,
-                      list.getList()[7].getIntValue( context ) );
-        assertEquals( new BigDecimal( 3 ),
-                      list.getList()[8].getBigDecimalValue( context ) );
-        assertEquals( new BigDecimal( 2 ),
-                      list.getList()[9].getBigDecimalValue( context ) );
-        assertEquals( 3,
-                      list.getList()[10].getIntValue( context ) );
-    }
-
-    public void testIf() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(if (< ?x ?y ) then (modify ?p (age 15) ) else (modify ?p (age 5)))" ).rhs();
-        ExecutionContext context = new ExecutionContext( null,
-                                                         null,
-                                                         2 );
-
-        Person p = new Person( "mark" );
-        Map vars = new HashMap();
-
-        vars.put( "?x",
-                  new LongValueHandler( 10 ) );
-        vars.put( "?y",
-                  new LocalVariableValue( "?y",
-                                          0 ) );
-        vars.put( "?p",
-                  new ObjectValueHandler( p ) );
-        engine.replaceTempTokens( vars );
-
-        context.setLocalVariable( 0,
-                                  new LongValueHandler( 20 ) );
-
-        engine.execute( context );
-        assertEquals( 15,
-                      p.getAge() );
-
-        context.setLocalVariable( 0,
-                                  new LongValueHandler( 7 ) );
-        engine.execute( context );
-        assertEquals( 5,
-                      p.getAge() );
-    }
-
-    public void testWhile() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(while (< ?x ?y) do (bind ?x (+ ?x 1) ) )" ).rhs();
-        ExecutionContext context = new ExecutionContext( null,
-                                                         null,
-                                                         2 );
-
-        Map vars = new HashMap();
-
-        vars.put( "?x",
-                  new LocalVariableValue( "?x",
-                                          0 ) );
-        vars.put( "?y",
-                  new LocalVariableValue( "?y",
-                                          1 ) );
-        engine.replaceTempTokens( vars );
-
-        context.setLocalVariable( 0,
-                                  new LongValueHandler( 0 ) );
-        context.setLocalVariable( 1,
-                                  new LongValueHandler( 10 ) );
-
-        engine.execute( context );
-        assertEquals( new BigDecimal( 10 ),
-                      context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
-    }
-
-    public void testForeach() throws Exception {
-        BlockExecutionEngine engine = (BlockExecutionEngine) parse( "(bind ?x 0) (foreach ?e (create$ 1 2 3) (bind ?x (+ ?x ?e) ) )" ).rhs();
-        ExecutionContext context = new ExecutionContext( null,
-                                                         null,
-                                                         2 );
-
-        Map vars = new HashMap();
-
-        vars.put( "?x",
-                  new LocalVariableValue( "?x",
-                                          0 ) );
-        engine.replaceTempTokens( vars );
-
-        context.setLocalVariable( 0,
-                                  new LongValueHandler( 0 ) );
-        engine.execute( context );
-        assertEquals( new BigDecimal( 6 ),
-                      context.getLocalVariable( 0 ).getBigDecimalValue( context ) );
-    }
-
-    private CLPParser parse(final String text) throws Exception {
-        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
-        return this.parser;
-    }
-
-    private CLPParser parse(final String source,
-                            final String text) throws Exception {
-        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
-        this.parser.setSource( source );
-        return this.parser;
-    }
-
-    private Reader getReader(final String name) throws Exception {
-        final InputStream in = getClass().getResourceAsStream( name );
-
-        return new InputStreamReader( in );
-    }
-
-    private CLPParser parseResource(final String name) throws Exception {
-        Reader reader = getReader( name );
-
-        final StringBuffer text = new StringBuffer();
-
-        final char[] buf = new char[1024];
-        int len = 0;
-
-        while ( (len = reader.read( buf )) >= 0 ) {
-            text.append( buf,
-                         0,
-                         len );
-        }
-
-        return parse( name,
-                      text.toString() );
-    }
-
-    private CharStream newCharStream(final String text) {
-        return new ANTLRStringStream( text );
-    }
-
-    private CLPLexer newLexer(final CharStream charStream) {
-        return new CLPLexer( charStream );
-    }
-
-    private TokenStream newTokenStream(final Lexer lexer) {
-        return new SwitchingCommonTokenStream( lexer );
-    }
-
-    private CLPParser newParser(final TokenStream tokenStream) {
-        final CLPParser p = new CLPParser( tokenStream );
-        p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() ) );
-        //p.setParserDebug( true );
-        return p;
-    }
-
-    private void assertEqualsIgnoreWhitespace(final String expected,
-                                              final String actual) {
-        final String cleanExpected = expected.replaceAll( "\\s+",
-                                                          "" );
-        final String cleanActual = actual.replaceAll( "\\s+",
-                                                      "" );
-
-        assertEquals( cleanExpected,
-                      cleanActual );
-    }
-}

Copied: labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java (from rev 10555, labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/ClpParserTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-clips/src/test/java/org/drools/clp/LhsClpParserTest.java	2007-03-28 03:03:37 UTC (rev 10565)
@@ -0,0 +1,410 @@
+package org.drools.clp;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.Lexer;
+import org.antlr.runtime.TokenStream;
+import org.drools.clp.valuehandlers.DoubleValueHandler;
+import org.drools.clp.valuehandlers.FunctionCaller;
+import org.drools.clp.valuehandlers.LongValueHandler;
+import org.drools.compiler.SwitchingCommonTokenStream;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.ColumnDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+
+public class LhsClpParserTest extends TestCase {
+
+    private CLPParser parser;
+    
+    FunctionRegistry registry;
+    
+    public void setUp() {
+        this.registry = new FunctionRegistry( BuiltinFunctions.getInstance() );
+    }
+    
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        this.parser = null;
+    }
+
+    public void testParseFunction() throws Exception {        
+        ExecutionBuildContext context = new ExecutionBuildContext( new CLPPredicate(), this.registry );
+        FunctionCaller fc = ( FunctionCaller ) parse( "(< 1 2)" ).lisp_list( context, new LispForm(context) );
+        
+        assertEquals( "<", fc.getName() );        
+        assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
+        assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );
+    }
+    
+    public void testPatternsRule() throws Exception {
+        RuleDescr rule = parse( "(defrule xxx ?b <- (person (name \"yyy\"&?bf|~\"zzz\"|~=(+ 2 3)&:(< 1 2)) ) ?c <- (hobby (type ?bf2&~iii) (rating fivestar) ) => )" ).defrule();
+
+        assertEquals( "xxx",
+                      rule.getName() );
+
+        AndDescr lhs = rule.getLhs();
+        List lhsList = lhs.getDescrs();
+        assertEquals( 2,
+                      lhsList.size() );
+
+        // Parse the first column
+        ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
+        assertEquals( "?b",
+                      col.getIdentifier() );
+        assertEquals( "person",
+                      col.getObjectType() );
+
+        List colList = col.getDescrs();
+        assertEquals( 2,
+                      colList.size() );
+        FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
+        List restrictionList = fieldConstraintDescr.getRestrictions();
+
+        assertEquals( "name",
+                      fieldConstraintDescr.getFieldName() );
+        // @todo the 7th one has no constraint, as its a predicate, have to figure out how to handle this
+        assertEquals( 8,
+                      restrictionList.size() );
+
+        LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
+        assertEquals( "==",
+                      litDescr.getEvaluator() );
+        assertEquals( "yyy",
+                      litDescr.getText() );
+
+        RestrictionConnectiveDescr connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
+        assertEquals( RestrictionConnectiveDescr.AND,
+                      connDescr.getConnective() );
+
+        VariableRestrictionDescr varDescr = (VariableRestrictionDescr) restrictionList.get( 2 );
+        assertEquals( "==",
+                      varDescr.getEvaluator() );
+        assertEquals( "?bf",
+                      varDescr.getIdentifier() );
+
+        connDescr = (RestrictionConnectiveDescr) restrictionList.get( 3 );
+        assertEquals( RestrictionConnectiveDescr.OR,
+                      connDescr.getConnective() );
+
+        litDescr = (LiteralRestrictionDescr) restrictionList.get( 4 );
+        assertEquals( "!=",
+                      litDescr.getEvaluator() );
+        assertEquals( "zzz",
+                      litDescr.getText() );
+
+        connDescr = (RestrictionConnectiveDescr) restrictionList.get( 5 );
+        assertEquals( RestrictionConnectiveDescr.OR,
+                      connDescr.getConnective() );
+
+        ReturnValueRestrictionDescr retDescr = (ReturnValueRestrictionDescr) restrictionList.get( 6 );
+        assertEquals( "!=",
+                      retDescr.getEvaluator() );
+        CLPReturnValue clprv = ( CLPReturnValue ) retDescr.getContent();
+        FunctionCaller fc = clprv.getFunctions()[0];
+        assertEquals( "+", fc.getName() );        
+        assertEquals( new LongValueHandler( 2 ), fc.getParameters()[0] );
+        assertEquals( new LongValueHandler( 3 ), fc.getParameters()[1] );       
+
+        PredicateDescr predicateDescr = (PredicateDescr) colList.get( 1 );        
+        CLPPredicate clpp = ( CLPPredicate ) predicateDescr.getContent();
+        fc = clpp.getFunctions()[0];
+        assertEquals( "<", fc.getName() );        
+        assertEquals( new LongValueHandler( 1 ), fc.getParameters()[0] );
+        assertEquals( new LongValueHandler( 2 ), fc.getParameters()[1] );        
+
+        // Parse the second column
+        col = (ColumnDescr) lhsList.get( 1 );
+        assertEquals( "?c",
+                      col.getIdentifier() );
+        assertEquals( "hobby",
+                      col.getObjectType() );
+
+        colList = col.getDescrs();
+        assertEquals( 2,
+                      colList.size() );
+        fieldConstraintDescr = (FieldConstraintDescr) colList.get( 0 );
+        restrictionList = fieldConstraintDescr.getRestrictions();
+
+        assertEquals( "type",
+                      fieldConstraintDescr.getFieldName() );
+
+        varDescr = (VariableRestrictionDescr) restrictionList.get( 0 );
+        assertEquals( "==",
+                      varDescr.getEvaluator() );
+        assertEquals( "?bf2",
+                      varDescr.getIdentifier() );
+
+        connDescr = (RestrictionConnectiveDescr) restrictionList.get( 1 );
+        assertEquals( RestrictionConnectiveDescr.AND,
+                      connDescr.getConnective() );
+
+        litDescr = (LiteralRestrictionDescr) restrictionList.get( 2 );
+        assertEquals( "!=",
+                      litDescr.getEvaluator() );
+        assertEquals( "iii",
+                      litDescr.getText() );
+
+        fieldConstraintDescr = (FieldConstraintDescr) colList.get( 1 );
+        restrictionList = fieldConstraintDescr.getRestrictions();
+
+        assertEquals( "rating",
+                      fieldConstraintDescr.getFieldName() );
+
+        litDescr = (LiteralRestrictionDescr) restrictionList.get( 0 );
+        assertEquals( "==",
+                      litDescr.getEvaluator() );
+        assertEquals( "fivestar",
+                      litDescr.getText() );
+    }
+
+    public void testNestedCERule() throws Exception {
+        RuleDescr rule = parse( "(defrule xxx ?b <- (person (name yyy)) (or (and (hobby1 (type qqq1)) (hobby2 (type ~qqq2))) (food (veg ~shroom) ) ) => )" ).defrule();
+
+        assertEquals( "xxx",
+                      rule.getName() );
+
+        AndDescr lhs = rule.getLhs();
+        List lhsList = lhs.getDescrs();
+        assertEquals( 2,
+                      lhsList.size() );
+
+        // Parse the first column
+        ColumnDescr col = (ColumnDescr) lhsList.get( 0 );
+        assertEquals( "?b",
+                      col.getIdentifier() );
+        assertEquals( "person",
+                      col.getObjectType() );
+        FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+        assertEquals( "name",
+                      fieldConstraintDescr.getFieldName() ); //         
+        LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "==",
+                      litDescr.getEvaluator() );
+        assertEquals( "yyy",
+                      litDescr.getText() );
+
+        OrDescr orDescr = (OrDescr) lhsList.get( 1 );
+        assertEquals( 2,
+                      orDescr.getDescrs().size() );
+
+        AndDescr andDescr = (AndDescr) orDescr.getDescrs().get( 0 );
+        col = (ColumnDescr) andDescr.getDescrs().get( 0 );
+        assertEquals( "hobby1",
+                      col.getObjectType() );
+        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+        assertEquals( "type",
+                      fieldConstraintDescr.getFieldName() ); //         
+        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "==",
+                      litDescr.getEvaluator() );
+        assertEquals( "qqq1",
+                      litDescr.getText() );
+
+        col = (ColumnDescr) andDescr.getDescrs().get( 1 );
+        assertEquals( "hobby2",
+                      col.getObjectType() );
+        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+        assertEquals( "type",
+                      fieldConstraintDescr.getFieldName() ); //         
+        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "!=",
+                      litDescr.getEvaluator() );
+        assertEquals( "qqq2",
+                      litDescr.getText() );
+
+        col = (ColumnDescr) orDescr.getDescrs().get( 1 );
+        assertEquals( "food",
+                      col.getObjectType() );
+        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+        assertEquals( "veg",
+                      fieldConstraintDescr.getFieldName() ); //         
+        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "!=",
+                      litDescr.getEvaluator() );
+        assertEquals( "shroom",
+                      litDescr.getText() );
+    }
+
+    public void testNotExistsRule() throws Exception {
+        RuleDescr rule = parse( "(defrule xxx (or (hobby1 (type qqq1)) (not (and (exists (person (name ppp))) (person (name yyy))))) => )" ).defrule();
+
+        assertEquals( "xxx",
+                      rule.getName() );
+
+        AndDescr lhs = rule.getLhs();
+        List lhsList = lhs.getDescrs();
+        assertEquals( 1,
+                      lhsList.size() );
+
+        OrDescr orDescr = (OrDescr) lhsList.get( 0 );
+        assertEquals( 2,
+                      orDescr.getDescrs().size() );
+
+        ColumnDescr col = (ColumnDescr) orDescr.getDescrs().get( 0 );
+        assertEquals( "hobby1",
+                      col.getObjectType() );
+        FieldConstraintDescr fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+        assertEquals( "type",
+                      fieldConstraintDescr.getFieldName() ); //         
+        LiteralRestrictionDescr litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "==",
+                      litDescr.getEvaluator() );
+        assertEquals( "qqq1",
+                      litDescr.getText() );
+
+        NotDescr notDescr = (NotDescr) orDescr.getDescrs().get( 1 );
+        assertEquals( 1,
+                      notDescr.getDescrs().size() );
+        
+        AndDescr andDescr = (AndDescr) notDescr.getDescrs().get( 0 );
+        assertEquals( 2, andDescr.getDescrs().size() );
+        ExistsDescr existsDescr = (ExistsDescr) andDescr.getDescrs().get( 0 );
+        col = (ColumnDescr) existsDescr.getDescrs().get( 0 );
+        assertEquals( "person",
+                      col.getObjectType() );
+        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+        assertEquals( "name",
+                      fieldConstraintDescr.getFieldName() ); //         
+        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "==",
+                      litDescr.getEvaluator() );
+        assertEquals( "ppp",
+                      litDescr.getText() );              
+        
+        col = (ColumnDescr) andDescr.getDescrs().get( 1 );
+        assertEquals( "person",
+                      col.getObjectType() );
+        fieldConstraintDescr = (FieldConstraintDescr) col.getDescrs().get( 0 );
+        assertEquals( "name",
+                      fieldConstraintDescr.getFieldName() ); //         
+        litDescr = (LiteralRestrictionDescr) fieldConstraintDescr.getRestrictions().get( 0 );
+        assertEquals( "==",
+                      litDescr.getEvaluator() );
+        assertEquals( "yyy",
+                      litDescr.getText() );  
+    }
+    
+    public void testTestRule() throws Exception {
+        RuleDescr rule = parse( "(defrule xxx (test (< 9.0 1.3) ) => )" ).defrule();
+
+        assertEquals( "xxx",
+                      rule.getName() );
+
+        AndDescr lhs = rule.getLhs();
+        List lhsList = lhs.getDescrs();
+        assertEquals( 1,
+                      lhsList.size() );
+
+        EvalDescr evalDescr = (EvalDescr) lhsList.get( 0 );
+        
+        CLPEval clpe = ( CLPEval ) evalDescr.getContent();
+        FunctionCaller f = clpe.getFunctions()[0];
+        assertEquals( "<", f.getName() );        
+        assertEquals( new DoubleValueHandler( 9.0 ), f.getParameters()[0] );
+        assertEquals( new DoubleValueHandler( 1.3 ), f.getParameters()[1] );          
+    }
+
+    public void testRuleHeader() throws Exception {
+        RuleDescr rule = parse( "(defrule MAIN::name \"docs\"(declare (salience -100) ) => )" ).defrule();
+        
+        List attributes = rule.getAttributes();
+        AttributeDescr module = ( AttributeDescr ) attributes.get( 0 );
+        assertEquals( "agenda-group", module.getName() );
+        assertEquals( "MAIN", module.getValue() );
+        
+        assertEquals("name", rule.getName() );
+        
+        AttributeDescr salience = ( AttributeDescr ) attributes.get( 1 );
+        assertEquals( "salience", salience.getName() );
+        assertEquals( "-100", salience.getValue() );
+        
+        
+    }
+    
+    private CLPParser parse(final String text) throws Exception {
+        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+        return this.parser;
+    }
+
+    private CLPParser parse(final String source,
+                            final String text) throws Exception {
+        this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
+        this.parser.setSource( source );
+        return this.parser;
+    }
+
+    private Reader getReader(final String name) throws Exception {
+        final InputStream in = getClass().getResourceAsStream( name );
+
+        return new InputStreamReader( in );
+    }
+
+    private CLPParser parseResource(final String name) throws Exception {
+
+        //        System.err.println( getClass().getResource( name ) );
+        Reader reader = getReader( name );
+
+        final StringBuffer text = new StringBuffer();
+
+        final char[] buf = new char[1024];
+        int len = 0;
+
+        while ( (len = reader.read( buf )) >= 0 ) {
+            text.append( buf,
+                         0,
+                         len );
+        }
+
+        return parse( name,
+                      text.toString() );
+    }
+
+    private CharStream newCharStream(final String text) {
+        return new ANTLRStringStream( text );
+    }
+
+    private CLPLexer newLexer(final CharStream charStream) {
+        return new CLPLexer( charStream );
+    }
+
+    private TokenStream newTokenStream(final Lexer lexer) {
+        return new SwitchingCommonTokenStream( lexer );
+    }
+
+    private CLPParser newParser(final TokenStream tokenStream) {
+        final CLPParser p = new CLPParser( tokenStream );
+        p.setFunctionRegistry( new FunctionRegistry( BuiltinFunctions.getInstance() )  );
+        //p.setParserDebug( true );
+        return p;
+    }
+
+    private void assertEqualsIgnoreWhitespace(final String expected,
+                                              final String actual) {
+        final String cleanExpected = expected.replaceAll( "\\s+",
+                                                          "" );
+        final String cleanActual = actual.replaceAll( "\\s+",
+                                                      "" );
+
+        assertEquals( cleanExpected,
+                      cleanActual );
+    }
+
+}




More information about the jboss-svn-commits mailing list