From a631dc6a474bdf756cce56b9b218efb8aedeeb43 Mon Sep 17 00:00:00 2001 From: Sandro Mancuso Date: Sat, 19 May 2012 02:24:46 +0100 Subject: [PATCH 1/5] BeanMatcher and BeanPropertyMatcher --- .gitignore | 1 + .../java/org/hamcrest/beans/BeanMatcher.java | 53 ++++++++ .../hamcrest/beans/BeanPropertyMatcher.java | 123 ++++++++++++++++++ .../org/hamcrest/AbstractMatcherTest.java | 6 + .../org/hamcrest/beans/BeanMatcherTest.java | 5 + .../beans/BeanPropertyMatcherTest.java | 114 ++++++++++++++++ 6 files changed, 302 insertions(+) create mode 100644 hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java create mode 100644 hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java create mode 100644 hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java create mode 100644 hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyMatcherTest.java diff --git a/.gitignore b/.gitignore index 31a9c7035..9b37d0e90 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ /build /classes +/test-output .idea/dictionaries .idea/scopes .idea/workspace.xml diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java new file mode 100644 index 000000000..95d2c77b9 --- /dev/null +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java @@ -0,0 +1,53 @@ +package org.hamcrest.beans; + +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.Factory; +import org.hamcrest.Matcher; +import org.hamcrest.StringDescription; + +/** + * @author Sandro Mancuso + */ +public class BeanMatcher extends BaseMatcher { + + private BeanPropertyMatcher[] propertyMatchers; + private Description expectedDescription = new StringDescription(); + private Description mismatchDescription = new StringDescription(); + + public BeanMatcher(BeanPropertyMatcher... propertyMatchers) { + this.propertyMatchers = propertyMatchers; + } + + @Factory + public static BeanMatcher has(BeanPropertyMatcher... propertyMatchers) { + return new BeanMatcher(propertyMatchers); + } + + public boolean matches(Object item) { + boolean matches = true; + for (BeanPropertyMatcher matcher : propertyMatchers) { + if (!matcher.matches(item)) { + matches = false; + appendDescriptions(item, matcher); + } + } + return matches; + } + + public void describeTo(Description description) { + description.appendText(expectedDescription.toString()); + } + + @Override + public void describeMismatch(Object item, Description description) { + description.appendText(mismatchDescription.toString()); + } + + private void appendDescriptions(Object item, Matcher matcher) { + matcher.describeTo(expectedDescription); + matcher.describeMismatch(item, mismatchDescription); + mismatchDescription.appendText(" "); + } + +} diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java new file mode 100644 index 000000000..19ec549c0 --- /dev/null +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java @@ -0,0 +1,123 @@ +package org.hamcrest.beans; + +import static org.hamcrest.beans.PropertyUtil.NO_ARGUMENTS; +import static org.hamcrest.beans.PropertyUtil.getPropertyDescriptor; + +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; + +import org.hamcrest.Description; +import org.hamcrest.Factory; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeDiagnosingMatcher; + +/** + * @author Sandro Mancuso + */ +public class BeanPropertyMatcher extends TypeSafeDiagnosingMatcher { + + private String matchingPropertyName; + private Matcher valueMatcher; + + public BeanPropertyMatcher(String propertyName, Matcher valueMatcher) { + this.matchingPropertyName = propertyName; + this.valueMatcher = valueMatcher; + } + + @Factory + public static BeanPropertyMatcher property(String propertyName,Matcher value) { + return new BeanPropertyMatcher(propertyName, value); + } + + @Override + public boolean matchesSafely(T bean, Description mismatchDescription) { + try { + return matchesSafely(bean, matchingPropertyName, mismatchDescription); + } catch (Exception e) { + mismatchDescription.appendValue(e); + return false; + } + } + + private boolean matchesSafely(Object bean, String propertyName, Description mismatchDescription) + throws Exception { + Object parentObject = bean; + if (isComposedProperty(propertyName)) { + String memberObjectProperty = getMemberObjectProperty(propertyName); + Object memberObject = getPropertyValue(parentObject, memberObjectProperty); + String nextProperty = getNextProperty(propertyName); + return matchesSafely(memberObject, nextProperty, mismatchDescription); + } else { + return matchProperty(bean, propertyName, mismatchDescription); + } + } + + private String getNextProperty(String composedPropertyName) { + return composedPropertyName.substring(composedPropertyName.indexOf(".") + 1); + } + + private Object getPropertyValue(Object parentObject, String memberObjectProperty) + throws Exception { + PropertyDescriptor property = getPropertyDescriptor(memberObjectProperty, parentObject); + Method readMethod = property.getReadMethod(); + return readMethod.invoke(parentObject, NO_ARGUMENTS); + } + + private boolean isComposedProperty(String propertyName) { + return propertyName.contains("."); + } + + private String getMemberObjectProperty(String composedPropertyName) { + return composedPropertyName.substring(0, composedPropertyName.indexOf(".")); + } + + private boolean matchProperty(Object bean, String propertyName, Description mismatchDescription) + throws Exception { + Method readMethod = findReadMethod(bean, propertyName, mismatchDescription); + return (readMethod != null) + ? matchPropertyValue(bean, readMethod, mismatchDescription) + : false; + } + + private boolean matchPropertyValue(Object bean, Method readMethod, Description mismatchDescription) + throws Exception { + Object propertyValue = readMethod.invoke(bean, NO_ARGUMENTS); + boolean valueMatches = valueMatcher.matches(propertyValue); + if (!valueMatches) { + appendSeparatorTo(mismatchDescription); + mismatchDescription.appendText("property \'" + matchingPropertyName + "\' "); + valueMatcher.describeMismatch(propertyValue, mismatchDescription); + } + return valueMatches; + } + + private void appendSeparatorTo(Description description) { + if (description.toString().length() > 0) { + description.appendText(", "); + } + } + + private Method findReadMethod(Object argument, String propertyName, Description mismatchDescription) + throws IllegalArgumentException { + PropertyDescriptor propertyDescriptor = getPropertyDescriptor(propertyName, argument); + if (null == propertyDescriptor) { + mismatchDescription.appendText("No property \"" + matchingPropertyName + "\""); + return null; + } + Method readMethod = propertyDescriptor.getReadMethod(); + if (null == readMethod) { + mismatchDescription.appendText("property \"" + matchingPropertyName + "\" is not readable"); + } + return readMethod; + } + + public void describeTo(Description description) { + appendSeparatorTo(description); + description.appendText("property "); + description.appendValue(matchingPropertyName); + description.appendText(" = "); + description.appendDescriptionOf(valueMatcher); + description.appendText(" "); + } + +} diff --git a/hamcrest-unit-test/src/main/java/org/hamcrest/AbstractMatcherTest.java b/hamcrest-unit-test/src/main/java/org/hamcrest/AbstractMatcherTest.java index 0032d8212..b2fda6d0c 100644 --- a/hamcrest-unit-test/src/main/java/org/hamcrest/AbstractMatcherTest.java +++ b/hamcrest-unit-test/src/main/java/org/hamcrest/AbstractMatcherTest.java @@ -33,6 +33,12 @@ public static void assertMismatchDescription(String expected, Matcher void assertMismatchDescription(String expected, Matcher matcher, T arg, Description description) { + Assert.assertFalse("Precondtion: Matcher should not match item.", matcher.matches(arg)); + matcher.describeMismatch(arg, description); + Assert.assertEquals("Expected mismatch description", expected, description.toString().trim()); + } + public void testIsNullSafe() { // should not throw a NullPointerException createMatcher().matches(null); diff --git a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java new file mode 100644 index 000000000..fa12f5ac5 --- /dev/null +++ b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java @@ -0,0 +1,5 @@ +package org.hamcrest.beans; + +public class BeanMatcherTest { + +} diff --git a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyMatcherTest.java b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyMatcherTest.java new file mode 100644 index 000000000..c59ff1420 --- /dev/null +++ b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyMatcherTest.java @@ -0,0 +1,114 @@ +package org.hamcrest.beans; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.beans.BeanPropertyMatcher.property; +import static org.hamcrest.core.IsAnything.anything; +import static org.hamcrest.core.IsEqual.equalTo; + +import org.hamcrest.AbstractMatcherTest; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.StringDescription; +import org.hamcrest.beans.HasPropertyWithValueTest.BeanWithInfo; +import org.hamcrest.beans.HasPropertyWithValueTest.BeanWithoutInfo; +import org.hamcrest.core.IsEqual; + +public class BeanPropertyMatcherTest extends AbstractMatcherTest { + + private final BeanWithoutInfo shouldMatch = new BeanWithoutInfo("is expected"); + private final BeanWithoutInfo shouldNotMatch = new BeanWithoutInfo("not expected"); + + private final BeanWithInfo beanWithInfo = new BeanWithInfo("with info"); + private final ComposedBean composedBean = new ComposedBean("with info", beanWithInfo); + + @Override + protected Matcher createMatcher() { + return property("irrelevant", anything()); + } + + public void testMatchesInfolessBeanWithMatchedNamedProperty() { + assertMatches("with property", property("property", equalTo("is expected")), shouldMatch); + assertMismatchDescription("property 'property' was \"not expected\"", + property("property", equalTo("is expected")), shouldNotMatch); + } + + public void testMatchesBeanWithInfoWithMatchedNamedProperty() { + assertMatches("with bean info", property("property", equalTo("with info")), beanWithInfo); + assertMismatchDescription("property 'property' was \"with info\"", + property("property", equalTo("without info")), beanWithInfo); + } + + public void testDoesNotMatchInfolessBeanWithoutMatchedNamedProperty() { + assertMismatchDescription("No property \"nonExistentProperty\"", + property("nonExistentProperty", anything()), shouldNotMatch); + } + + public void testDoesNotMatchWriteOnlyProperty() { + assertMismatchDescription("property \"writeOnlyProperty\" is not readable", + property("writeOnlyProperty", anything()), shouldNotMatch); + } + + public void testDescribeTo() { + assertDescription("property \"property\" = ", property("property", equalTo(true))); + } + + public void testAccumulateMismatchDescriptions() { + Description mismatchDescription = new StringDescription(); + mismatchDescription.appendText("previous mismatch"); + assertMismatchDescription("previous mismatch, property 'property' was \"with info\"", + property("property", equalTo("without info")), beanWithInfo, mismatchDescription); + } + + public void testMatchesPropertyAndValue() { + assertMatches("property with value", property( "property", anything()), beanWithInfo); + } + + public void testMatchesPropertyAndValueForMemberObject() { + assertMatches("property with value", property("beanWithInfo.property", anything()), composedBean); + } + + public void testDoesNotWriteMismatchIfPropertyMatches() { + Description description = new StringDescription(); + property( "property", anything()).describeMismatch(beanWithInfo, description); + assertEquals("Expected mismatch description", "", description.toString()); + } + + public void testDescribesMissingPropertyMismatch() { + assertMismatchDescription("No property \"honk\"", property( "honk", anything()), shouldNotMatch); + } + + public void testCanAccessAnAnonymousInnerClass() { + class X implements IX { + @Override + public int getTest() { + return 1; + } + } + + assertThat(new X(), HasPropertyWithValue.hasProperty("test", IsEqual.equalTo(1))); + } + + interface IX { + int getTest(); + } + + public class ComposedBean { + + private String propertyValue; + private BeanWithInfo beanWithInfo; + + public ComposedBean(String propertyValue, BeanWithInfo beanWithInfo) { + this.propertyValue = propertyValue; + this.beanWithInfo = beanWithInfo; + } + + public String getProperty() { + return this.propertyValue; + } + + public BeanWithInfo getBeanWithInfo() { + return this.beanWithInfo; + } + } + +} From 28319f6cf920045f875feeb79932153e0037cff1 Mon Sep 17 00:00:00 2001 From: Sandro Mancuso Date: Tue, 22 May 2012 20:09:07 +0100 Subject: [PATCH 2/5] Tests for expected and mismatch descriptions --- .../java/org/hamcrest/beans/BeanMatcher.java | 1 - .../org/hamcrest/beans/BeanMatcherTest.java | 120 +++++++++++++++++- 2 files changed, 119 insertions(+), 2 deletions(-) diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java index 95d2c77b9..98b7415e8 100644 --- a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java @@ -47,7 +47,6 @@ public void describeMismatch(Object item, Description description) { private void appendDescriptions(Object item, Matcher matcher) { matcher.describeTo(expectedDescription); matcher.describeMismatch(item, mismatchDescription); - mismatchDescription.appendText(" "); } } diff --git a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java index fa12f5ac5..4fa51864d 100644 --- a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java +++ b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java @@ -1,5 +1,123 @@ package org.hamcrest.beans; -public class BeanMatcherTest { +import static org.hamcrest.Matchers.anything; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import junit.framework.TestCase; +import org.hamcrest.Description; +import org.hamcrest.StringDescription; + +public class BeanMatcherTest extends TestCase { + + private static final String MISMATCH_DESCRIPTION = "MISMATCH DESCRIPTION"; + private static final String OTHER_MISMATCH_DESCRIPTION = "OTHER MISMATCH DESCRIPTION"; + private static final String EXPECTED_DESCRIPTION = "EXPECTED DESCRIPTION"; + private static final String OTHER_EXPECTED_DESCRIPTION = "OTHER EXPECTED DESCRIPTION"; + private static final boolean MATCHES = true; + private static final boolean DOES_NOT_MATCH = false; + + private Object bean; + private BeanPropertyMatcher unmatchingProperty; + private BeanPropertyMatcher otherUnmatchingProperty; + private BeanPropertyMatcher matchingProperty; + + private Description expectedDescription; + private Description mismatchDescription; + + @Override + protected void setUp() { + bean = new Object(); + matchingProperty = new MockPropertyMatcher(MATCHES, EXPECTED_DESCRIPTION, MISMATCH_DESCRIPTION); + unmatchingProperty = new MockPropertyMatcher(DOES_NOT_MATCH, EXPECTED_DESCRIPTION, MISMATCH_DESCRIPTION); + otherUnmatchingProperty = new MockPropertyMatcher(DOES_NOT_MATCH, OTHER_EXPECTED_DESCRIPTION, OTHER_MISMATCH_DESCRIPTION); + expectedDescription = new StringDescription(); + mismatchDescription = new StringDescription(); + } + + public void testNoExpectedDescriptionWhenPropertyIsAMatch() { + BeanMatcher beanMatcher = BeanMatcher.has(matchingProperty); + + beanMatcher.matches(bean); + beanMatcher.describeTo(expectedDescription); + + assertThat(expectedDescription.toString(), isEmptyString()); + } + + public void testNoMismatchingDescriptionsWhenPropertyIsAMatch() { + BeanMatcher beanMatcher = BeanMatcher.has(matchingProperty); + + beanMatcher.matches(bean); + beanMatcher.describeMismatch(bean, mismatchDescription); + + assertThat(mismatchDescription.toString(), isEmptyString()); + } + + public void testPopulateExpectedDescriptionWhenPropertiesDoNotMatch() { + BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty); + + beanMatcher.matches(bean); + beanMatcher.describeTo(expectedDescription); + + assertThat(expectedDescription.toString(), is(EXPECTED_DESCRIPTION)); + } + + public void testPopulateMismatchDescriptionWhenPropertiesDoNotMatch() { + BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty); + + beanMatcher.matches(bean); + beanMatcher.describeMismatch(bean, mismatchDescription); + + assertThat(mismatchDescription.toString(), is(MISMATCH_DESCRIPTION)); + } + + public void testExpectedDescriptionIsAppendedWhenMultiplePropertiesFail() { + BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty, + matchingProperty, + otherUnmatchingProperty); + + beanMatcher.matches(bean); + beanMatcher.describeTo(expectedDescription); + + assertThat(expectedDescription.toString(), is(EXPECTED_DESCRIPTION + OTHER_EXPECTED_DESCRIPTION)); + } + + public void testMismatchDescriptionIsAppendedWhenMultiplePropertiesFail() { + BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty, + matchingProperty, + otherUnmatchingProperty); + + beanMatcher.matches(bean); + beanMatcher.describeMismatch(bean, expectedDescription); + + assertThat(expectedDescription.toString(), is(MISMATCH_DESCRIPTION + OTHER_MISMATCH_DESCRIPTION)); + } + + private class MockPropertyMatcher extends BeanPropertyMatcher { + + private boolean matches; + private String expectedDescription; + private String mismatchDescription; + + public MockPropertyMatcher(boolean matches, String expectedDescription, String mismatchDescription) { + super("any property", anything()); + this.matches = matches; + this.expectedDescription = expectedDescription; + this.mismatchDescription = mismatchDescription; + } + + @Override + public boolean matchesSafely(T bean, Description mismatchDescription) { + mismatchDescription.appendText(this.mismatchDescription); + return matches; + } + + @Override + public void describeTo(Description description) { + description.appendText(expectedDescription); + } + + } + } From b0f8063f9f99bd2fa32f366af417433853b406af Mon Sep 17 00:00:00 2001 From: Sandro Mancuso Date: Tue, 22 May 2012 20:24:30 +0100 Subject: [PATCH 3/5] Javadocs added --- .../java/org/hamcrest/beans/BeanMatcher.java | 37 +++++++++++++++++++ .../hamcrest/beans/BeanPropertyMatcher.java | 4 ++ 2 files changed, 41 insertions(+) diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java index 98b7415e8..9ec341528 100644 --- a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java @@ -7,6 +7,43 @@ import org.hamcrest.StringDescription; /** + *

Matches multiple attributes of an object within a single assertion

+ * + *

How to use it:

+ * + * // Static imports
+ * import static org.craftedsw.beanpropertymatcher.matcher.BeanMatcher.has;
+ * import static org.craftedsw.beanpropertymatcher.matcher.BeanPropertyMatcher.property;
+ * import static org.hamcrest.MatcherAssert.assertThat;
+ * import static org.hamcrest.Matchers.equalTo;
+ * import static org.hamcrest.Matchers.greaterThan;
+ *

+ * Person person = new Person();
+ * person.setFirstName("Sandro");
+ * person.setAge(35);
+ *

+ *

+ * Country uk = new Country();
+ * uk.setName("United Kingdom");
+ *

+ *

+ * Address address = new Address();
+ * address.setPostcode("1234556");
+ * address.setCity("London");
+ * address.setCountry(uk);
+ *

+ *

+ * person.setAddress(address);
+ *

+ *

+ * assertThat(person, has(
+ *                property("firstName", equalTo("Sandro")),
+ *                property("age", greaterThan(18)),
+ *                property("address.city", equalTo("London")),
+ *                property("address.postcode", equalTo("1234556")),
+ *                property("address.country.name", equalTo("United Kingdom"))));
+ *

+ * * @author Sandro Mancuso */ public class BeanMatcher extends BaseMatcher { diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java index 19ec549c0..307fcb524 100644 --- a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java @@ -12,6 +12,10 @@ import org.hamcrest.TypeSafeDiagnosingMatcher; /** + * Property matcher that should be used in conjunction with {@link BeanMatcher}. + * + * @see BeanMatcher + * * @author Sandro Mancuso */ public class BeanPropertyMatcher extends TypeSafeDiagnosingMatcher { From 1abed0f409d5ef698699f8312bbfb22441d710fc Mon Sep 17 00:00:00 2001 From: Sandro Mancuso Date: Tue, 22 May 2012 23:54:18 +0100 Subject: [PATCH 4/5] BeanMatcher and BeanPropertyMatcher renamed to BeanHas and BeanProperty --- .../beans/{BeanMatcher.java => BeanHas.java} | 12 ++--- ...PropertyMatcher.java => BeanProperty.java} | 12 ++--- ...{BeanMatcherTest.java => BeanHasTest.java} | 54 +++++++++---------- ...MatcherTest.java => BeanPropertyTest.java} | 4 +- 4 files changed, 41 insertions(+), 41 deletions(-) rename hamcrest-library/src/main/java/org/hamcrest/beans/{BeanMatcher.java => BeanHas.java} (88%) rename hamcrest-library/src/main/java/org/hamcrest/beans/{BeanPropertyMatcher.java => BeanProperty.java} (92%) rename hamcrest-unit-test/src/main/java/org/hamcrest/beans/{BeanMatcherTest.java => BeanHasTest.java} (61%) rename hamcrest-unit-test/src/main/java/org/hamcrest/beans/{BeanPropertyMatcherTest.java => BeanPropertyTest.java} (96%) diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanHas.java similarity index 88% rename from hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java rename to hamcrest-library/src/main/java/org/hamcrest/beans/BeanHas.java index 9ec341528..dc1e0029a 100644 --- a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanMatcher.java +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanHas.java @@ -46,24 +46,24 @@ * * @author Sandro Mancuso */ -public class BeanMatcher extends BaseMatcher { +public class BeanHas extends BaseMatcher { - private BeanPropertyMatcher[] propertyMatchers; + private BeanProperty[] propertyMatchers; private Description expectedDescription = new StringDescription(); private Description mismatchDescription = new StringDescription(); - public BeanMatcher(BeanPropertyMatcher... propertyMatchers) { + public BeanHas(BeanProperty... propertyMatchers) { this.propertyMatchers = propertyMatchers; } @Factory - public static BeanMatcher has(BeanPropertyMatcher... propertyMatchers) { - return new BeanMatcher(propertyMatchers); + public static BeanHas has(BeanProperty... propertyMatchers) { + return new BeanHas(propertyMatchers); } public boolean matches(Object item) { boolean matches = true; - for (BeanPropertyMatcher matcher : propertyMatchers) { + for (BeanProperty matcher : propertyMatchers) { if (!matcher.matches(item)) { matches = false; appendDescriptions(item, matcher); diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanProperty.java similarity index 92% rename from hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java rename to hamcrest-library/src/main/java/org/hamcrest/beans/BeanProperty.java index 307fcb524..c8d0a0ab7 100644 --- a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanPropertyMatcher.java +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanProperty.java @@ -12,25 +12,25 @@ import org.hamcrest.TypeSafeDiagnosingMatcher; /** - * Property matcher that should be used in conjunction with {@link BeanMatcher}. + * Property matcher that should be used in conjunction with {@link BeanHas}. * - * @see BeanMatcher + * @see BeanHas * * @author Sandro Mancuso */ -public class BeanPropertyMatcher extends TypeSafeDiagnosingMatcher { +public class BeanProperty extends TypeSafeDiagnosingMatcher { private String matchingPropertyName; private Matcher valueMatcher; - public BeanPropertyMatcher(String propertyName, Matcher valueMatcher) { + public BeanProperty(String propertyName, Matcher valueMatcher) { this.matchingPropertyName = propertyName; this.valueMatcher = valueMatcher; } @Factory - public static BeanPropertyMatcher property(String propertyName,Matcher value) { - return new BeanPropertyMatcher(propertyName, value); + public static BeanProperty property(String propertyName,Matcher value) { + return new BeanProperty(propertyName, value); } @Override diff --git a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanHasTest.java similarity index 61% rename from hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java rename to hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanHasTest.java index 4fa51864d..977f8e9ca 100644 --- a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanMatcherTest.java +++ b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanHasTest.java @@ -9,7 +9,7 @@ import org.hamcrest.Description; import org.hamcrest.StringDescription; -public class BeanMatcherTest extends TestCase { +public class BeanHasTest extends TestCase { private static final String MISMATCH_DESCRIPTION = "MISMATCH DESCRIPTION"; private static final String OTHER_MISMATCH_DESCRIPTION = "OTHER MISMATCH DESCRIPTION"; @@ -19,9 +19,9 @@ public class BeanMatcherTest extends TestCase { private static final boolean DOES_NOT_MATCH = false; private Object bean; - private BeanPropertyMatcher unmatchingProperty; - private BeanPropertyMatcher otherUnmatchingProperty; - private BeanPropertyMatcher matchingProperty; + private BeanProperty unmatchingProperty; + private BeanProperty otherUnmatchingProperty; + private BeanProperty matchingProperty; private Description expectedDescription; private Description mismatchDescription; @@ -29,78 +29,78 @@ public class BeanMatcherTest extends TestCase { @Override protected void setUp() { bean = new Object(); - matchingProperty = new MockPropertyMatcher(MATCHES, EXPECTED_DESCRIPTION, MISMATCH_DESCRIPTION); - unmatchingProperty = new MockPropertyMatcher(DOES_NOT_MATCH, EXPECTED_DESCRIPTION, MISMATCH_DESCRIPTION); - otherUnmatchingProperty = new MockPropertyMatcher(DOES_NOT_MATCH, OTHER_EXPECTED_DESCRIPTION, OTHER_MISMATCH_DESCRIPTION); + matchingProperty = new MockBeanProperty(MATCHES, EXPECTED_DESCRIPTION, MISMATCH_DESCRIPTION); + unmatchingProperty = new MockBeanProperty(DOES_NOT_MATCH, EXPECTED_DESCRIPTION, MISMATCH_DESCRIPTION); + otherUnmatchingProperty = new MockBeanProperty(DOES_NOT_MATCH, OTHER_EXPECTED_DESCRIPTION, OTHER_MISMATCH_DESCRIPTION); expectedDescription = new StringDescription(); mismatchDescription = new StringDescription(); } public void testNoExpectedDescriptionWhenPropertyIsAMatch() { - BeanMatcher beanMatcher = BeanMatcher.has(matchingProperty); + BeanHas beanHas = BeanHas.has(matchingProperty); - beanMatcher.matches(bean); - beanMatcher.describeTo(expectedDescription); + beanHas.matches(bean); + beanHas.describeTo(expectedDescription); assertThat(expectedDescription.toString(), isEmptyString()); } public void testNoMismatchingDescriptionsWhenPropertyIsAMatch() { - BeanMatcher beanMatcher = BeanMatcher.has(matchingProperty); + BeanHas beanHas = BeanHas.has(matchingProperty); - beanMatcher.matches(bean); - beanMatcher.describeMismatch(bean, mismatchDescription); + beanHas.matches(bean); + beanHas.describeMismatch(bean, mismatchDescription); assertThat(mismatchDescription.toString(), isEmptyString()); } public void testPopulateExpectedDescriptionWhenPropertiesDoNotMatch() { - BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty); + BeanHas beanHas = BeanHas.has(unmatchingProperty); - beanMatcher.matches(bean); - beanMatcher.describeTo(expectedDescription); + beanHas.matches(bean); + beanHas.describeTo(expectedDescription); assertThat(expectedDescription.toString(), is(EXPECTED_DESCRIPTION)); } public void testPopulateMismatchDescriptionWhenPropertiesDoNotMatch() { - BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty); + BeanHas beanHas = BeanHas.has(unmatchingProperty); - beanMatcher.matches(bean); - beanMatcher.describeMismatch(bean, mismatchDescription); + beanHas.matches(bean); + beanHas.describeMismatch(bean, mismatchDescription); assertThat(mismatchDescription.toString(), is(MISMATCH_DESCRIPTION)); } public void testExpectedDescriptionIsAppendedWhenMultiplePropertiesFail() { - BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty, + BeanHas beanHas = BeanHas.has(unmatchingProperty, matchingProperty, otherUnmatchingProperty); - beanMatcher.matches(bean); - beanMatcher.describeTo(expectedDescription); + beanHas.matches(bean); + beanHas.describeTo(expectedDescription); assertThat(expectedDescription.toString(), is(EXPECTED_DESCRIPTION + OTHER_EXPECTED_DESCRIPTION)); } public void testMismatchDescriptionIsAppendedWhenMultiplePropertiesFail() { - BeanMatcher beanMatcher = BeanMatcher.has(unmatchingProperty, + BeanHas beanHas = BeanHas.has(unmatchingProperty, matchingProperty, otherUnmatchingProperty); - beanMatcher.matches(bean); - beanMatcher.describeMismatch(bean, expectedDescription); + beanHas.matches(bean); + beanHas.describeMismatch(bean, expectedDescription); assertThat(expectedDescription.toString(), is(MISMATCH_DESCRIPTION + OTHER_MISMATCH_DESCRIPTION)); } - private class MockPropertyMatcher extends BeanPropertyMatcher { + private class MockBeanProperty extends BeanProperty { private boolean matches; private String expectedDescription; private String mismatchDescription; - public MockPropertyMatcher(boolean matches, String expectedDescription, String mismatchDescription) { + public MockBeanProperty(boolean matches, String expectedDescription, String mismatchDescription) { super("any property", anything()); this.matches = matches; this.expectedDescription = expectedDescription; diff --git a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyMatcherTest.java b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyTest.java similarity index 96% rename from hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyMatcherTest.java rename to hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyTest.java index c59ff1420..37d4a4de8 100644 --- a/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyMatcherTest.java +++ b/hamcrest-unit-test/src/main/java/org/hamcrest/beans/BeanPropertyTest.java @@ -1,7 +1,7 @@ package org.hamcrest.beans; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.beans.BeanPropertyMatcher.property; +import static org.hamcrest.beans.BeanProperty.property; import static org.hamcrest.core.IsAnything.anything; import static org.hamcrest.core.IsEqual.equalTo; @@ -13,7 +13,7 @@ import org.hamcrest.beans.HasPropertyWithValueTest.BeanWithoutInfo; import org.hamcrest.core.IsEqual; -public class BeanPropertyMatcherTest extends AbstractMatcherTest { +public class BeanPropertyTest extends AbstractMatcherTest { private final BeanWithoutInfo shouldMatch = new BeanWithoutInfo("is expected"); private final BeanWithoutInfo shouldNotMatch = new BeanWithoutInfo("not expected"); From f7fcdefe6ba72d2716249b7628546960eb63acfd Mon Sep 17 00:00:00 2001 From: Sandro Mancuso Date: Tue, 22 May 2012 23:56:43 +0100 Subject: [PATCH 5/5] JavaDocs changed to reflect new name of the class --- .../src/main/java/org/hamcrest/beans/BeanHas.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanHas.java b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanHas.java index dc1e0029a..6196ecfbb 100644 --- a/hamcrest-library/src/main/java/org/hamcrest/beans/BeanHas.java +++ b/hamcrest-library/src/main/java/org/hamcrest/beans/BeanHas.java @@ -12,8 +12,8 @@ *

How to use it:

* * // Static imports
- * import static org.craftedsw.beanpropertymatcher.matcher.BeanMatcher.has;
- * import static org.craftedsw.beanpropertymatcher.matcher.BeanPropertyMatcher.property;
+ * import static org.hamcrest.beans.BeanHas.has;
+ * import static org.hamcrest.beans.BeanProperty.property;
* import static org.hamcrest.MatcherAssert.assertThat;
* import static org.hamcrest.Matchers.equalTo;
* import static org.hamcrest.Matchers.greaterThan;