• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2003-2009 OFFIS, Henri Tremblay
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.easymock;
17 
18 import java.io.Serializable;
19 import java.util.ArrayList;
20 import java.util.List;
21 
22 /**
23  * Will contain what was captured by the <code>capture()</code> matcher. Knows
24  * if something was captured or not (allows to capture a null value).
25  *
26  * @param <T>
27  *            Type of the captured element
28  */
29 public class Capture<T> implements Serializable {
30 
31     private static final long serialVersionUID = -4214363692271370781L;
32 
33     private CaptureType type;
34 
35     private final List<T> values = new ArrayList<T>(2);
36 
37     /**
38      * Default constructor. Only the last element will be captured
39      */
Capture()40     public Capture() {
41         this(CaptureType.LAST);
42     }
43 
44     /**
45      * Constructor allowing to select the capture type
46      *
47      * @param type
48      *            capture type
49      */
Capture(CaptureType type)50     public Capture(CaptureType type) {
51         this.type = type;
52     }
53 
54     /**
55      * Will reset capture to a "nothing captured yet" state
56      */
reset()57     public void reset() {
58         values.clear();
59     }
60 
61     /**
62      * @return true if something was captured
63      */
hasCaptured()64     public boolean hasCaptured() {
65         return !values.isEmpty();
66     }
67 
68     /**
69      * Return captured value
70      *
71      * @throws AssertionError
72      *             if nothing was captured yet or if more than one value was
73      *             captured
74      * @return The last captured value
75      */
getValue()76     public T getValue() {
77         if (values.isEmpty()) {
78             throw new AssertionError("Nothing captured yet");
79         }
80         if (values.size() > 1) {
81             throw new AssertionError("More than one value captured: "
82                     + getValues());
83         }
84         return values.get(values.size() - 1);
85     }
86 
87     /**
88      * Return all captured values. It returns the actual list so you can modify
89      * it's content if needed
90      *
91      * @return The currently captured values
92      */
getValues()93     public List<T> getValues() {
94         return values;
95     }
96 
97     /**
98      * Used internally by the EasyMock framework to add a new captured value
99      *
100      * @param value
101      *            Value captured
102      */
setValue(T value)103     public void setValue(T value) {
104         switch (type) {
105         case NONE:
106             break;
107         case ALL:
108             values.add(value);
109             break;
110         case FIRST:
111             if (!hasCaptured()) {
112                 values.add(value);
113             }
114             break;
115         case LAST:
116             if (hasCaptured()) {
117                 reset();
118             }
119             values.add(value);
120             break;
121         // ///CLOVER:OFF
122         default:
123             throw new IllegalArgumentException("Unknown capture type: " + type);
124         // ///CLOVER:ON
125         }
126     }
127 
128     @Override
toString()129     public String toString() {
130         if (values.isEmpty()) {
131             return "Nothing captured yet";
132         }
133         if (values.size() == 1) {
134             return String.valueOf(values.get(0));
135         }
136         return values.toString();
137     }
138 }
139