/* * 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 org.skyscreamer.jsonassert; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.skyscreamer.jsonassert.ValueMatcher; /** * A JSONassert value matcher that matches actual value to regular expression. * If non-null regular expression passed to constructor, then all actual values * will be compared against this constant pattern, ignoring any expected value * passed to equal method. If null regular expression passed to constructor, * then expected value passed to equals method will be used to dynamically * specify regular expression pattern that actual value must match. * * @author Duncan Mackinder * */ public class RegularExpressionValueMatcher<T> implements ValueMatcher<T> { private final Pattern expectedPattern; /** * Create RegularExpressionValueMatcher in which the pattern the actual * value must match with be specified dynamically from the expected string * passed to this matcher in the equals method. */ public RegularExpressionValueMatcher() { this(null); } /** * Create RegularExpressionValueMatcher with specified pattern. If pattern * is not null, it must be a valid regular expression that defines a * constant expected pattern that every actual value must match (in this * case the expected value passed to equal method will be ignored). If * pattern is null, the pattern the actual value must match with be * specified dynamically from the expected string passed to this matcher in * the equals method. * * @param pattern * if non null, regular expression pattern which all actual * values this matcher is applied to must match. If null, this * matcher will apply pattern specified dynamically via the * expected parameter to the equal method. * @throws IllegalArgumentException * if pattern is non-null and not a valid regular expression. */ public RegularExpressionValueMatcher(String pattern) throws IllegalArgumentException { try { expectedPattern = pattern == null ? null : Pattern.compile(pattern); } catch (PatternSyntaxException e) { throw new IllegalArgumentException("Constant expected pattern invalid: " + e.getMessage(), e); } } @Override public boolean equal(T actual, T expected) { String actualString = actual.toString(); String expectedString = expected.toString(); try { Pattern pattern = isStaticPattern() ? expectedPattern : Pattern .compile(expectedString); if (!pattern.matcher(actualString).matches()) { throw new ValueMatcherException(getPatternType() + " expected pattern did not match value", pattern.toString(), actualString); } } catch (PatternSyntaxException e) { throw new ValueMatcherException(getPatternType() + " expected pattern invalid: " + e.getMessage(), e, expectedString, actualString); } return true; } private boolean isStaticPattern() { return expectedPattern != null; } private String getPatternType() { return isStaticPattern()? "Constant": "Dynamic"; } }