/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.ss.excelant.util;

/**
 * A simple class that encapsulates information about a cell evaluation
 * from POI.
 */
public class ExcelAntEvaluationResult {

    /**
     * This boolean flag is used to determine if the evaluation completed
     * without error.  This alone doesn't ensure that the evaluation was
     * successful.
     */
    private boolean evaluationCompletedWithError ;

    /**
     * This boolean flag is used to determine if the result was within
     * the specified precision.
     */
    private boolean didPass ;

    /**
     * This is the actual value returned from the evaluation.
     */
    private double returnValue ;

    /**
     * Any error message String values that need to be returned.
     */
    private String errorMessage ;

    /**
     * Stores the absolute value of the delta for this evaluation.
     */
    private double actualDelta ;

    /**
     * This stores the fully qualified cell name (sheetName!cellId).
     */
    private String cellName ;



    public ExcelAntEvaluationResult(boolean completedWithError,
                             boolean passed,
                             double retValue,
                             String errMessage,
                             double delta,
                             String cellId) {

        evaluationCompletedWithError = completedWithError;
        didPass = passed;
        returnValue = retValue;
        errorMessage = errMessage;
        actualDelta = delta ;
        cellName = cellId ;
    }

    public double getReturnValue() {
        return returnValue;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public boolean didTestPass() {
        return didPass ;
    }

    public boolean evaluationCompleteWithError() {
        return evaluationCompletedWithError ;
    }

    public double getDelta() {
        return actualDelta ;
    }

    public String getCellName() {
        return cellName ;
    }

    @Override
    public String toString() {
        return "ExcelAntEvaluationResult [evaluationCompletedWithError="
                + evaluationCompletedWithError + ", didPass=" + didPass
                + ", returnValue=" + returnValue + ", errorMessage="
                + errorMessage + ", actualDelta=" + actualDelta + ", cellName="
                + cellName + "]";
    }
}
