// 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/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.grouchotools.jsrules.exception.InvalidParameterException;
import org.grouchotools.jsrules.impl.RuleExecutorImpl;
import org.junit.*;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;
    @Test
    public void executeRuleStaticExtraParameter() throws Exception {
        exception.expect(InvalidParameterException.class);

        Parameter<Long> rightStaticParameterMock = new Parameter<>("right", Long.class, 20l);
        when(ruleMock.getRightParameter()).thenReturn(rightStaticParameterMock);

        when(ruleMock.getOperator()).thenReturn(Operator.LT);

        executor.execute(10l, 20l);
    }

    @Test
    public void executeRuleStaticMissingParameter() throws Exception {
        exception.expect(InvalidParameterException.class);

        executor.execute(10l);
    }

    @Test
    public void getRuleTest() throws Exception {
        assertEquals(ruleMock, executor.getRule());
    }

    @Test
    public void getLeftParameterTest() throws Exception {
        assertEquals(ruleMock.getLeftParameter(), executor.getLeftParameter());
    }

    @Test
// 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/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/RuleExecutorTest.java
import org.grouchotools.jsrules.exception.InvalidParameterException;
import org.grouchotools.jsrules.impl.RuleExecutorImpl;
import org.junit.*;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;

    @Test
    public void executeRuleStaticExtraParameter() throws Exception {
        exception.expect(InvalidParameterException.class);

        Parameter<Long> rightStaticParameterMock = new Parameter<>("right", Long.class, 20l);
        when(ruleMock.getRightParameter()).thenReturn(rightStaticParameterMock);

        when(ruleMock.getOperator()).thenReturn(Operator.LT);

        executor.execute(10l, 20l);
    }

    @Test
    public void executeRuleStaticMissingParameter() throws Exception {
        exception.expect(InvalidParameterException.class);

        executor.execute(10l);
    }

    @Test
    public void getRuleTest() throws Exception {
        assertEquals(ruleMock, executor.getRule());
    }

    @Test
    public void getLeftParameterTest() throws Exception {
        assertEquals(ruleMock.getLeftParameter(), executor.getLeftParameter());
    }

    @Test
    public void getRightParameterTest() throws Exception {