cdafcca9a07037aff38a6b19cf035161beb9f993
[Sone.git] / src / test / java / net / pterodactylus / sone / Matchers.java
1 /*
2  * Sone - Matchers.java - Copyright © 2013 David Roden
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 package net.pterodactylus.sone;
19
20 import static com.google.common.base.Objects.equal;
21 import static com.google.common.collect.Iterators.size;
22 import static java.util.Arrays.asList;
23 import static java.util.regex.Pattern.compile;
24
25 import java.io.IOException;
26 import java.io.InputStream;
27 import java.util.Collection;
28 import java.util.Iterator;
29 import java.util.List;
30
31 import freenet.support.SimpleFieldSet;
32
33 import com.google.common.base.Objects;
34 import com.google.common.collect.Lists;
35 import org.hamcrest.Description;
36 import org.hamcrest.Matcher;
37 import org.hamcrest.TypeSafeMatcher;
38
39 /**
40  * Matchers used throughout the tests.
41  *
42  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
43  */
44 public class Matchers {
45
46         public static Matcher<String> matchesRegex(final String regex) {
47                 return new TypeSafeMatcher<String>() {
48                         @Override
49                         protected boolean matchesSafely(String item) {
50                                 return compile(regex).matcher(item).matches();
51                         }
52
53                         @Override
54                         public void describeTo(Description description) {
55                                 description.appendText("matches: ").appendValue(regex);
56                         }
57                 };
58         }
59
60         public static Matcher<InputStream> delivers(final byte[] data) {
61                 return new TypeSafeMatcher<InputStream>() {
62                         byte[] readData = new byte[data.length];
63
64                         @Override
65                         protected boolean matchesSafely(InputStream inputStream) {
66                                 int offset = 0;
67                                 try {
68                                         while (true) {
69                                                 int r = inputStream.read();
70                                                 if (r == -1) {
71                                                         return offset == data.length;
72                                                 }
73                                                 if (offset == data.length) {
74                                                         return false;
75                                                 }
76                                                 if (data[offset] != (readData[offset] = (byte) r)) {
77                                                         return false;
78                                                 }
79                                                 offset++;
80                                         }
81                                 } catch (IOException ioe1) {
82                                         return false;
83                                 }
84                         }
85
86                         @Override
87                         public void describeTo(Description description) {
88                                 description.appendValue(data);
89                         }
90
91                         @Override
92                         protected void describeMismatchSafely(InputStream item, Description mismatchDescription) {
93                                 mismatchDescription.appendValue(readData);
94                         }
95                 };
96         }
97
98 }