/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.rule; import junit.framework.Assert; import junit.framework.TestCase; import org.drools.RuntimeDroolsException; public class GroupElementTest extends TestCase { public void testPackNestedAnd() { final GroupElement and1 = GroupElementFactory.newAndInstance(); final Pattern pattern1 = new Pattern( 0, null ); and1.addChild( pattern1 ); final Pattern pattern2 = new Pattern( 0, null ); and1.addChild( pattern2 ); assertEquals( 2, and1.getChildren().size() ); assertSame( pattern1, and1.getChildren().get( 0 ) ); assertSame( pattern2, and1.getChildren().get( 1 ) ); final GroupElement and2 = GroupElementFactory.newAndInstance(); and2.addChild( and1 ); and2.pack(); assertEquals( 2, and2.getChildren().size() ); assertSame( pattern1, and2.getChildren().get( 0 ) ); assertSame( pattern2, and2.getChildren().get( 1 ) ); } public void testPackNestedOr() { final GroupElement or1 = GroupElementFactory.newOrInstance(); final Pattern pattern1 = new Pattern( 0, null ); or1.addChild( pattern1 ); final Pattern pattern2 = new Pattern( 0, null ); or1.addChild( pattern2 ); assertEquals( 2, or1.getChildren().size() ); assertSame( pattern1, or1.getChildren().get( 0 ) ); assertSame( pattern2, or1.getChildren().get( 1 ) ); final GroupElement or2 = GroupElementFactory.newOrInstance(); or2.addChild( or1 ); or2.pack(); assertEquals( 2, or2.getChildren().size() ); assertSame( pattern1, or2.getChildren().get( 0 ) ); assertSame( pattern2, or2.getChildren().get( 1 ) ); } public void testPackNestedExists() { final GroupElement exists1 = GroupElementFactory.newExistsInstance(); final Pattern pattern1 = new Pattern( 0, null ); exists1.addChild( pattern1 ); assertEquals( 1, exists1.getChildren().size() ); assertSame( pattern1, exists1.getChildren().get( 0 ) ); final GroupElement exists2 = GroupElementFactory.newExistsInstance(); exists2.addChild( exists1 ); exists2.pack(); assertEquals( 1, exists2.getChildren().size() ); assertSame( pattern1, exists2.getChildren().get( 0 ) ); } public void testAddMultipleChildsIntoNot() { final GroupElement not = GroupElementFactory.newNotInstance(); final Pattern pattern1 = new Pattern( 0, null ); try { not.addChild( pattern1 ); } catch ( final RuntimeDroolsException rde ) { Assert.fail( "Adding a single child is not supposed to throw Exception for NOT GE: " + rde.getMessage() ); } final Pattern pattern2 = new Pattern( 0, null ); try { not.addChild( pattern2 ); Assert.fail( "Adding a second child into a NOT GE should throw Exception" ); } catch ( final RuntimeDroolsException rde ) { // everything is fine } } public void testAddSingleBranchAnd() { final GroupElement and1 = GroupElementFactory.newAndInstance(); final Pattern pattern = new Pattern( 0, null ); and1.addChild( pattern ); assertEquals( 1, and1.getChildren().size() ); assertSame( pattern, and1.getChildren().get( 0 ) ); final GroupElement or1 = GroupElementFactory.newOrInstance(); or1.addChild( and1 ); or1.pack(); assertEquals( 1, or1.getChildren().size() ); assertSame( pattern, or1.getChildren().get( 0 ) ); } public void testAddSingleBranchOr() { final GroupElement or1 = GroupElementFactory.newOrInstance(); final Pattern pattern = new Pattern( 0, null ); or1.addChild( pattern ); assertEquals( 1, or1.getChildren().size() ); assertSame( pattern, or1.getChildren().get( 0 ) ); final GroupElement and1 = GroupElementFactory.newAndInstance(); and1.addChild( or1 ); and1.pack(); assertEquals( 1, and1.getChildren().size() ); assertSame( pattern, and1.getChildren().get( 0 ) ); } /** * This test tests deep nested structures, and shall transform this: * * AND2 * | * OR3 * | * OR2 * | * AND1 * | * OR1 * / \ * C1 C2 * * Into this: * * OR1 * / \ * C1 C2 * */ public void testDeepNestedStructure() { final GroupElement or1 = GroupElementFactory.newOrInstance(); final Pattern pattern1 = new Pattern( 0, null ); or1.addChild( pattern1 ); final Pattern pattern2 = new Pattern( 0, null ); or1.addChild( pattern2 ); final GroupElement and1 = GroupElementFactory.newAndInstance(); and1.addChild( or1 ); assertEquals( 1, and1.getChildren().size() ); assertSame( or1, and1.getChildren().get( 0 ) ); assertSame( pattern1, or1.getChildren().get( 0 ) ); assertSame( pattern2, or1.getChildren().get( 1 ) ); final GroupElement or2 = GroupElementFactory.newOrInstance(); or2.addChild( and1 ); assertEquals( 1, or2.getChildren().size() ); assertSame( and1, or2.getChildren().get( 0 ) ); final GroupElement or3 = GroupElementFactory.newOrInstance(); or3.addChild( or2 ); assertEquals( 1, or2.getChildren().size() ); assertSame( or2, or3.getChildren().get( 0 ) ); final GroupElement and2 = GroupElementFactory.newAndInstance(); and2.addChild( or3 ); assertEquals( 1, and2.getChildren().size() ); assertSame( or3, and2.getChildren().get( 0 ) ); // Now pack the structure and2.pack(); // and2 now is in fact transformed into an OR assertEquals( GroupElement.Type.OR, and2.getType() ); assertEquals( 2, and2.getChildren().size() ); assertSame( pattern1, and2.getChildren().get( 0 ) ); assertSame( pattern2, and2.getChildren().get( 1 ) ); } /** * This test tests deep nested structures, and shall transform this: * * AND2 * / \ * OR3 C3 * | * OR2 * | * AND1 * | * OR1 * / \ * C1 C2 * * Into this: * * AND2 * / \ * OR1 C3 * / \ * C1 C2 * */ public void testDeepNestedStructureWithMultipleElementsInRoot() { final GroupElement or1 = GroupElementFactory.newOrInstance(); final Pattern pattern1 = new Pattern( 0, null ); or1.addChild( pattern1 ); final Pattern pattern2 = new Pattern( 0, null ); or1.addChild( pattern2 ); final GroupElement and1 = GroupElementFactory.newAndInstance(); and1.addChild( or1 ); assertEquals( 1, and1.getChildren().size() ); assertSame( or1, and1.getChildren().get( 0 ) ); assertSame( pattern1, or1.getChildren().get( 0 ) ); assertSame( pattern2, or1.getChildren().get( 1 ) ); final GroupElement or2 = GroupElementFactory.newOrInstance(); or2.addChild( and1 ); assertEquals( 1, or2.getChildren().size() ); assertSame( and1, or2.getChildren().get( 0 ) ); final GroupElement or3 = GroupElementFactory.newOrInstance(); or3.addChild( or2 ); assertEquals( 1, or2.getChildren().size() ); assertSame( or2, or3.getChildren().get( 0 ) ); final GroupElement and2 = GroupElementFactory.newAndInstance(); and2.addChild( or3 ); final Pattern pattern3 = new Pattern( 0, null ); and2.addChild( pattern3 ); assertEquals( 2, and2.getChildren().size() ); assertSame( or3, and2.getChildren().get( 0 ) ); assertSame( pattern3, and2.getChildren().get( 1 ) ); // Now pack the structure and2.pack(); // and2 now is in fact transformed into an OR assertTrue( and2.isAnd() ); assertEquals( 2, and2.getChildren().size() ); // order must be the same assertSame( or1, and2.getChildren().get( 0 ) ); assertSame( pattern3, and2.getChildren().get( 1 ) ); assertEquals( 2, or1.getChildren().size() ); assertSame( pattern1, or1.getChildren().get( 0 ) ); assertSame( pattern2, or1.getChildren().get( 1 ) ); } }