/*
 * Copyright (c) 2020, VISA
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are not permitted without explicit consent of VISA.
 */
package com.visa.dpd.api.platform.metric.compute;

import com.visa.dpd.api.platform.metric.model.MetricEvaluationResult;
import com.visa.dpd.api.platform.metric.model.MetricFormula;
import com.visa.dpd.api.platform.metric.model.SingleEvaluationResult;
import com.visa.dpd.api.platform.metric.util.MetricComputationException;
import com.visa.dpd.api.platform.metric.util.MetricValidationException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 *
 * @author Gary Greenberg
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class MetricEvaluatorTest {
    
    public MetricEvaluatorTest() {
    }
    
    @Autowired
    MetricEvaluator instance;
    /**
     * Test of evaluate method, of class MetricEvaluator.
     */
    @Test
    public void testEvaluate()  {
        System.out.println("evaluate");
        MetricFormula formula = new MetricFormula();
        formula.setMetric("EgiptianTriangle");
        formula.setExpressions(Collections.singletonMap("hypotenuse", "math:sqrt(a*a + b*b)"));
        try {
            formula.addVariable("a", "java.lang.Double");
            formula.addVariable("b", "java.lang.Double");
            boolean formulaComputable = formula.isFormulaComputable();
            if (!formulaComputable) {
                fail("formula is not computable");
            }
            Map<String, Object> valuesMap = new HashMap<>(2);
            valuesMap.put("a", 3.0);
            valuesMap.put("b", 4.0);
            SingleEvaluationResult expResult = new SingleEvaluationResult("hypotenuse", 5.0);
            MetricEvaluationResult result = instance.evaluate(formula, valuesMap);
            assertEquals(expResult, result);            
        } catch (ClassNotFoundException | MetricValidationException | MetricComputationException e) {
            e.printStackTrace(System.out);
        }
    }   
}
