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 }