blob: 5c30773352da10cb3030cecf7962ef29c6d0b792 [file] [log] [blame]
/*
* Copyright 2012-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.facebook.buck.testutil;
import org.hamcrest.Description;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;
import java.util.regex.Pattern;
/**
* Assertion helper for hamcrest library that checks if a given string matches a regular expression
* or whether it contains a fragment that matches some pattern.
*/
public class RegexMatcher extends TypeSafeMatcher<CharSequence> {
protected final Pattern pattern;
public RegexMatcher(Pattern pattern) {
this.pattern = pattern;
}
@Override
protected boolean matchesSafely(CharSequence charSequence) {
return pattern.matcher(charSequence).matches();
}
@Override
public void describeTo(Description description) {
description
.appendText("a string with pattern \"")
.appendText(pattern.toString())
.appendText("\"");
}
@Override
public void describeMismatchSafely(CharSequence charSequence, Description mismatchDescription) {
mismatchDescription
.appendText("was \"")
.appendText(charSequence.toString())
.appendText("\"");
}
private static class RegexFindMatcher extends RegexMatcher {
public RegexFindMatcher(Pattern pattern) {
super(pattern);
}
@Override
protected boolean matchesSafely(CharSequence charSequence) {
return pattern.matcher(charSequence).find();
}
@Override
public void describeTo(Description description) {
description
.appendText("a string containing pattern \"")
.appendText(pattern.toString())
.appendText("\"");
}
}
/**
* Creates a matcher that checks if the examined {@link CharSequence} matches the specified
* {@link Pattern}.
* <p/>
* For example:
* <pre>assertThat("Test-42", matchesPattern(Pattern.compile("^Test-[0-9]+$")))</pre>
*
* @param pattern
* the pattern that the returned matcher will use to match any examined {@link CharSequence}
*/
@Factory
public static Matcher<CharSequence> matchesPattern(Pattern pattern) {
return new RegexMatcher(pattern);
}
/**
* Creates a matcher that checks if the examined {@link CharSequence} matches the specified
* regular expression.
* <p/>
* For example:
* <pre>assertThat("Example-43", matchesRegex("^Example-[0-9]+$"))</pre>
*
* @param regex
* the regular expression that the returned matcher will use to match any examined
* {@link CharSequence}
*/
@Factory
public static Matcher<CharSequence> matchesRegex(String regex) {
return matchesPattern(Pattern.compile(regex));
}
/**
* Creates a matcher that checks if a specified {@link Pattern} can be found in the examined
* {@link CharSequence}
* <p/>
* For example:
* <pre>assertThat("Test-42-Test", containsPattern(Pattern.compile("[0-9]+")))</pre>
*
* @param pattern
* the pattern that the returned matcher will use to find a match in any examined
* {@link CharSequence}
*/
@Factory
public static Matcher<CharSequence> containsPattern(Pattern pattern) {
return new RegexFindMatcher(pattern);
}
/**
* Creates a matcher that checks if a specified regular expression can be found in the examined
* {@link CharSequence}
* <p/>
* For example:
* <pre>assertThat("Test-571-Test", containsRegex("[0-9]+"))</pre>
*
* @param regex
* the regular expression that the returned matcher will use to find a match in any examined
* {@link CharSequence}
*/
@Factory
public static Matcher<CharSequence> containsRegex(String regex) {
return containsPattern(Pattern.compile(regex));
}
}