// 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;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.grouchotools.jsrules;



/**
 *
 * @author Paul
 */
@RunWith(MockitoJUnitRunner.class)
public class RuleExecutorTest {
    
    private RuleExecutor<String> executor;
    
    @org.junit.Rule
    public ExpectedException exception= ExpectedException.none();
    
    @Mock
    Rule<String, Long> ruleMock;
    
    @BeforeClass
    public static void setUpClass() {
    }
    
    @AfterClass
    public static void tearDownClass() {
    }
    
    @Before
    public void setUp() {
// 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;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package org.grouchotools.jsrules;



/**
 *
 * @author Paul
 */
@RunWith(MockitoJUnitRunner.class)
public class RuleExecutorTest {
    
    private RuleExecutor<String> executor;
    
    @org.junit.Rule
    public ExpectedException exception= ExpectedException.none();
    
    @Mock
    Rule<String, Long> ruleMock;
    
    @BeforeClass
    public static void setUpClass() {
    }
    
    @AfterClass
    public static void tearDownClass() {
    }
    
    @Before
    public void setUp() {
        executor = new RuleExecutorImpl<>(ruleMock);