001 package org.hamcrest.core;
002
003 import java.util.ArrayList;
004 import java.util.Arrays;
005 import java.util.List;
006
007 import org.hamcrest.Description;
008 import org.hamcrest.Factory;
009 import org.hamcrest.Matcher;
010
011 /**
012 * Calculates the logical disjunction of multiple matchers. Evaluation is shortcut, so
013 * subsequent matchers are not called if an earlier matcher returns <code>true</code>.
014 */
015 public class AnyOf<T> extends ShortcutCombination<T> {
016
017 public AnyOf(Iterable<Matcher<? super T>> matchers) {
018 super(matchers);
019 }
020
021 @Override
022 public boolean matches(Object o) {
023 return matches(o, true);
024 }
025
026 @Override
027 public void describeTo(Description description) {
028 describeTo(description, "or");
029 }
030
031 /**
032 * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
033 * <p/>
034 * For example:
035 * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
036 */
037 @Factory
038 public static <T> AnyOf<T> anyOf(Iterable<Matcher<? super T>> matchers) {
039 return new AnyOf<T>(matchers);
040 }
041
042 /**
043 * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
044 * <p/>
045 * For example:
046 * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
047 */
048 @Factory
049 public static <T> AnyOf<T> anyOf(Matcher<? super T>... matchers) {
050 return anyOf(Arrays.asList(matchers));
051 }
052
053 /**
054 * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
055 * <p/>
056 * For example:
057 * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
058 */
059 @Factory
060 public static <T> AnyOf<T> anyOf(Matcher<T> first, Matcher<? super T> second) {
061 List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>();
062 matchers.add(first);
063 matchers.add(second);
064 return anyOf(matchers);
065 }
066
067 /**
068 * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
069 * <p/>
070 * For example:
071 * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
072 */
073 @Factory
074 public static <T> AnyOf<T> anyOf(Matcher<T> first, Matcher<? super T> second, Matcher<? super T> third) {
075 List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>();
076 matchers.add(first);
077 matchers.add(second);
078 matchers.add(third);
079 return anyOf(matchers);
080 }
081
082 /**
083 * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
084 * <p/>
085 * For example:
086 * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
087 */
088 @Factory
089 public static <T> AnyOf<T> anyOf(Matcher<T> first, Matcher<? super T> second, Matcher<? super T> third, Matcher<? super T> fourth) {
090 List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>();
091 matchers.add(first);
092 matchers.add(second);
093 matchers.add(third);
094 matchers.add(fourth);
095 return anyOf(matchers);
096 }
097
098 /**
099 * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
100 * <p/>
101 * For example:
102 * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
103 */
104 @Factory
105 public static <T> AnyOf<T> anyOf(Matcher<T> first, Matcher<? super T> second, Matcher<? super T> third, Matcher<? super T> fourth, Matcher<? super T> fifth) {
106 List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>();
107 matchers.add(first);
108 matchers.add(second);
109 matchers.add(third);
110 matchers.add(fourth);
111 matchers.add(fifth);
112 return anyOf(matchers);
113 }
114
115 /**
116 * Creates a matcher that matches if the examined object matches <b>ANY</b> of the specified matchers.
117 * <p/>
118 * For example:
119 * <pre>assertThat("myValue", anyOf(startsWith("foo"), containsString("Val")))</pre>
120 */
121 @Factory
122 public static <T> AnyOf<T> anyOf(Matcher<T> first, Matcher<? super T> second, Matcher<? super T> third, Matcher<? super T> fourth, Matcher<? super T> fifth, Matcher<? super T> sixth) {
123 List<Matcher<? super T>> matchers = new ArrayList<Matcher<? super T>>();
124 matchers.add(first);
125 matchers.add(second);
126 matchers.add(third);
127 matchers.add(fourth);
128 matchers.add(fifth);
129 matchers.add(sixth);
130 return anyOf(matchers);
131 }
132 }