7f0bec7
diff -Nru jmock-2.5.1/src/org/jmock/Expectations.java jmock-2.5.1-gil/src/org/jmock/Expectations.java
7f0bec7
--- jmock-2.5.1/src/org/jmock/Expectations.java	2008-07-03 13:52:29.000000000 +0200
7f0bec7
+++ jmock-2.5.1-gil/src/org/jmock/Expectations.java	2012-11-02 13:58:47.805563931 +0100
7f0bec7
@@ -184,39 +184,48 @@
7f0bec7
     }
7f0bec7
     
7f0bec7
     public boolean with(boolean value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return false;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public byte with(byte value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return 0;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public short with(short value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return 0;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public char with(char value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return 0;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public int with(int value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return 0;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public long with(long value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return 0;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public float with(float value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return 0;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public double with(double value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return 0;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public <T> T with(T value) {
7f0bec7
-        return with(equalTo(value));
7f0bec7
+        addParameterMatcher(equal(value));
7f0bec7
+        return value;
7f0bec7
     }
7f0bec7
     
7f0bec7
     public void will(Action action) {
7f0bec7
diff -Nru jmock-2.5.1/src/org/jmock/internal/InvocationExpectationBuilder.java jmock-2.5.1-gil/src/org/jmock/internal/InvocationExpectationBuilder.java
7f0bec7
--- jmock-2.5.1/src/org/jmock/internal/InvocationExpectationBuilder.java	2008-06-23 10:56:29.000000000 +0200
7f0bec7
+++ jmock-2.5.1-gil/src/org/jmock/internal/InvocationExpectationBuilder.java	2012-11-02 13:58:47.808563779 +0100
7f0bec7
@@ -10,10 +10,9 @@
7f0bec7
 import org.jmock.api.Action;
7f0bec7
 import org.jmock.api.Expectation;
7f0bec7
 import org.jmock.api.Invocation;
7f0bec7
-import org.jmock.internal.matcher.MethodMatcher;
7f0bec7
 import org.jmock.internal.matcher.MethodNameMatcher;
7f0bec7
 import org.jmock.internal.matcher.MockObjectMatcher;
7f0bec7
-import org.jmock.internal.matcher.ParametersMatcher;
7f0bec7
+import org.jmock.internal.matcher.AllParametersMatcher;
7f0bec7
 import org.jmock.syntax.MethodClause;
7f0bec7
 import org.jmock.syntax.ParametersClause;
7f0bec7
 import org.jmock.syntax.ReceiverClause;
7f0bec7
@@ -83,14 +82,14 @@
7f0bec7
     }
7f0bec7
     
7f0bec7
     public void createExpectationFrom(Invocation invocation) {
7f0bec7
-        expectation.setMethodMatcher(new MethodMatcher(invocation.getInvokedMethod()));
7f0bec7
+        expectation.setMethod(invocation.getInvokedMethod());
7f0bec7
         
7f0bec7
         if (capturedParameterMatchers.isEmpty()) {
7f0bec7
-            expectation.setParametersMatcher(new ParametersMatcher(invocation.getParametersAsArray()));
7f0bec7
+            expectation.setParametersMatcher(new AllParametersMatcher(invocation.getParametersAsArray()));
7f0bec7
         }
7f0bec7
         else {
7f0bec7
             checkParameterMatcherCount(invocation);
7f0bec7
-            expectation.setParametersMatcher(new ParametersMatcher(capturedParameterMatchers));
7f0bec7
+            expectation.setParametersMatcher(new AllParametersMatcher(capturedParameterMatchers));
7f0bec7
         }
7f0bec7
     }
7f0bec7
     
7f0bec7
@@ -130,7 +129,7 @@
7f0bec7
     }
7f0bec7
     
7f0bec7
     public void with(Matcher... parameterMatchers) {
7f0bec7
-        expectation.setParametersMatcher(new ParametersMatcher(Arrays.asList(parameterMatchers)));
7f0bec7
+        expectation.setParametersMatcher(new AllParametersMatcher(Arrays.asList(parameterMatchers)));
7f0bec7
     }
7f0bec7
     
7f0bec7
     public void withNoArguments() {
7f0bec7
diff -Nru jmock-2.5.1/src/org/jmock/internal/InvocationExpectation.java jmock-2.5.1-gil/src/org/jmock/internal/InvocationExpectation.java
7f0bec7
--- jmock-2.5.1/src/org/jmock/internal/InvocationExpectation.java	2007-12-28 00:26:14.000000000 +0100
7f0bec7
+++ jmock-2.5.1-gil/src/org/jmock/internal/InvocationExpectation.java	2012-11-02 13:58:47.807563829 +0100
7f0bec7
@@ -10,6 +10,7 @@
7f0bec7
 import org.jmock.api.Action;
7f0bec7
 import org.jmock.api.Expectation;
7f0bec7
 import org.jmock.api.Invocation;
7f0bec7
+import org.jmock.internal.matcher.MethodMatcher;
7f0bec7
 import org.jmock.lib.action.VoidAction;
7f0bec7
 
7f0bec7
 /** 
7f0bec7
@@ -19,10 +20,11 @@
7f0bec7
  * @author smgf
7f0bec7
  */
7f0bec7
 public class InvocationExpectation implements Expectation {
7f0bec7
+    private static ParametersMatcher ANY_PARAMETERS = new AnyParametersMatcher();
7f0bec7
     private Cardinality cardinality = Cardinality.ALLOWING;
7f0bec7
 	private Matcher objectMatcher = IsAnything.anything();
7f0bec7
-	private Matcher<Method> methodMatcher = IsAnything.anything("<any method>");
7f0bec7
-	private Matcher<Object[]> parametersMatcher = IsAnything.anything("(<any parameters>)");
7f0bec7
+	private Matcher methodMatcher = IsAnything.anything("<any method>");
7f0bec7
+	private ParametersMatcher parametersMatcher = ANY_PARAMETERS;
7f0bec7
     private Action action = new VoidAction();
7f0bec7
     private List<OrderingConstraint> orderingConstraints = new ArrayList<OrderingConstraint>();
7f0bec7
     private List<SideEffect> sideEffects = new ArrayList<SideEffect>();
7f0bec7
@@ -36,12 +38,16 @@
7f0bec7
 	public void setObjectMatcher(Matcher objectMatcher) {
7f0bec7
 		this.objectMatcher = objectMatcher;
7f0bec7
 	}
7f0bec7
+
7f0bec7
+	public void setMethod(Method method) {
7f0bec7
+	    this.methodMatcher = new MethodMatcher(method);
7f0bec7
+	}
7f0bec7
 	
7f0bec7
-	public void setMethodMatcher(Matcher<Method> methodMatcher) {
7f0bec7
-		this.methodMatcher = methodMatcher;
7f0bec7
+	public void setMethodMatcher(Matcher matcher) {
7f0bec7
+		this.methodMatcher = matcher;
7f0bec7
 	}
7f0bec7
 	
7f0bec7
-	public void setParametersMatcher(Matcher<Object[]> parametersMatcher) {
7f0bec7
+	public void setParametersMatcher(ParametersMatcher parametersMatcher) {
7f0bec7
 		this.parametersMatcher = parametersMatcher;
7f0bec7
 	}
7f0bec7
 
7f0bec7
@@ -121,4 +127,14 @@
7f0bec7
             sideEffect.perform();
7f0bec7
         }
7f0bec7
     }
7f0bec7
+
7f0bec7
+    private static class AnyParametersMatcher extends IsAnything<Object[]> implements ParametersMatcher {
7f0bec7
+        public AnyParametersMatcher() {
7f0bec7
+            super("(<any parameters>)");
7f0bec7
+        }
7f0bec7
+
7f0bec7
+        public boolean isCompatibleWith(Object[] parameters) {
7f0bec7
+            return true;
7f0bec7
+        }
7f0bec7
+    };
7f0bec7
 }
7f0bec7
diff -Nru jmock-2.5.1/src/org/jmock/internal/matcher/AllParametersMatcher.java jmock-2.5.1-gil/src/org/jmock/internal/matcher/AllParametersMatcher.java
7f0bec7
--- jmock-2.5.1/src/org/jmock/internal/matcher/AllParametersMatcher.java	1970-01-01 01:00:00.000000000 +0100
7f0bec7
+++ jmock-2.5.1-gil/src/org/jmock/internal/matcher/AllParametersMatcher.java	2012-11-02 13:58:47.809563730 +0100
7f0bec7
@@ -0,0 +1,80 @@
7f0bec7
+package org.jmock.internal.matcher;
7f0bec7
+
7f0bec7
+import static java.util.Arrays.asList;
7f0bec7
+
7f0bec7
+import java.util.List;
7f0bec7
+
7f0bec7
+import org.hamcrest.Description;
7f0bec7
+import org.hamcrest.Matcher;
7f0bec7
+import org.hamcrest.TypeSafeDiagnosingMatcher;
7f0bec7
+import org.hamcrest.core.IsEqual;
7f0bec7
+import org.jmock.internal.ParametersMatcher;
7f0bec7
+
7f0bec7
+public class AllParametersMatcher extends TypeSafeDiagnosingMatcher<Object[]>  implements ParametersMatcher {
7f0bec7
+    private final Matcher<Object>[] elementMatchers;
7f0bec7
+
7f0bec7
+    public AllParametersMatcher(Object[] expectedValues) {
7f0bec7
+        this.elementMatchers =  equalMatchersFor(expectedValues);
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    @SuppressWarnings("unchecked")
7f0bec7
+    public AllParametersMatcher(List<Matcher<?>> parameterMatchers) {
7f0bec7
+        this.elementMatchers = parameterMatchers.toArray(new Matcher[0]);
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    public boolean isCompatibleWith(Object[] parameters) {
7f0bec7
+        return elementMatchers.length == parameters.length;
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    @Override
7f0bec7
+    public boolean matchesSafely(Object[] parameters, Description mismatch) {
7f0bec7
+        return matchesNumberOfParameters(parameters, mismatch)
7f0bec7
+            && matchesParameters(parameters, mismatch);
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    private boolean matchesNumberOfParameters(Object[] parameters, Description mismatch) {
7f0bec7
+        if (elementMatchers.length != parameters.length) {
7f0bec7
+            mismatch.appendText("wrong number of parameters: ")
7f0bec7
+                    .appendValue(parameters);
7f0bec7
+            return false;
7f0bec7
+        }
7f0bec7
+        return true;
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    private boolean matchesParameters(Object[] parameters, Description mismatch) {
7f0bec7
+        boolean result = true;
7f0bec7
+        for (int i = 0; i < parameters.length; i++) {
7f0bec7
+            result &= matchesParameter(parameters[i], elementMatchers[i], mismatch, i);
7f0bec7
+        }
7f0bec7
+        return result;
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    private boolean matchesParameter(final Object value, final Matcher<Object> matcher, Description mismatch, int index) {
7f0bec7
+        mismatch.appendText("\n      parameter " + index + " ");
7f0bec7
+        final boolean parameterMatches = matcher.matches(value);
7f0bec7
+        if (parameterMatches) {
7f0bec7
+            mismatch.appendText("matched: ").appendDescriptionOf(matcher);
7f0bec7
+        } else {
7f0bec7
+            mismatch.appendText("did not match: ")
7f0bec7
+                .appendDescriptionOf(matcher)
7f0bec7
+                .appendText(", because ");
7f0bec7
+            matcher.describeMismatch(value, mismatch);
7f0bec7
+        }
7f0bec7
+        return parameterMatches;
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    public void describeTo(Description description) {
7f0bec7
+        description.appendList("(", ", ",")", asList(elementMatchers));
7f0bec7
+    }
7f0bec7
+
7f0bec7
+    @SuppressWarnings("unchecked")
7f0bec7
+    private static Matcher<Object>[] equalMatchersFor(Object[] expectedValues) {
7f0bec7
+        Matcher<Object>[] matchers = new Matcher[expectedValues.length];
7f0bec7
+        for (int i = 0; i < expectedValues.length; i++) {
7f0bec7
+            matchers[i] = new IsEqual<Object>(expectedValues[i]);
7f0bec7
+        }
7f0bec7
+        return matchers;
7f0bec7
+    }
7f0bec7
+
7f0bec7
+}
7f0bec7
+
7f0bec7
diff -Nru jmock-2.5.1/src/org/jmock/internal/ParametersMatcher.java jmock-2.5.1-gil/src/org/jmock/internal/ParametersMatcher.java
7f0bec7
--- jmock-2.5.1/src/org/jmock/internal/ParametersMatcher.java	1970-01-01 01:00:00.000000000 +0100
7f0bec7
+++ jmock-2.5.1-gil/src/org/jmock/internal/ParametersMatcher.java	2012-11-02 13:58:47.809563730 +0100
7f0bec7
@@ -0,0 +1,12 @@
7f0bec7
+package org.jmock.internal;
7f0bec7
+
7f0bec7
+import org.hamcrest.Matcher;
7f0bec7
+
7f0bec7
+public interface ParametersMatcher extends Matcher<Object[]> {
7f0bec7
+    /**
7f0bec7
+     * Is this matcher likely to be relevant to the given parameters?
7f0bec7
+     * @param parameters The parameters to be matched
7f0bec7
+     * @return true iff the parameters may be relevant.
7f0bec7
+     */
7f0bec7
+    boolean isCompatibleWith(Object[] parameters);
7f0bec7
+}
7f0bec7
diff -Nru jmock-2.5.1/test/org/jmock/test/acceptance/HamcrestTypeSafetyAcceptanceTests.java jmock-2.5.1-gil/test/org/jmock/test/acceptance/HamcrestTypeSafetyAcceptanceTests.java
7f0bec7
--- jmock-2.5.1/test/org/jmock/test/acceptance/HamcrestTypeSafetyAcceptanceTests.java	2007-02-06 17:20:50.000000000 +0100
7f0bec7
+++ jmock-2.5.1-gil/test/org/jmock/test/acceptance/HamcrestTypeSafetyAcceptanceTests.java	2012-11-02 13:58:47.809563730 +0100
7f0bec7
@@ -1,7 +1,7 @@
7f0bec7
 package org.jmock.test.acceptance;
7f0bec7
 
7f0bec7
-import static org.hamcrest.number.OrderingComparisons.greaterThan;
7f0bec7
-import static org.hamcrest.text.StringStartsWith.startsWith;
7f0bec7
+import static org.hamcrest.CoreMatchers.startsWith;
7f0bec7
+import static org.hamcrest.number.OrderingComparison.greaterThan;
7f0bec7
 
7f0bec7
 import java.lang.reflect.Method;
7f0bec7
 
7f0bec7
diff -Nru jmock-2.5.1/test/org/jmock/test/unit/internal/InvocationExpectationTests.java jmock-2.5.1-gil/test/org/jmock/test/unit/internal/InvocationExpectationTests.java
7f0bec7
--- jmock-2.5.1/test/org/jmock/test/unit/internal/InvocationExpectationTests.java	2007-06-23 10:48:36.000000000 +0200
7f0bec7
+++ jmock-2.5.1-gil/test/org/jmock/test/unit/internal/InvocationExpectationTests.java	2012-11-02 13:58:47.811563631 +0100
7f0bec7
@@ -16,6 +16,7 @@
7f0bec7
 import org.jmock.internal.InvocationExpectation;
7f0bec7
 import org.jmock.internal.OrderingConstraint;
7f0bec7
 import org.jmock.internal.SideEffect;
7f0bec7
+import org.jmock.internal.matcher.AllParametersMatcher;
7f0bec7
 import org.jmock.lib.action.ReturnValueAction;
7f0bec7
 import org.jmock.test.unit.support.AssertThat;
7f0bec7
 import org.jmock.test.unit.support.MethodFactory;
7f0bec7
@@ -72,7 +73,7 @@
7f0bec7
 		Object[] differentArgCount = {1,2,3};
7f0bec7
 		Object[] noArgs = null;
7f0bec7
 		
7f0bec7
-		expectation.setParametersMatcher(equalTo(args));
7f0bec7
+		expectation.setParametersMatcher(new AllParametersMatcher(args));
7f0bec7
 		
7f0bec7
 		assertTrue("should match", expectation.matches(new Invocation(targetObject, method, args)));
7f0bec7
 		assertTrue("should not match", !expectation.matches(new Invocation(targetObject, method, differentArgs)));