1 package org.hamcrest.comparator; 2 3 import org.hamcrest.AbstractMatcherTest; 4 import org.hamcrest.Matcher; 5 6 import java.math.BigDecimal; 7 import java.util.Comparator; 8 9 import static org.hamcrest.MatcherAssert.assertThat; 10 import static org.hamcrest.comparator.ComparatorMatcherBuilder.comparedBy; 11 import static org.hamcrest.core.IsNot.not; 12 13 public class ComparatorMatcherBuilderTest extends AbstractMatcherTest { 14 15 private final ComparatorMatcherBuilder<Integer> integerComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering(); 16 private final ComparatorMatcherBuilder<Double> doubleComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering(); 17 private final ComparatorMatcherBuilder<String> stringComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering(); 18 private final ComparatorMatcherBuilder<BigDecimal> bigDecimalComparatorMatcherBuilder = ComparatorMatcherBuilder.usingNaturalOrdering(); 19 private final Comparator<Integer> backwardsIntegerComparator = new Comparator<Integer>() { 20 @Override 21 public int compare(Integer o1, Integer o2) { 22 return -o1.compareTo(o2); 23 } 24 25 @Override 26 public String toString() { 27 return "backwards integer comparator"; 28 } 29 }; 30 31 @Override 32 protected Matcher<Integer> createMatcher() { 33 return integerComparatorMatcherBuilder.greaterThan(1); 34 } 35 36 public void testDescription() { 37 assertDescription("a value greater than <1>", integerComparatorMatcherBuilder.greaterThan(1)); 38 assertDescription("a value equal to or greater than <1>", integerComparatorMatcherBuilder.greaterThanOrEqualTo(1)); 39 assertDescription("a value equal to <1>", integerComparatorMatcherBuilder.comparesEqualTo(1)); 40 assertDescription("a value less than or equal to <1>", integerComparatorMatcherBuilder.lessThanOrEqualTo(1)); 41 assertDescription("a value less than <1>", integerComparatorMatcherBuilder.lessThan(1)); 42 43 assertDescription("a value greater than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThan(1)); 44 assertDescription("a value equal to or greater than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThanOrEqualTo(1)); 45 assertDescription("a value equal to <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).comparesEqualTo(1)); 46 assertDescription("a value less than or equal to <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThanOrEqualTo(1)); 47 assertDescription("a value less than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThan(1)); 48 } 49 50 public void testMismatchDescriptions() { 51 assertMismatchDescription("<0> was less than <1>", integerComparatorMatcherBuilder.greaterThan(1), 0); 52 assertMismatchDescription("<1> was equal to <1>", integerComparatorMatcherBuilder.greaterThan(1), 1); 53 assertMismatchDescription("<1> was greater than <0>", integerComparatorMatcherBuilder.lessThan(0), 1); 54 assertMismatchDescription("<2> was equal to <2>", integerComparatorMatcherBuilder.lessThan(2), 2); 55 56 assertMismatchDescription("<1> was less than <0> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThan(0), 1); 57 assertMismatchDescription("<1> was equal to <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).greaterThan(1), 1); 58 assertMismatchDescription("<0> was greater than <1> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThan(1), 0); 59 assertMismatchDescription("<2> was equal to <2> when compared by <backwards integer comparator>", comparedBy(backwardsIntegerComparator).lessThan(2), 2); 60 } 61 62 public void testComparesObjectsForGreaterThan() { 63 assertThat(2, integerComparatorMatcherBuilder.greaterThan(1)); 64 assertThat(0, not(integerComparatorMatcherBuilder.greaterThan(1))); 65 } 66 67 public void testComparesObjectsForLessThan() { 68 assertThat(2, integerComparatorMatcherBuilder.lessThan(3)); 69 assertThat(0, integerComparatorMatcherBuilder.lessThan(1)); 70 } 71 72 73 public void testComparesObjectsForEquality() { 74 assertThat(3, integerComparatorMatcherBuilder.comparesEqualTo(3)); 75 assertThat("aa", stringComparatorMatcherBuilder.comparesEqualTo("aa")); 76 } 77 78 public void testAllowsForInclusiveComparisons() { 79 assertThat("less", 1, integerComparatorMatcherBuilder.lessThanOrEqualTo(1)); 80 assertThat("greater", 1, integerComparatorMatcherBuilder.greaterThanOrEqualTo(1)); 81 } 82 83 public void testSupportsDifferentTypesOfComparableObjects() { 84 assertThat(1.1, doubleComparatorMatcherBuilder.greaterThan(1.0)); 85 assertThat("cc", stringComparatorMatcherBuilder.greaterThan("bb")); 86 } 87 88 public void testComparesBigDecimalsWithDifferentScalesCorrectlyForIssue20() { 89 assertThat(new BigDecimal("10.0"), bigDecimalComparatorMatcherBuilder.greaterThanOrEqualTo(new BigDecimal("10"))); 90 assertThat(new BigDecimal(10), bigDecimalComparatorMatcherBuilder.greaterThanOrEqualTo(new BigDecimal("10.0"))); 91 assertThat(new BigDecimal("2"), bigDecimalComparatorMatcherBuilder.comparesEqualTo(new BigDecimal("2.000"))); 92 } 93 94 public void testComparesCustomTypesWhoseCompareToReturnsValuesGreaterThatOne() { 95 assertThat(new CustomInt(5), ComparatorMatcherBuilder.<CustomInt>usingNaturalOrdering().lessThan(new CustomInt(10))); 96 } 97 98 public void testComparesByCustomComparator() { 99 assertThat(5, comparedBy(backwardsIntegerComparator).lessThan(4)); 100 } 101 102 public void testJavadocExamples() { 103 assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().comparesEqualTo(1)); 104 assertThat(2, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().greaterThan(1)); 105 assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().greaterThanOrEqualTo(1)); 106 assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().lessThan(2)); 107 assertThat(1, ComparatorMatcherBuilder.<Integer>usingNaturalOrdering().lessThanOrEqualTo(1)); 108 assertThat(5, comparedBy(new Comparator<Integer>() { 109 @Override 110 public int compare(Integer o1, Integer o2) { 111 return -o1.compareTo(o2); 112 } 113 }).lessThan(4)); 114 } 115 116 private static final class CustomInt implements Comparable<CustomInt> { 117 private final int value; 118 119 public CustomInt(int value) { 120 this.value = value; 121 } 122 123 @Override 124 public int compareTo(CustomInt other) { 125 return value - other.value; 126 } 127 } 128 } 129