package at.ac.tuwien.iter.services.impl.assertions; import java.util.Arrays; import java.util.List; import matlabcontrol.MatlabInvocationException; import org.slf4j.Logger; import at.ac.tuwien.iter.data.TestReport; import at.ac.tuwien.iter.data.TestResult; import at.ac.tuwien.iter.services.AssertionService; import at.ac.tuwien.iter.services.MathEngineDao; public class InelasticityAssertion implements AssertionService { private Logger logger; private MathEngineDao dao; private final String assertionName = "inelasticity"; public InelasticityAssertion(Logger logger, MathEngineDao dao) { this.logger = logger; this.dao = dao; } // Better testability protected TestReport check(List<double[]> transitions) { TestReport testReport = new TestReport(); testReport.setTestedProperty(assertionName); try { if (transitions == null) { logger.info(assertionName + " Null transitions: SKIPPED."); testReport.setTestOutcome("SKIPPED"); testReport.setReason("Null transitions"); return testReport; } if (transitions.size() == 0) { logger.info(assertionName + " No transitions: FAILED."); testReport.setTestOutcome("FAILED"); testReport.setReason("No transitions"); return testReport; } int maxReachedState = 0; int minReachedState = Integer.MAX_VALUE; for (double[] transition : transitions) { if (transition[1] > maxReachedState) { maxReachedState = (int) transition[1]; } if (transition[1] < minReachedState && transition[1] > 0) { minReachedState = (int) transition[1]; } } logger.debug(assertionName + " InelasticityAssertion.check():" + "Max Reached = " + maxReachedState); logger.debug(assertionName + " InelasticityAssertion.check():" + "Min Reached = " + minReachedState); if (maxReachedState == minReachedState) { logger.info(assertionName + " InelasticityAssertion.check(): FAILED"); testReport.setTestOutcome("FAILED"); testReport.setReason(String .format("The system did not move away from %d", minReachedState)); } else { logger.info(assertionName + " InelasticityAssertion.check(): PASSED"); testReport.setTestOutcome("PASSED"); } } catch (Throwable e) { logger.warn(assertionName + " Exception during Inelasticity CHECK: ERROR !", e); testReport.setTestOutcome("ERROR"); testReport.setReason(e.getMessage()); } return testReport; } public void check(TestResult testResult) { try { List<double[]> transitions = null; transitions = dao.inferModel(testResult.getStates()); testResult.addTestReport(check(transitions)); } catch (MatlabInvocationException e) { logger.info(assertionName + " InelasticityAssertion.check():" + "Cannot Infer a Markov Model from " + Arrays.toString(testResult.getStates())); logger.warn(assertionName + " Exception during Inelasticity CHECK: ERROR !", e); TestReport testReport = new TestReport(); testReport.setTestedProperty(assertionName); testReport.setTestOutcome("ERROR"); testReport.setReason(e.getMessage()); testResult.addTestReport(testReport); } catch (Throwable e) { logger.info(assertionName + " InelasticityAssertion.check():"); logger.warn(assertionName + " Exception during Inelasticity CHECK: ERROR !", e); TestReport testReport = new TestReport(); testReport.setTestedProperty(assertionName); testReport.setTestOutcome("ERROR"); testReport.setReason(e.getMessage()); testResult.addTestReport(testReport); } } }