Package org.drools.lang

Source Code of org.drools.lang.MVELDumperTest

package org.drools.lang;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import junit.framework.TestCase;

import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.drools.base.evaluators.MatchesEvaluatorsDefinition;
import org.drools.base.evaluators.SetEvaluatorsDefinition;
import org.drools.lang.descr.FieldConstraintDescr;
import org.drools.lang.descr.PatternDescr;

public class MVELDumperTest extends TestCase {

    private MVELDumper dumper;
   
    protected void setUp() throws Exception {
        super.setUp();
       
        // configure operators
        new SetEvaluatorsDefinition();
        new MatchesEvaluatorsDefinition();
       
        dumper = new MVELDumper();
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testDump() throws Exception {
        String input = "Cheese( price > 10 && < 20 || == $val || == 30 )";
        String expected = "( ( price > 10 && price < 20 ) || price == $val || price == 30 )" ;
        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
       
        FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
        String result = dumper.dump( fieldDescr );
       
        assertEquals( expected, result );
    }
   
    public void testDumpMatches() throws Exception {
        String input = "Cheese( type.toString matches \"something\\swith\\tsingle escapes\" )";
        String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
       
        FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
        String result = dumper.dump( fieldDescr );
       
        assertEquals( expected, result );
    }

    public void testDumpMatches2() throws Exception {
        String input = "Cheese( type.toString matches 'something\\swith\\tsingle escapes' )";
        String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);

        FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
        String result = dumper.dump( fieldDescr );
       
        assertEquals( expected, result );
    }

    public void testDumpMatches3() throws Exception {
        String input = "Map( this[\"content\"] matches \"hello ;=\" )";
        String expected = "this[\"content\"] ~= \"hello ;=\"" ;
        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
       
        FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
        String result = dumper.dump( fieldDescr );
       
        assertEquals( expected, result );
    }

    public void testDumpWithDateAttr() throws Exception {
        String input = "Person( son.birthDate == \"01-jan-2000\" )";
        String expected = "son.birthDate == org.drools.util.DateUtils.parseDate( \"01-jan-2000\" )" ;
        PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
       
        FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
        String result = dumper.dump( fieldDescr, true );
       
        assertEquals( expected, result );
    }

  private Object parse(String parserRuleName, String treeRuleName,
      final String text) throws Exception {
    return newParser(parserRuleName, treeRuleName, newCharStream(text));
  }

  private CharStream newCharStream(final String text) {
    return new ANTLRStringStream(text);
  }

  private Object newParser(String parserRuleName, String treeRuleName,
      final CharStream charStream) {
    return execTreeParser(parserRuleName, treeRuleName, charStream);
  }

  public Object execTreeParser(String testRuleName, String testTreeRuleName,
      CharStream charStream) {
    Object treeRuleReturn = null;
    try {
      DRLLexer lexer = new DRLLexer(charStream);
      CommonTokenStream tokens = new CommonTokenStream(lexer);
      DRLParser parser = new DRLParser(tokens);
      parser.setTreeAdaptor(new DroolsTreeAdaptor());
      /** Use Reflection to get rule method from parser */
      Method ruleName = Class.forName("org.drools.lang.DRLParser")
          .getMethod(testRuleName);

      /** Invoke grammar rule, and get the return value */
      Object ruleReturn = ruleName.invoke(parser);
     
      if (!parser.hasErrors()){
        Class _return = Class.forName("org.drools.lang.DRLParser" + "$"
            + testRuleName + "_return");
        Method returnName = _return.getMethod("getTree");
        DroolsTree tree = (DroolsTree) returnName.invoke(ruleReturn);

        // Walk resulting tree; create tree nodes stream first
        CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
        // AST nodes have payload that point into token stream
        nodes.setTokenStream(tokens);
        // Create a tree walker attached to the nodes stream
        DescrBuilderTree walker = new DescrBuilderTree(nodes);
        /** Invoke the tree rule, and store the return value if there is */
        Method treeRuleName = Class.forName(
            "org.drools.lang.DescrBuilderTree").getMethod(
            testTreeRuleName);
        treeRuleReturn = treeRuleName.invoke(walker);       
      }

      if (treeRuleReturn != null) {
        /** If return object is instanceof AST, get the toStringTree */
        if (treeRuleReturn.toString().indexOf(
            testTreeRuleName + "_return") > 0) {
          try { // NullPointerException may happen here...
            Class _treeReturn = Class
                .forName("org.drools.lang.DescrBuilderTree"
                    + "$" + testTreeRuleName + "_return");
            Field[] fields = _treeReturn.getDeclaredFields();
            for (Field field : fields) {
              if (field.getType().getName().contains(
                  "org.drools.lang.descr.")) {
                return field.get(treeRuleReturn);
              }
            }
          } catch (Exception e) {
            System.err.println(e);
          }
        }
      }
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SecurityException e) {
      e.printStackTrace();
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return treeRuleReturn;
  }
}
TOP

Related Classes of org.drools.lang.MVELDumperTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.