001    /*
002     * Copyright (c) 2005 Jens Schou, Staffan Gustafsson, Björn Lanneskog, 
003     * Einar Pehrson and Sebastian Kekkonen
004     *
005     * This file is part of
006     * CleanSheets Extension for Test Cases
007     *
008     * CleanSheets Extension for Test Cases is free software; you can
009     * redistribute it and/or modify it under the terms of the GNU General Public
010     * License as published by the Free Software Foundation; either version 2 of
011     * the License, or (at your option) any later version.
012     *
013     * CleanSheets Extension for Test Cases is distributed in the hope that
014     * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
015     * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016     * See the GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with CleanSheets Extension for Test Cases; if not, write to the
020     * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
021     * Boston, MA  02111-1307  USA
022     */
023    package csheets.ext.test;
024    
025    import java.io.Serializable;
026    import java.util.HashSet;
027    import java.util.Iterator;
028    import java.util.Set;
029    
030    import csheets.core.IllegalValueTypeException;
031    import csheets.core.Value;
032    import csheets.core.formula.Formula;
033    
034    /**
035     * Contains the information for a single test case, i.e. a single test case
036     * parameter for each of the precedents.
037     * @author Staffan Gustafsson
038     * @author Jens Schou
039     * @author Einar Pehrson
040     */
041    public class TestCase extends Formula implements Serializable {
042    
043            /** The unique version identifier used for serialization */
044            private static final long serialVersionUID = -6135481035045505755L;
045    
046            /** The validation states of a test case. */
047            public enum ValidationState {
048    
049                    /** The test case was validated successfully. */
050                    VALID,
051    
052                    /** The test case failed. */
053                    REJECTED,
054    
055                    /** The test case has not yet been validated. */
056                    PENDING
057            };
058    
059            /** The validation state of the test case. */
060            private ValidationState validationState = ValidationState.PENDING;
061    
062            /** The parameters of the test case */
063            private Set<TestCaseParam> params = new HashSet<TestCaseParam>();
064    
065            /** The value received when the test case was evaluated */
066            private Value value;
067    
068            /**
069             * Creates a new test case for the given cell in the given spreadsheet.
070             * The value of the test case is calculated by replacing the references in
071             * the cell's formula with the given set of test case parameters.
072             * @param cell the cell for which the test case is to be created
073             * @param params the set of test case parameters to use
074             */
075            public TestCase(TestableCell cell, Set<TestCaseParam> params) {
076                    super(cell, new TestCaseBuilder(params).getExpression(cell.getFormula()));
077    
078                    // Stores members
079                    this.params = params;
080    
081                    // Evaluates the test case
082                    try {
083                            this.value = super.evaluate();
084                    } catch (IllegalValueTypeException e) {
085                            this.value = new Value(e);
086                    }
087            }
088    
089            public TestableCell getCell() {
090                    return (TestableCell)super.getCell();
091            }
092    
093            public Value evaluate() {
094                    return value;
095            }
096    
097            /**
098             *
099             * @return the set of test case parameters that make up the test case
100             */
101            public Set<TestCaseParam> getParams(){
102                    return params;
103            }
104    
105            /**
106             *
107             * @return Returns the ValidationState of the TestCase.
108             */
109            public ValidationState getValidationState() {
110                    return validationState;
111            }
112    
113            /**
114             *
115             * @param state Sets the ValidationState of the TestCase to the param's state.
116             */
117            public void setValidationState(ValidationState state) {
118                    this.validationState = state;
119            }
120    
121            /**
122             * Test if the TestCase is based on a specified TestCaseParam.
123             * @param param The TestCaseParam we want to know it the TestCase uses
124             * @return true if the TestCase uses param, otherwise false
125             */
126            public boolean hasParam(TestCaseParam param) {
127                    Iterator<TestCaseParam> it = params.iterator();
128                    while(it.hasNext()) {
129                            if(it.next().equals(param)) return true;
130                    }
131                    return false;
132            }
133    
134            /**
135             * Returns whether the other object has the same parameters
136             * and cell as this has.
137             * @param other the object to check for equality
138             * @return true if the objects are equal
139             */
140            public boolean equals(Object other){
141                    if (!(other instanceof TestCase) || other == null)
142                            return false;
143                    TestCase otherTC = (TestCase)other;
144                    return params.equals(otherTC.getParams()) && getCell().equals(otherTC.getCell());
145            }
146    
147            /**
148             * Returns the hash code of the test case.
149             * @return the hash code of the test case.
150             */
151            public int hashCode() {
152                    return getCell().hashCode() + params.hashCode();
153            }
154    }