Skip to content

Commit aadc4d4

Browse files
author
npryce
committed
DescribedAs matcher can append values to its description
Simplified IsComparableTo implementation, renamed to IsGreaterThan and pulled out factory methods into OrderingComparisons class
1 parent d852892 commit aadc4d4

6 files changed

Lines changed: 99 additions & 77 deletions

File tree

src/library/org/hamcrest/core/DescribedAs.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
*/
33
package org.hamcrest.core;
44

5+
import java.util.regex.Pattern;
6+
57
import org.hamcrest.Description;
68
import org.hamcrest.Matcher;
79
import org.hamcrest.Factory;
@@ -10,25 +12,40 @@
1012
* Provides a custom description to another matcher.
1113
*/
1214
public class DescribedAs<T> implements Matcher<T> {
13-
14-
private final String description;
15+
private final String descriptionTemplate;
1516
private final Matcher<T> matcher;
16-
17-
public DescribedAs(String description, Matcher<T> matcher) {
18-
this.description = description;
17+
private final Object[] values;
18+
19+
private final static Pattern ARG_PATTERN = Pattern.compile("%([0-9]+)");
20+
21+
public DescribedAs(String descriptionTemplate, Matcher<T> matcher, Object[] values) {
22+
this.descriptionTemplate = descriptionTemplate;
1923
this.matcher = matcher;
24+
this.values = values.clone();
2025
}
21-
26+
2227
public boolean match(T o) {
2328
return matcher.match(o);
2429
}
2530

2631
public void describeTo(Description description) {
27-
description.appendText(this.description);
32+
java.util.regex.Matcher arg = ARG_PATTERN.matcher(descriptionTemplate);
33+
34+
int textStart = 0;
35+
while (arg.find()) {
36+
description.appendText(descriptionTemplate.substring(textStart, arg.start()));
37+
int argIndex = Integer.parseInt(arg.group(1));
38+
description.appendValue(values[argIndex]);
39+
textStart = arg.end();
40+
}
41+
42+
if (textStart < descriptionTemplate.length()) {
43+
description.appendText(descriptionTemplate.substring(textStart));
44+
}
2845
}
29-
46+
3047
@Factory
31-
public static <T> Matcher<T> describedAs(String description, Matcher<T> matcher) {
32-
return new DescribedAs<T>(description, matcher);
48+
public static <T> Matcher<T> describedAs(String description, Matcher<T> matcher, Object... values) {
49+
return new DescribedAs<T>(description, matcher, values);
3350
}
3451
}

src/library/org/hamcrest/number/IsComparableTo.java

Lines changed: 0 additions & 63 deletions
This file was deleted.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* Copyright (c) 2000-2006 hamcrest.org
2+
*/
3+
package org.hamcrest.number;
4+
5+
import org.hamcrest.Description;
6+
import org.hamcrest.Matcher;
7+
8+
/**
9+
* Is the value less than or greater than another {@link java.lang.Comparable} value?
10+
*/
11+
public class IsGreaterThan<T extends Comparable<T>> implements Matcher<T> {
12+
private final Comparable<T> compareTo;
13+
14+
public IsGreaterThan(Comparable<T> compareTo) {
15+
this.compareTo = compareTo;
16+
}
17+
18+
public boolean match(T item) {
19+
return compareTo.compareTo(item) < 0;
20+
}
21+
22+
public void describeTo(Description description) {
23+
description.appendText("a value greater than ");
24+
description.appendValue(compareTo);
25+
}
26+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.hamcrest.number;
2+
3+
import static org.hamcrest.core.IsEqual.eq;
4+
import static org.hamcrest.core.IsNot.not;
5+
import static org.hamcrest.core.Or.or;
6+
import static org.hamcrest.core.DescribedAs.describedAs;
7+
8+
import org.hamcrest.Factory;
9+
import org.hamcrest.Matcher;
10+
11+
public class OrderingComparisons {
12+
@Factory
13+
public static <T extends Comparable<T>> Matcher<T> greaterThan(T value) {
14+
return new IsGreaterThan<T>(value);
15+
}
16+
17+
@Factory
18+
public static <T extends Comparable<T>> Matcher<T> greaterThanOrEqualTo(T value) {
19+
return describedAs("a value greater than or equal to %0",
20+
or(greaterThan(value), eq(value)),
21+
value);
22+
}
23+
24+
@Factory
25+
public static <T extends Comparable<T>> Matcher<T> lessThan(T value) {
26+
return describedAs("a value less than %0",
27+
not(greaterThanOrEqualTo(value)),
28+
value);
29+
}
30+
31+
@Factory
32+
public static <T extends Comparable<T>> Matcher<T> lessThanOrEqualTo(T value) {
33+
return describedAs("a value less than or equal to %0",
34+
not(greaterThan(value)),
35+
value);
36+
}
37+
}

src/unit-test/org/hamcrest/core/DescribedAsTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import org.hamcrest.Matcher;
1010

1111
public class DescribedAsTest extends AbstractMatcherTest {
12-
1312
public void testOverridesDescriptionOfOtherMatcherWithThatPassedToConstructor() {
1413
Matcher m1 = describedAs("m1 description", alwaysPasses());
1514
Matcher m2 = describedAs("m2 description", alwaysFails());
@@ -18,12 +17,18 @@ public void testOverridesDescriptionOfOtherMatcherWithThatPassedToConstructor()
1817
assertDescription("m2 description", m2);
1918
}
2019

20+
public void testAppendsValuesToDescription() {
21+
Matcher m = describedAs("value 1 = %0, value 2 = %1",
22+
alwaysPasses(), 33, 97);
23+
24+
assertDescription("value 1 = <33>, value 2 = <97>", m);
25+
}
26+
2127
public void testDelegatesMatchingToAnotherMatcher() {
2228
Matcher<Object> m1 = describedAs("irrelevant", alwaysPasses());
2329
Matcher<Object> m2 = describedAs("irrelevant", alwaysFails());
2430

2531
assertTrue(m1.match(new Object()));
2632
assertFalse(m2.match("hi"));
2733
}
28-
2934
}

src/unit-test/org/hamcrest/number/IsComparableToTest.java renamed to src/unit-test/org/hamcrest/number/OrderingComparisonsTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
import org.hamcrest.AbstractMatcherTest;
66
import static org.hamcrest.MatcherAssert.assertThat;
77
import static org.hamcrest.core.IsNot.not;
8-
import static org.hamcrest.number.IsComparableTo.*;
8+
import static org.hamcrest.number.OrderingComparisons.*;
99

10-
public class IsComparableToTest extends AbstractMatcherTest {
10+
public class OrderingComparisonsTest extends AbstractMatcherTest {
1111

1212
public void testComparesObjectsForGreaterThan() {
1313
assertThat(2, greaterThan(1));

0 commit comments

Comments
 (0)