1/*
2 * Copyright (c) 2007 Mockito contributors
3 * This program is made available under the terms of the MIT License.
4 */
5package org.mockito;
6
7import org.hamcrest.Matcher;
8import org.mockito.internal.matchers.*;
9import org.mockito.internal.matchers.apachecommons.ReflectionEquals;
10import org.mockito.internal.progress.HandyReturnValues;
11import org.mockito.internal.progress.MockingProgress;
12import org.mockito.internal.progress.ThreadSafeMockingProgress;
13
14import java.util.Collection;
15import java.util.List;
16import java.util.Map;
17import java.util.Set;
18
19/**
20 * Allow flexible verification or stubbing. See also {@link AdditionalMatchers}.
21 * <p>
22 * {@link Mockito} extends Matchers so to get access to all matchers just import Mockito class statically.
23 * <pre class="code"><code class="java">
24 *  //stubbing using anyInt() argument matcher
25 *  when(mockedList.get(anyInt())).thenReturn("element");
26 *
27 *  //following prints "element"
28 *  System.out.println(mockedList.get(999));
29 *
30 *  //you can also verify using argument matcher
31 *  verify(mockedList).get(anyInt());
32 * </code></pre>
33 * Scroll down to see all methods - full list of matchers.
34 * <p>
35 * <b>Warning:</b>
36 * <p>
37 * If you are using argument matchers, <b>all arguments</b> have to be provided by matchers.
38 * <p>
39 * E.g: (example shows verification but the same applies to stubbing):
40 * <pre class="code"><code class="java">
41 *   verify(mock).someMethod(anyInt(), anyString(), <b>eq("third argument")</b>);
42 *   //above is correct - eq() is also an argument matcher
43 *
44 *   verify(mock).someMethod(anyInt(), anyString(), <b>"third argument"</b>);
45 *   //above is incorrect - exception will be thrown because third argument is given without argument matcher.
46 * </code></pre>
47 * <p>
48 * Matcher methods like <code>anyObject()</code>, <code>eq()</code> <b>do not</b> return matchers.
49 * Internally, they record a matcher on a stack and return a dummy value (usually null).
50 * This implementation is due static type safety imposed by java compiler.
51 * The consequence is that you cannot use <code>anyObject()</code>, <code>eq()</code> methods outside of verified/stubbed method.
52 *
53 * <p>
54 * <b>Warning 2:</b>
55 * <p>
56 * The any family methods <b>*don't do any type checks*</b>, those are only here to avoid casting
57 * in your code. If you want to perform type checks use the {@link #isA(Class)} method.
58 * This <b>might</b> however change (type checks could be added) in a future major release.
59 *
60 * <h1>Custom Argument Matchers</h1>
61 *
62 * Use {@link Matchers#argThat} method and pass an instance of hamcrest {@link Matcher}.
63 * <p>
64 * Before you start implementing your own custom argument matcher, make sure you check out {@link ArgumentCaptor} api.
65 * <p>
66 * So, how to implement your own argument matcher?
67 * First, you might want to subclass {@link ArgumentMatcher} which is an hamcrest matcher with predefined describeTo() method.
68 * Default description generated by describeTo() uses <b>decamelized class name</b> - to promote meaningful class names.
69 * <p>
70 * Example:
71 *
72 * <pre class="code"><code class="java">
73 *   class IsListOfTwoElements extends ArgumentMatcher&lt;List&gt; {
74 *      public boolean matches(Object list) {
75 *          return ((List) list).size() == 2;
76 *      }
77 *   }
78 *
79 *   List mock = mock(List.class);
80 *
81 *   when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true);
82 *
83 *   mock.addAll(Arrays.asList("one", "two"));
84 *
85 *   verify(mock).addAll(argThat(new IsListOfTwoElements()));
86 * </code></pre>
87 *
88 * To keep it readable you may want to extract method, e.g:
89 * <pre class="code"><code class="java">
90 *   verify(mock).addAll(<b>argThat(new IsListOfTwoElements())</b>);
91 *   //becomes
92 *   verify(mock).addAll(<b>listOfTwoElements()</b>);
93 * </code></pre>
94 *
95 * <b>Warning:</b> Be reasonable with using complicated argument matching, especially custom argument matchers, as it can make the test less readable.
96 * Sometimes it's better to implement equals() for arguments that are passed to mocks
97 * (Mockito naturally uses equals() for argument matching).
98 * This can make the test cleaner.
99 * <p>
100 * Also, <b>sometimes {@link ArgumentCaptor} may be a better fit</b> than custom matcher.
101 * For example, if custom argument matcher is not likely to be reused
102 * or you just need it to assert on argument values to complete verification of behavior.
103 */
104@SuppressWarnings("unchecked")
105public class Matchers {
106
107    private static MockingProgress mockingProgress = new ThreadSafeMockingProgress();
108
109    /**
110     * Any <code>boolean</code>, <code>Boolean</code> or <code>null</code>.
111     * <p>
112     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
113     * in your code. This might however change (type checks could be added) in a
114     * future major release.
115     * <p>
116     * See examples in javadoc for {@link Matchers} class
117     *
118     * @return <code>false</code>.
119     */
120    public static boolean anyBoolean() {
121        return reportMatcher(Any.ANY).returnFalse();
122    }
123
124    /**
125     * Any <code>byte</code>, <code>Byte</code> or <code>null</code>.
126     * <p>
127     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
128     * in your code. This might however change (type checks could be added) in a
129     * future major release.
130     * <p>
131     * See examples in javadoc for {@link Matchers} class
132     *
133     * @return <code>0</code>.
134     */
135    public static byte anyByte() {
136        return reportMatcher(Any.ANY).returnZero();
137    }
138
139    /**
140     * Any <code>char</code>, <code>Character</code> or <code>null</code>.
141     * <p>
142     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
143     * in your code. This might however change (type checks could be added) in a
144     * future major release.
145     * <p>
146     * See examples in javadoc for {@link Matchers} class
147     *
148     * @return <code>0</code>.
149     */
150    public static char anyChar() {
151        return reportMatcher(Any.ANY).returnChar();
152    }
153
154    /**
155     * Any int, Integer or <code>null</code>.
156     * <p>
157     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
158     * in your code. This might however change (type checks could be added) in a
159     * future major release.
160     * <p>
161     * See examples in javadoc for {@link Matchers} class
162     *
163     * @return <code>0</code>.
164     */
165    public static int anyInt() {
166        return reportMatcher(Any.ANY).returnZero();
167    }
168
169    /**
170     * Any <code>long</code>, <code>Long</code> or <code>null</code>.
171     * <p>
172     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
173     * in your code. This might however change (type checks could be added) in a
174     * future major release.
175     * <p>
176     * See examples in javadoc for {@link Matchers} class
177     *
178     * @return <code>0</code>.
179     */
180    public static long anyLong() {
181        return reportMatcher(Any.ANY).returnZero();
182    }
183
184    /**
185     * Any <code>float</code>, <code>Float</code> or <code>null</code>.
186     * <p>
187     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
188     * in your code. This might however change (type checks could be added) in a
189     * future major release.
190     * <p>
191     * See examples in javadoc for {@link Matchers} class
192     *
193     * @return <code>0</code>.
194     */
195    public static float anyFloat() {
196        return reportMatcher(Any.ANY).returnZero();
197    }
198
199    /**
200     * Any <code>double</code>, <code>Double</code> or <code>null</code>.
201     * <p>
202     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
203     * in your code. This might however change (type checks could be added) in a
204     * future major release.
205     * <p>
206     * See examples in javadoc for {@link Matchers} class
207     *
208     * @return <code>0</code>.
209     */
210    public static double anyDouble() {
211        return reportMatcher(Any.ANY).returnZero();
212    }
213
214    /**
215     * Any <code>short</code>, <code>Short</code> or <code>null</code>.
216     * <p>
217     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
218     * in your code. This might however change (type checks could be added) in a
219     * future major release.
220     * <p>
221     * See examples in javadoc for {@link Matchers} class
222     *
223     * @return <code>0</code>.
224     */
225    public static short anyShort() {
226        return reportMatcher(Any.ANY).returnZero();
227    }
228
229    /**
230     * Any <code>Object</code> or <code>null</code>.
231     * <p>
232     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
233     * in your code. This might however change (type checks could be added) in a
234     * future major release.
235     * <p>
236     * Has aliases: {@link #any()} and {@link #any(Class clazz)}
237     * <p>
238     * See examples in javadoc for {@link Matchers} class
239     *
240     * @return <code>null</code>.
241     */
242    public static <T> T anyObject() {
243        return (T) reportMatcher(Any.ANY).returnNull();
244    }
245
246    /**
247     * Any vararg, meaning any number and values of arguments.
248     * <p>
249     * Example:
250     * <pre class="code"><code class="java">
251     *   //verification:
252     *   mock.foo(1, 2);
253     *   mock.foo(1, 2, 3, 4);
254     *
255     *   verify(mock, times(2)).foo(anyVararg());
256     *
257     *   //stubbing:
258     *   when(mock.foo(anyVararg()).thenReturn(100);
259     *
260     *   //prints 100
261     *   System.out.println(mock.foo(1, 2));
262     *   //also prints 100
263     *   System.out.println(mock.foo(1, 2, 3, 4));
264     * </code></pre>
265     * See examples in javadoc for {@link Matchers} class
266     *
267     * @return <code>null</code>.
268     */
269    public static <T> T anyVararg() {
270        return (T) reportMatcher(AnyVararg.ANY_VARARG).returnNull();
271    }
272
273    /**
274     * Any kind object, not necessary of the given class.
275     * The class argument is provided only to avoid casting.
276     * <p>
277     * Sometimes looks better than <code>anyObject()</code> - especially when explicit casting is required
278     * <p>
279     * Alias to {@link Matchers#anyObject()}
280     * <p>
281     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
282     * in your code. This might however change (type checks could be added) in a
283     * future major release.
284     * <p>
285     * See examples in javadoc for {@link Matchers} class
286     *
287     * @param clazz The type to avoid casting
288     * @return <code>null</code>.
289     */
290    public static <T> T any(Class<T> clazz) {
291        return (T) reportMatcher(Any.ANY).returnFor(clazz);
292    }
293
294    /**
295     * Any object or <code>null</code>.
296     * <p>
297     * Shorter alias to {@link Matchers#anyObject()}
298     * <p>
299     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
300     * in your code. This might however change (type checks could be added) in a
301     * future major release.
302     * <p>
303     * See examples in javadoc for {@link Matchers} class
304     *
305     * @return <code>null</code>.
306     */
307    public static <T> T any() {
308        return (T) anyObject();
309    }
310
311    /**
312     * Any <code>String</code> or <code>null</code>.
313     * <p>
314     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
315     * in your code. This might however change (type checks could be added) in a
316     * future major release.
317     * <p>
318     * See examples in javadoc for {@link Matchers} class
319     *
320     * @return empty String ("")
321     */
322    public static String anyString() {
323        return reportMatcher(Any.ANY).returnString();
324    }
325
326    /**
327     * Any <code>List</code> or <code>null</code>.
328     * <p>
329     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
330     * in your code. This might however change (type checks could be added) in a
331     * future major release.
332     * <p>
333     * See examples in javadoc for {@link Matchers} class
334     *
335     * @return empty List.
336     */
337    public static List anyList() {
338        return reportMatcher(Any.ANY).returnList();
339    }
340
341    /**
342     * Generic friendly alias to {@link Matchers#anyList()}.
343     * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
344     * <p>
345     * Any <code>List</code> or <code>null</code>.
346     * <p>
347     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
348     * in your code. This might however change (type checks could be added) in a
349     * future major release.
350     * <p>
351     * See examples in javadoc for {@link Matchers} class
352     *
353     * @param clazz Type owned by the list to avoid casting
354     * @return empty List.
355     */
356    public static <T> List<T> anyListOf(Class<T> clazz) {
357        return (List) reportMatcher(Any.ANY).returnList();
358    }
359
360    /**
361     * Any <code>Set</code> or <code>null</code>.
362     * <p>
363     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
364     * in your code. This might however change (type checks could be added) in a
365     * future major release.
366     * <p>
367     * See examples in javadoc for {@link Matchers} class
368     *
369     * @return empty Set
370     */
371    public static Set anySet() {
372        return reportMatcher(Any.ANY).returnSet();
373    }
374
375    /**
376     * Generic friendly alias to {@link Matchers#anySet()}.
377     * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
378     * <p>
379     * Any <code>Set</code> or <code>null</code>
380     * <p>
381     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
382     * in your code. This might however change (type checks could be added) in a
383     * future major release.
384     * <p>
385     * See examples in javadoc for {@link Matchers} class
386     *
387     * @param clazz Type owned by the Set to avoid casting
388     * @return empty Set
389     */
390    public static <T> Set<T> anySetOf(Class<T> clazz) {
391        return (Set) reportMatcher(Any.ANY).returnSet();
392    }
393
394    /**
395     * Any <code>Map</code> or <code>null</code>.
396     * <p>
397     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
398     * in your code. This might however change (type checks could be added) in a
399     * future major release.
400     * <p>
401     * See examples in javadoc for {@link Matchers} class
402     *
403     * @return empty Map.
404     */
405    public static Map anyMap() {
406        return reportMatcher(Any.ANY).returnMap();
407    }
408
409    /**
410     * Generic friendly alias to {@link Matchers#anyMap()}.
411     * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
412     * <p>
413     * Any <code>Map</code> or <code>null</code>
414     * <p>
415     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
416     * in your code. This might however change (type checks could be added) in a
417     * future major release.
418     * <p>
419     * See examples in javadoc for {@link Matchers} class
420     *
421     * @param keyClazz Type of the map key to avoid casting
422     * @param valueClazz Type of the value to avoid casting
423     * @return empty Map.
424     */
425    public static <K, V>  Map<K, V> anyMapOf(Class<K> keyClazz, Class<V> valueClazz) {
426        return reportMatcher(Any.ANY).returnMap();
427    }
428
429    /**
430     * Any <code>Collection</code> or <code>null</code>.
431     * <p>
432     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
433     * in your code. This might however change (type checks could be added) in a
434     * future major release.
435     * <p>
436     * See examples in javadoc for {@link Matchers} class
437     *
438     * @return empty Collection.
439     */
440    public static Collection anyCollection() {
441        return reportMatcher(Any.ANY).returnList();
442    }
443
444    /**
445     * Generic friendly alias to {@link Matchers#anyCollection()}.
446     * It's an alternative to &#064;SuppressWarnings("unchecked") to keep code clean of compiler warnings.
447     * <p>
448     * Any <code>Collection</code> or <code>null</code>.
449     * <p>
450     * This method <b>*don't do any type checks*</b>, it is only there to avoid casting
451     * in your code. This might however change (type checks could be added) in a
452     * future major release.
453     * <p>
454     * See examples in javadoc for {@link Matchers} class
455     *
456     * @param clazz Type owned by the collection to avoid casting
457     * @return empty Collection.
458     */
459    public static <T> Collection<T> anyCollectionOf(Class<T> clazz) {
460        return (Collection) reportMatcher(Any.ANY).returnList();
461    }
462
463    /**
464     * <code>Object</code> argument that implements the given class.
465     * <p>
466     * See examples in javadoc for {@link Matchers} class
467     *
468     * @param <T>
469     *            the accepted type.
470     * @param clazz
471     *            the class of the accepted type.
472     * @return <code>null</code>.
473     */
474    public static <T> T isA(Class<T> clazz) {
475        return reportMatcher(new InstanceOf(clazz)).<T>returnFor(clazz);
476    }
477
478    /**
479     * <code>boolean</code> argument that is equal to the given value.
480     * <p>
481     * See examples in javadoc for {@link Matchers} class
482     *
483     * @param value
484     *            the given value.
485     * @return <code>0</code>.
486     */
487    public static boolean eq(boolean value) {
488        return reportMatcher(new Equals(value)).returnFalse();
489    }
490
491    /**
492     * <code>byte</code> argument that is equal to the given value.
493     * <p>
494     * See examples in javadoc for {@link Matchers} class
495     *
496     * @param value
497     *            the given value.
498     * @return <code>0</code>.
499     */
500    public static byte eq(byte value) {
501        return reportMatcher(new Equals(value)).returnZero();
502    }
503
504    /**
505     * <code>char</code> argument that is equal to the given value.
506     * <p>
507     * See examples in javadoc for {@link Matchers} class
508     *
509     * @param value
510     *            the given value.
511     * @return <code>0</code>.
512     */
513    public static char eq(char value) {
514        return reportMatcher(new Equals(value)).returnChar();
515    }
516
517    /**
518     * <code>double</code> argument that is equal to the given value.
519     * <p>
520     * See examples in javadoc for {@link Matchers} class
521     *
522     * @param value
523     *            the given value.
524     * @return <code>0</code>.
525     */
526    public static double eq(double value) {
527        return reportMatcher(new Equals(value)).returnZero();
528    }
529
530    /**
531     * <code>float</code> argument that is equal to the given value.
532     * <p>
533     * See examples in javadoc for {@link Matchers} class
534     *
535     * @param value
536     *            the given value.
537     * @return <code>0</code>.
538     */
539    public static float eq(float value) {
540        return reportMatcher(new Equals(value)).returnZero();
541    }
542
543    /**
544     * <code>int</code> argument that is equal to the given value.
545     * <p>
546     * See examples in javadoc for {@link Matchers} class
547     *
548     * @param value
549     *            the given value.
550     * @return <code>0</code>.
551     */
552    public static int eq(int value) {
553        return reportMatcher(new Equals(value)).returnZero();
554    }
555
556    /**
557     * <code>long</code> argument that is equal to the given value.
558     * <p>
559     * See examples in javadoc for {@link Matchers} class
560     *
561     * @param value
562     *            the given value.
563     * @return <code>0</code>.
564     */
565    public static long eq(long value) {
566        return reportMatcher(new Equals(value)).returnZero();
567    }
568
569    /**
570     * <code>short</code> argument that is equal to the given value.
571     * <p>
572     * See examples in javadoc for {@link Matchers} class
573     *
574     * @param value
575     *            the given value.
576     * @return <code>0</code>.
577     */
578    public static short eq(short value) {
579        return reportMatcher(new Equals(value)).returnZero();
580    }
581
582    /**
583     * Object argument that is equal to the given value.
584     * <p>
585     * See examples in javadoc for {@link Matchers} class
586     *
587     * @param value
588     *            the given value.
589     * @return <code>null</code>.
590     */
591    public static <T> T eq(T value) {
592        return (T) reportMatcher(new Equals(value)).<T>returnFor(value);
593    }
594
595    /**
596     * Object argument that is reflection-equal to the given value with support for excluding
597     * selected fields from a class.
598     * <p>
599     * This matcher can be used when equals() is not implemented on compared objects.
600     * Matcher uses java reflection API to compare fields of wanted and actual object.
601     * <p>
602     * Works similarly to EqualsBuilder.reflectionEquals(this, other, exlucdeFields) from
603     * apache commons library.
604     * <p>
605     * <b>Warning</b> The equality check is shallow!
606     * <p>
607     * See examples in javadoc for {@link Matchers} class
608     *
609     * @param value
610     *            the given value.
611     * @param excludeFields
612     *            fields to exclude, if field does not exist it is ignored.
613     * @return <code>null</code>.
614     */
615    public static <T> T refEq(T value, String... excludeFields) {
616        return reportMatcher(new ReflectionEquals(value, excludeFields)).<T>returnNull();
617    }
618
619    /**
620     * Object argument that is the same as the given value.
621     * <p>
622     * See examples in javadoc for {@link Matchers} class
623     *
624     * @param <T>
625     *            the type of the object, it is passed through to prevent casts.
626     * @param value
627     *            the given value.
628     * @return <code>null</code>.
629     */
630    public static <T> T same(T value) {
631        return (T) reportMatcher(new Same(value)).<T>returnFor(value);
632    }
633
634    /**
635     * <code>null</code> argument.
636     * <p>
637     * See examples in javadoc for {@link Matchers} class
638     *
639     * @return <code>null</code>.
640     */
641    public static Object isNull() {
642        return reportMatcher(Null.NULL).returnNull();
643    }
644
645    /**
646     * <code>null</code> argument.
647     * The class argument is provided to avoid casting.
648     * <p>
649     * See examples in javadoc for {@link Matchers} class
650     *
651     * @param clazz Type to avoid casting
652     * @return <code>null</code>.
653     */
654    public static <T> T isNull(Class<T> clazz) {
655        return (T) reportMatcher(Null.NULL).returnNull();
656    }
657
658    /**
659     * Not <code>null</code> argument.
660     * <p>
661     * alias to {@link Matchers#isNotNull()}
662     * <p>
663     * See examples in javadoc for {@link Matchers} class
664     *
665     * @return <code>null</code>.
666     */
667    public static Object notNull() {
668        return reportMatcher(NotNull.NOT_NULL).returnNull();
669    }
670
671    /**
672     * Not <code>null</code> argument, not necessary of the given class.
673     * The class argument is provided to avoid casting.
674     * <p>
675     * alias to {@link Matchers#isNotNull(Class)}
676     * <p>
677     * See examples in javadoc for {@link Matchers} class
678     *
679     * @param clazz Type to avoid casting
680     * @return <code>null</code>.
681     */
682    public static <T> T notNull(Class<T> clazz) {
683        return (T) reportMatcher(NotNull.NOT_NULL).returnNull();
684    }
685
686    /**
687     * Not <code>null</code> argument.
688     * <p>
689     * alias to {@link Matchers#notNull()}
690     * <p>
691     * See examples in javadoc for {@link Matchers} class
692     *
693     * @return <code>null</code>.
694     */
695    public static Object isNotNull() {
696        return notNull();
697    }
698
699    /**
700     * Not <code>null</code> argument, not necessary of the given class.
701     * The class argument is provided to avoid casting.
702     * <p>
703     * alias to {@link Matchers#notNull(Class)}
704     * <p>
705     * See examples in javadoc for {@link Matchers} class
706     *
707     * @param clazz Type to avoid casting
708     * @return <code>null</code>.
709     */
710    public static <T> T isNotNull(Class<T> clazz) {
711        return notNull(clazz);
712    }
713
714    /**
715     * <code>String</code> argument that contains the given substring.
716     * <p>
717     * See examples in javadoc for {@link Matchers} class
718     *
719     * @param substring
720     *            the substring.
721     * @return empty String ("").
722     */
723    public static String contains(String substring) {
724        return reportMatcher(new Contains(substring)).returnString();
725    }
726
727    /**
728     * <code>String</code> argument that matches the given regular expression.
729     * <p>
730     * See examples in javadoc for {@link Matchers} class
731     *
732     * @param regex
733     *            the regular expression.
734     * @return empty String ("").
735     */
736    public static String matches(String regex) {
737        return reportMatcher(new Matches(regex)).returnString();
738    }
739
740    /**
741     * <code>String</code> argument that ends with the given suffix.
742     * <p>
743     * See examples in javadoc for {@link Matchers} class
744     *
745     * @param suffix
746     *            the suffix.
747     * @return empty String ("").
748     */
749    public static String endsWith(String suffix) {
750        return reportMatcher(new EndsWith(suffix)).returnString();
751    }
752
753    /**
754     * <code>String</code> argument that starts with the given prefix.
755     * <p>
756     * See examples in javadoc for {@link Matchers} class
757     *
758     * @param prefix
759     *            the prefix.
760     * @return empty String ("").
761     */
762    public static String startsWith(String prefix) {
763        return reportMatcher(new StartsWith(prefix)).returnString();
764    }
765
766    /**
767     * Allows creating custom argument matchers.
768     * <p>
769     * In rare cases when the parameter is a primitive then you <b>*must*</b> use relevant intThat(), floatThat(), etc. method.
770     * This way you will avoid <code>NullPointerException</code> during auto-unboxing.
771     * <p>
772     * See examples in javadoc for {@link ArgumentMatcher} class
773     *
774     * @param matcher decides whether argument matches
775     * @return <code>null</code>.
776     */
777    public static <T> T argThat(Matcher<T> matcher) {
778        return reportMatcher(matcher).<T>returnNull();
779    }
780
781    /**
782     * Allows creating custom <code>Character</code> argument matchers.
783     * <p>
784     * See examples in javadoc for {@link Matchers} class
785     *
786     * @param matcher decides whether argument matches
787     * @return <code>0</code>.
788     */
789    public static char charThat(Matcher<Character> matcher) {
790        return reportMatcher(matcher).returnChar();
791    }
792
793    /**
794     * Allows creating custom <code>Boolean</code> argument matchers.
795     * <p>
796     * See examples in javadoc for {@link Matchers} class
797     *
798     * @param matcher decides whether argument matches
799     * @return <code>false</code>.
800     */
801    public static boolean booleanThat(Matcher<Boolean> matcher) {
802        return reportMatcher(matcher).returnFalse();
803    }
804
805    /**
806     * Allows creating custom <code>Byte</code> argument matchers.
807     * <p>
808     * See examples in javadoc for {@link Matchers} class
809     *
810     * @param matcher decides whether argument matches
811     * @return <code>0</code>.
812     */
813    public static byte byteThat(Matcher<Byte> matcher) {
814        return reportMatcher(matcher).returnZero();
815    }
816
817    /**
818     * Allows creating custom <code>Short</code> argument matchers.
819     * <p>
820     * See examples in javadoc for {@link Matchers} class
821     *
822     * @param matcher decides whether argument matches
823     * @return <code>0</code>.
824     */
825    public static short shortThat(Matcher<Short> matcher) {
826        return reportMatcher(matcher).returnZero();
827    }
828
829    /**
830     * Allows creating custom <code>Integer</code> argument matchers.
831     * <p>
832     * See examples in javadoc for {@link Matchers} class
833     *
834     * @param matcher decides whether argument matches
835     * @return <code>0</code>.
836     */
837    public static int intThat(Matcher<Integer> matcher) {
838        return reportMatcher(matcher).returnZero();
839    }
840
841    /**
842     * Allows creating custom <code>Long</code> argument matchers.
843     * <p>
844     * See examples in javadoc for {@link Matchers} class
845     *
846     * @param matcher decides whether argument matches
847     * @return <code>0</code>.
848     */
849    public static long longThat(Matcher<Long> matcher) {
850        return reportMatcher(matcher).returnZero();
851    }
852
853    /**
854     * Allows creating custom <code>Float</code> argument matchers.
855     * <p>
856     * See examples in javadoc for {@link Matchers} class
857     *
858     * @param matcher decides whether argument matches
859     * @return <code>0</code>.
860     */
861    public static float floatThat(Matcher<Float> matcher) {
862        return reportMatcher(matcher).returnZero();
863    }
864
865    /**
866     * Allows creating custom <code>Double</code> argument matchers.
867     * <p>
868     * See examples in javadoc for {@link Matchers} class
869     *
870     * @param matcher decides whether argument matches
871     * @return <code>0</code>.
872     */
873    public static double doubleThat(Matcher<Double> matcher) {
874        return reportMatcher(matcher).returnZero();
875    }
876
877    private static HandyReturnValues reportMatcher(Matcher<?> matcher) {
878        return mockingProgress.getArgumentMatcherStorage().reportMatcher(matcher);
879    }
880}
881