// Path: src/main/java/org/grouchotools/jsrules/exception/InvalidParameterException.java
// public class InvalidParameterException extends JsRulesException {
// 
//     public InvalidParameterException() {
//     }
// 
//     public InvalidParameterException(String message) {
//         super(message);
//     }
// 
//     public InvalidParameterException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public InvalidParameterException(Throwable cause) {
//         super(cause);
//     }
// 
//     public InvalidParameterException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
//     
// }
// 
// Path: src/main/java/org/grouchotools/jsrules/impl/AllTrueRulesetExecutorImpl.java
// public class AllTrueRulesetExecutorImpl<T> extends RulesetExecutor<T> {
//     private final static Logger LOGGER = LoggerFactory.getLogger(AllTrueRulesetExecutorImpl.class);
// 
//     private final List<RuleExecutor> ruleSet;
//     private final T response;
//     private String name;
// 
//     public AllTrueRulesetExecutorImpl(String name, List<RuleExecutor> ruleSet, T response) {
//         this.name = name;
//         this.ruleSet = ruleSet;
//         this.response = response;
//     }
//     
//     @Override
//     public T execute(Map<String, Object> parameters) throws InvalidParameterException {
//         T result = response;
//         for(RuleExecutor rule:ruleSet) {
//             Parameter ruleParamRight = rule.getRightParameter();
//             Object leftParameter = parameters.get(rule.getLeftParameter().getName());
//             Object rightParameter = parameters.get(ruleParamRight.getName());
// 
//             if (ruleParamRight.getStaticValue() == null) {
//                 // check both parameters --failed rule checks return null
//                 if (rule.execute(leftParameter, rightParameter) == null) {
//                     result = null;
//                     break;
//                 }
//             } else {
//                 // check left parameter only -- failed rule checks return null
//                 if (rule.execute(leftParameter) == null) {
//                     result = null;
//                     break;
//                 }
//             }
//         }
//         return result;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
// }
// 
// Path: src/main/java/org/grouchotools/jsrules/impl/RuleExecutorImpl.java
// public class RuleExecutorImpl<T, P> extends RuleExecutor<T> {
//     private static final Logger LOG = LoggerFactory.getLogger(RuleExecutorImpl.class);
//             
//     private final Rule<T, P> rule;
//     
//     public RuleExecutorImpl(Rule<T, P> rule) {
//         this.rule = rule;
//     }
//     
//     @Override
//     public T execute(Object leftParameter, Object rightParameter) throws InvalidParameterException {
//         Object staticValue = rule.getRightParameter().getStaticValue();
//         if (staticValue != null) {
//             LOG.error("Right parameter has a static value of {} and should not be specified", staticValue);
//             throw new InvalidParameterException();
//         }
// 
//         return executeRule(leftParameter, rightParameter);
//     }
// 
//     @Override
//     public T execute(Object leftParameter) throws InvalidParameterException {
//         Object rightParameter = rule.getRightParameter().getStaticValue();
// 
//         if (rightParameter == null) {
//             LOG.error("Right parameter must be specified");
//             throw new InvalidParameterException();
//         }
// 
//         return executeRule(leftParameter, rightParameter);
//     }
// 
//     @Override
//     public Parameter getLeftParameter() {
//         return rule.getLeftParameter();
//     }
// 
//     @Override
//     public Parameter getRightParameter() {
//         return rule.getRightParameter();
//     }
// 
//     @Override
//     public Rule getRule() {
//         return rule;
//     }
// 
//     private T executeRule(Object leftParameter, Object rightParameter) throws InvalidParameterException {
//         validateParameter(rule.getLeftParameter().getName(), leftParameter, rule.getLeftParameter().getKlasse());
//         validateParameter(rule.getRightParameter().getName(), rightParameter, rule.getRightParameter().getKlasse());
// 
//         T response = null;
// 
//         if (rule.getOperator().compare(leftParameter, rightParameter)) {
//             response = rule.getResponse();
//         }
// 
//         return response;
//     }
//     
// }


import org.mockito.runners.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.grouchotools.jsrules.exception.InvalidParameterException;
import org.grouchotools.jsrules.impl.AllTrueRulesetExecutorImpl;
import org.grouchotools.jsrules.impl.RuleExecutorImpl;
import org.junit.*;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;

    private List<RuleExecutor> ruleListMock;
    
    @BeforeClass
    public static void setUpClass() {
    }
    
    @AfterClass
    public static void tearDownClass() {
    }
    
    @Before
    public void setUp() {
        ruleListMock = new ArrayList<>();
        executor = new AllTrueRulesetExecutorImpl<>(rulesetName, ruleListMock, responseMock);
    }
    
    @After
    public void tearDown() {
    }

    @Test
    public void executeRulesetTest() throws Exception {
        Map<String, Object> parameters = new HashMap<>();
        
        assertEquals(responseMock, executor.execute(parameters));
    }
    
    @Test
    public void executeRulesetInvalidParametersTest() throws Exception {
// Path: src/main/java/org/grouchotools/jsrules/exception/InvalidParameterException.java
// public class InvalidParameterException extends JsRulesException {
// 
//     public InvalidParameterException() {
//     }
// 
//     public InvalidParameterException(String message) {
//         super(message);
//     }
// 
//     public InvalidParameterException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public InvalidParameterException(Throwable cause) {
//         super(cause);
//     }
// 
//     public InvalidParameterException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
//     
// }
// 
// Path: src/main/java/org/grouchotools/jsrules/impl/AllTrueRulesetExecutorImpl.java
// public class AllTrueRulesetExecutorImpl<T> extends RulesetExecutor<T> {
//     private final static Logger LOGGER = LoggerFactory.getLogger(AllTrueRulesetExecutorImpl.class);
// 
//     private final List<RuleExecutor> ruleSet;
//     private final T response;
//     private String name;
// 
//     public AllTrueRulesetExecutorImpl(String name, List<RuleExecutor> ruleSet, T response) {
//         this.name = name;
//         this.ruleSet = ruleSet;
//         this.response = response;
//     }
//     
//     @Override
//     public T execute(Map<String, Object> parameters) throws InvalidParameterException {
//         T result = response;
//         for(RuleExecutor rule:ruleSet) {
//             Parameter ruleParamRight = rule.getRightParameter();
//             Object leftParameter = parameters.get(rule.getLeftParameter().getName());
//             Object rightParameter = parameters.get(ruleParamRight.getName());
// 
//             if (ruleParamRight.getStaticValue() == null) {
//                 // check both parameters --failed rule checks return null
//                 if (rule.execute(leftParameter, rightParameter) == null) {
//                     result = null;
//                     break;
//                 }
//             } else {
//                 // check left parameter only -- failed rule checks return null
//                 if (rule.execute(leftParameter) == null) {
//                     result = null;
//                     break;
//                 }
//             }
//         }
//         return result;
//     }
// 
//     @Override
//     public String getName() {
//         return name;
//     }
// 
// }
// 
// Path: src/main/java/org/grouchotools/jsrules/impl/RuleExecutorImpl.java
// public class RuleExecutorImpl<T, P> extends RuleExecutor<T> {
//     private static final Logger LOG = LoggerFactory.getLogger(RuleExecutorImpl.class);
//             
//     private final Rule<T, P> rule;
//     
//     public RuleExecutorImpl(Rule<T, P> rule) {
//         this.rule = rule;
//     }
//     
//     @Override
//     public T execute(Object leftParameter, Object rightParameter) throws InvalidParameterException {
//         Object staticValue = rule.getRightParameter().getStaticValue();
//         if (staticValue != null) {
//             LOG.error("Right parameter has a static value of {} and should not be specified", staticValue);
//             throw new InvalidParameterException();
//         }
// 
//         return executeRule(leftParameter, rightParameter);
//     }
// 
//     @Override
//     public T execute(Object leftParameter) throws InvalidParameterException {
//         Object rightParameter = rule.getRightParameter().getStaticValue();
// 
//         if (rightParameter == null) {
//             LOG.error("Right parameter must be specified");
//             throw new InvalidParameterException();
//         }
// 
//         return executeRule(leftParameter, rightParameter);
//     }
// 
//     @Override
//     public Parameter getLeftParameter() {
//         return rule.getLeftParameter();
//     }
// 
//     @Override
//     public Parameter getRightParameter() {
//         return rule.getRightParameter();
//     }
// 
//     @Override
//     public Rule getRule() {
//         return rule;
//     }
// 
//     private T executeRule(Object leftParameter, Object rightParameter) throws InvalidParameterException {
//         validateParameter(rule.getLeftParameter().getName(), leftParameter, rule.getLeftParameter().getKlasse());
//         validateParameter(rule.getRightParameter().getName(), rightParameter, rule.getRightParameter().getKlasse());
// 
//         T response = null;
// 
//         if (rule.getOperator().compare(leftParameter, rightParameter)) {
//             response = rule.getResponse();
//         }
// 
//         return response;
//     }
//     
// }


// Path: src/test/java/org/grouchotools/jsrules/AllTrueRulesetExecutorTest.java
import org.mockito.runners.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.grouchotools.jsrules.exception.InvalidParameterException;
import org.grouchotools.jsrules.impl.AllTrueRulesetExecutorImpl;
import org.grouchotools.jsrules.impl.RuleExecutorImpl;
import org.junit.*;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;


    private List<RuleExecutor> ruleListMock;
    
    @BeforeClass
    public static void setUpClass() {
    }
    
    @AfterClass
    public static void tearDownClass() {
    }
    
    @Before
    public void setUp() {
        ruleListMock = new ArrayList<>();
        executor = new AllTrueRulesetExecutorImpl<>(rulesetName, ruleListMock, responseMock);
    }
    
    @After
    public void tearDown() {
    }

    @Test
    public void executeRulesetTest() throws Exception {
        Map<String, Object> parameters = new HashMap<>();
        
        assertEquals(responseMock, executor.execute(parameters));
    }
    
    @Test
    public void executeRulesetInvalidParametersTest() throws Exception {
        exception.expect(InvalidParameterException.class);