001: package org.jingle.mocquer.internal;
002:
003: import java.util.ArrayList;
004: import java.util.List;
005:
006: import org.jingle.mocquer.ArgumentsMatcher;
007: import org.jingle.mocquer.AssertionFailedError;
008: import org.jingle.mocquer.MockControl;
009: import org.jingle.mocquer.Range;
010:
011: /**
012: * This class is a normal implementation of BehaviorSet interface
013: *
014: *
015: * @author JianLu
016: * @version 1.0 2004-10-27
017: * @since 1.0
018: */
019: public class NormalBehaviorSet implements BehaviorSet {
020: /**
021: * The list contains all the behavior
022: */
023: protected List behaviorList = new ArrayList();
024:
025: /**
026: * Default argument matcher object
027: */
028: ArgumentsMatcher defaultMatcher = MockControl.ARRAY_MATCHER;
029:
030: /**
031: * (non-Javadoc)
032: *
033: * @see org.jingle.mocquer.internal.BehaviorSet#addBehavior(org.jingle.mocquer.internal.MockBehavior)
034: */
035: public void addBehavior(MockBehavior behavior) {
036: behaviorList.add(behavior);
037: }
038:
039: /**
040: * (non-Javadoc)
041: *
042: * @see org.jingle.mocquer.internal.BehaviorSet#visitBehavior(org.jingle.mocquer.internal.MockBehavior)
043: */
044: public void visitBehavior(MockBehavior behavior) {
045: MockBehavior mb = findBehavior(behavior);
046: if (mb != null) {
047: mb.useOnce();
048: mb.copyto(behavior);
049: } else
050: throw new AssertionFailedError("No behavior defined");
051: }
052:
053: /**
054: * Find a behavior from the behavio set according to the given incomplete behavior
055: * @param behavior The given behavior
056: * @return The behavior in the behavior set
057: */
058: protected MockBehavior findBehavior(MockBehavior behavior) {
059: MockBehavior ret = null;
060: for (int i = 1; i <= behaviorList.size(); i++) {
061: MockBehavior item = (MockBehavior) behaviorList.get(i - 1);
062: if (item.getMethod().equals(behavior.getMethod())
063: && !item.isUsed()
064: && item.getMatcher().matches(item.getArguments(),
065: behavior.getArguments())) {
066: ret = item;
067: break;
068: }
069: }
070: return ret;
071: }
072:
073: /**
074: * Find last behavior in the behavior set
075: * @return The last behavior in the behavior set
076: */
077: protected MockBehavior findBehavior() {
078: int length = behaviorList.size();
079: if (length > 0) {
080: MockBehavior behavior = (MockBehavior) behaviorList
081: .get(length - 1);
082: return behavior;
083: } else
084: throw new AssertionFailedError("No behavior found");
085: }
086:
087: /**
088: * (non-Javadoc)
089: * @see org.jingle.mocquer.internal.BehaviorSet#setReturnValue(java.lang.Object, org.jingle.mocquer.Range)
090: */
091: public void setReturnValue(Object retValue, Range range) {
092: MockBehavior behavior = findBehavior();
093: behavior.setRetValue(retValue);
094: if (range != null)
095: behavior.setRange(range);
096: if (behavior.getMatcher() == null)
097: behavior.setMatcher(defaultMatcher);
098: }
099:
100: /**
101: * (non-Javadoc)
102: * @see org.jingle.mocquer.internal.BehaviorSet#setDefaultReturnValue(java.lang.Object)
103: */
104: public void setDefaultReturnValue(Object retValue) {
105: MockBehavior behavior = findBehavior();
106: behavior.setRetValue(retValue);
107: behavior.setArguments(null);
108: if (behavior.getMatcher() == null)
109: behavior.setMatcher(defaultMatcher);
110: }
111:
112: /**
113: * (non-Javadoc)
114: * @see org.jingle.mocquer.internal.BehaviorSet#setThrowable(java.lang.Throwable, org.jingle.mocquer.Range)
115: */
116: public void setThrowable(Throwable throwable, Range range) {
117: MockBehavior behavior = findBehavior();
118: behavior.setThrowable(throwable);
119: if (range != null)
120: behavior.setRange(range);
121: if (behavior.getMatcher() == null)
122: behavior.setMatcher(defaultMatcher);
123: }
124:
125: /**
126: * (non-Javadoc)
127: * @see org.jingle.mocquer.internal.BehaviorSet#setDefaultThrowable(java.lang.Throwable)
128: */
129: public void setDefaultThrowable(Throwable throwable) {
130: MockBehavior behavior = findBehavior();
131: behavior.setThrowable(throwable);
132: behavior.setArguments(null);
133: if (behavior.getMatcher() == null)
134: behavior.setMatcher(defaultMatcher);
135: }
136:
137: /**
138: * (non-Javadoc)
139: *
140: * @see org.jingle.mocquer.internal.BehaviorSet#verify()
141: */
142: public void verify() {
143: for (int i = 1; i <= behaviorList.size(); i++) {
144: MockBehavior item = (MockBehavior) behaviorList.get(i - 1);
145: Range range = item.getRange();
146: int actualTimes = item.getActualTimes();
147: if (!range.inRange(actualTimes))
148: throw new AssertionFailedError("Method ["
149: + item.getMethod()
150: + "] is expected to be called " + range
151: + " times, but is called " + actualTimes
152: + " times actually.");
153: }
154: }
155:
156: /**
157: * (non-Javadoc)
158: *
159: * @see org.jingle.mocquer.internal.BehaviorSet#reset()
160: */
161: public void reset() {
162: behaviorList.clear();
163: }
164:
165: /**
166: * (non-Javadoc)
167: *
168: * @see org.jingle.mocquer.internal.BehaviorSet#replay()
169: */
170: public void replay() {
171: for (int i = 1; i <= behaviorList.size(); i++) {
172: MockBehavior bahavior = (MockBehavior) behaviorList
173: .get(i - 1);
174: bahavior.reset();
175: }
176: }
177:
178: /**
179: * (non-Javadoc)
180: * @see org.jingle.mocquer.internal.BehaviorSet#setMatcher(org.jingle.mocquer.ArgumentsMatcher)
181: */
182: public void setMatcher(ArgumentsMatcher matcher) {
183: MockBehavior behavior = findBehavior();
184: behavior.setMatcher(matcher);
185: }
186:
187: /**
188: * (non-Javadoc)
189: * @see org.jingle.mocquer.internal.BehaviorSet#isEmpty()
190: */
191: public boolean isEmpty() {
192: return behaviorList.isEmpty();
193: }
194:
195: /**
196: * (non-Javadoc)
197: * @see org.jingle.mocquer.internal.BehaviorSet#setDefaultMatcher(org.jingle.mocquer.ArgumentsMatcher)
198: */
199: public void setDefaultMatcher(ArgumentsMatcher matcher) {
200: this .defaultMatcher = matcher;
201: }
202:
203: /**
204: * (non-Javadoc)
205: * @see org.jingle.mocquer.internal.BehaviorSet#setVoidCallable(org.jingle.mocquer.Range)
206: */
207: public void setVoidCallable(Range range) {
208: MockBehavior behavior = findBehavior();
209: behavior.setVoidCallable();
210: if (range != null)
211: behavior.setRange(range);
212: if (behavior.getMatcher() == null)
213: behavior.setMatcher(defaultMatcher);
214: }
215:
216: /**
217: * (non-Javadoc)
218: * @see org.jingle.mocquer.internal.BehaviorSet#setDefaultVoidCallable()
219: */
220: public void setDefaultVoidCallable() {
221: MockBehavior behavior = findBehavior();
222: behavior.setVoidCallable();
223: behavior.setArguments(null);
224: if (behavior.getMatcher() == null)
225: behavior.setMatcher(defaultMatcher);
226: }
227:
228: }
|