package modTransf.rules.core;
import junit.framework.TestCase;
import java.io.IOException;
import java.util.Collection;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import modTransf.engine.RuleContext;
import modTransf.engine.SimpleRuleContext;
import modTransf.engine.Arguments;
import modTransf.engine.TransformationException;
import java.util.Map;
import java.util.HashMap;
import modTransf.model.ModelHelper;
import modTransf.engine.EngineException;
import modTransf.engine.Rule;
import modTransf.engine.ParameterDescriptor;
import modTransf.engine.ArrayArguments;
/**
* Test case for CoreSelectRuleTest.
*/
public class CoreSelectRuleTest extends TransformationTestCase
{
public CoreSelectRuleTest(String name)
{
super(name);
}
/**
* Initialize the context for a new test.
* This method is called befor each test
* @throws IOException
*/
public void setUp()
throws IOException
{
super.setUp();
}
/**
* Tear down the test.
* This method is called after each test.
*/
public void tearDown()
{
super.tearDown();
}
/**
* Check if the getParameterDescriptors() method return a clone of the first
* registered rule descriptors.
*/
public void testGetDescriptors()
throws TransformationException, EngineException
{
String ruleName = "rule1";
// Create a rule
CoreSelectRule rule = new CoreSelectRule();
rule.setRuleName( ruleName );
Rule registeredRule = createSimpleRule( "r1", "in, out", false);
rule.addRule( registeredRule );
rule.addRule( createSimpleRule( "r1", "in, out", false) );
rule.engineStart( context );
// execute the rule
Arguments args = new ArrayArguments();
rule.execute( args, context );
// Check the descriptors
assertEquals("desc size", registeredRule.getParameterDescriptors().size(), rule.getParameterDescriptors().size());
Iterator iterRegistered = registeredRule.getParameterDescriptors().iterator();
Iterator iterClone = rule.getParameterDescriptors().iterator();
int i=0;
while( iterClone.hasNext() )
{
ParameterDescriptor descRegistered = (ParameterDescriptor)iterRegistered.next();
ParameterDescriptor descClone= (ParameterDescriptor)iterClone.next();
assertEquals("desc["+i+"].isIn", descRegistered.isIn(context), descClone.isIn(context) );
assertEquals("desc["+i+"].isOut", descRegistered.isOut(context), descClone.isOut(context) );
i++;
}
}
/**
* Check for the first selected. It should be the first rule returning true.
*/
public void testSelectFirstTrue()
throws TransformationException, EngineException
{
String ruleName = "selectRule";
// Create a rule
CoreSelectRule rule = new CoreSelectRule();
rule.setRuleName( ruleName );
Rule rule1 = createSimpleRule( "rule1", "in, out", false);
rule.addRule( rule1 );
Rule rule2 = createSimpleRule( "rule2", "in, out", true);
rule.addRule( rule2 );
rule.addRule( createSimpleRule( "rule3", "in, out", true) );
rule.engineStart( context );
// execute the rule
Arguments args = new ArrayArguments();
args.add( attr1 );
args.add( null );
rule.execute( args, context );
// Check if the rule is called
//assertEquals("rule is called", 1, methodCallsTrace.size());
assertTrue("rule1 is checked", methodCallsTrace.remove("rule1.execute()"));
assertTrue("rule2 is called", methodCallsTrace.remove("rule2.execute()"));
assertFalse("rule3 should not be called", methodCallsTrace.contains("rule3.execute()"));
}
/**
* Check for the first selected. It should be the first rule returning true.
*/
public void testSelectFirstIsALLowedTrue()
throws TransformationException, EngineException
{
String ruleName = "selectRule";
// Create a rule
CoreSelectRule rule = new CoreSelectRule();
rule.setRuleName( ruleName );
Rule rule1 = createSimpleRule( "rule1", "in, out", false);
rule.addRule( rule1 );
Rule rule2 = createSimpleRule( "rule2", "in, out", true);
rule.addRule( rule2 );
Rule rule3 = createSimpleRule( "rule3", "in, out", true);
rule.addRule( rule3);
rule.engineStart( context );
// execute the rule
Arguments args = new ArrayArguments();
args.add( attr1 );
args.add( null );
rule.isAllowed( args, context );
// Check if the rule is called
//assertEquals("rule is called", 1, methodCallsTrace.size());
assertTrue("rule1 is checked", methodCallsTrace.remove("rule1.isAllowed()"));
assertTrue("rule2 is called", methodCallsTrace.remove("rule2.isAllowed()"));
assertFalse("rule3 should not be called", methodCallsTrace.contains("rule3.isAllowed()"));
}
}