Update of /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic In directory sc8-pr-cvs1:/tmp/cvs-serv15934/core/com/mockobjects/dynamic Modified Files: Tag: DynamicMockExperiment CallFactory.java DefaultCallFactory.java CallCollection.java C.java Mock.java CallMatch.java ExpectedCall.java DynamicUtil.java Added Files: Tag: DynamicMockExperiment FullConstraintMatcher.java ConstraintMatcher.java AnyConstraintMatcher.java Log Message: - Changed Constraint[] usage to ConstraintMatcher to support Any constraint matching - Support for matching Object[] parameters --- NEW FILE: FullConstraintMatcher.java --- /* * Created on 20-Apr-03 */ package com.mockobjects.dynamic; import com.mockobjects.constraint.Constraint; public class FullConstraintMatcher implements ConstraintMatcher { private Constraint[] constraints; public FullConstraintMatcher(Constraint[] constraints) { this.constraints = constraints; } public FullConstraintMatcher(Constraint c1) { this(new Constraint[] {c1}); } public FullConstraintMatcher(Constraint c1, Constraint c2) { this(new Constraint[] {c1, c2}); } public FullConstraintMatcher(Constraint c1, Constraint c2, Constraint c3) { this(new Constraint[] {c1, c2, c3}); } public boolean matches(Object[] args) { if( args.length != constraints.length ) return false; for (int i = 0; i < args.length; i++) { if( !constraints[i].eval(args[i]) ) return false; } return true; } public Object[] getConstraints() { return constraints; } } --- NEW FILE: ConstraintMatcher.java --- /* * Created on 20-Apr-03 */ package com.mockobjects.dynamic; public interface ConstraintMatcher { boolean matches(Object[] args); Object[] getConstraints(); } --- NEW FILE: AnyConstraintMatcher.java --- /* * Created on 20-Apr-03 */ package com.mockobjects.dynamic; public class AnyConstraintMatcher implements ConstraintMatcher { public boolean matches(Object[] args) { return true; } public Object[] getConstraints() { return new String[] {"ANY"}; } } Index: CallFactory.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Attic/CallFactory.java,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -r1.1.2.3 -r1.1.2.4 --- CallFactory.java 11 Apr 2003 15:38:18 -0000 1.1.2.3 +++ CallFactory.java 5 May 2003 22:44:32 -0000 1.1.2.4 @@ -3,7 +3,6 @@ */ package com.mockobjects.dynamic; -import com.mockobjects.constraint.*; /** * @author dev @@ -13,5 +12,5 @@ Callable createThrowStub( Throwable throwable ); Callable createVoidStub(); Callable createExpectedCall( Callable call ); - Callable createCallMatch( String methodName, Constraint[] constraints, Callable call ); + Callable createCallMatch( String methodName, ConstraintMatcher constraints, Callable call ); } Index: DefaultCallFactory.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Attic/DefaultCallFactory.java,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -r1.1.2.3 -r1.1.2.4 --- DefaultCallFactory.java 11 Apr 2003 15:38:18 -0000 1.1.2.3 +++ DefaultCallFactory.java 5 May 2003 22:44:33 -0000 1.1.2.4 @@ -3,8 +3,6 @@ */ package com.mockobjects.dynamic; -import com.mockobjects.constraint.*; - /** * @author dev */ @@ -22,7 +20,7 @@ return new ExpectedCall(call); } - public Callable createCallMatch(String methodName, Constraint[] constraints, Callable call) { + public Callable createCallMatch(String methodName, ConstraintMatcher constraints, Callable call) { return new CallMatch( methodName, constraints, call ); } Index: CallCollection.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/CallCollection.java,v retrieving revision 1.1.2.2 retrieving revision 1.1.2.3 diff -u -r1.1.2.2 -r1.1.2.3 --- CallCollection.java 16 Apr 2003 22:47:58 -0000 1.1.2.2 +++ CallCollection.java 5 May 2003 22:44:33 -0000 1.1.2.3 @@ -7,7 +7,7 @@ protected AssertionFailedError createUnexpectedCallError(String methodName, Object[] args) { StringBuffer buf = new StringBuffer(); - buf.append("Unexpected call to "); + buf.append("Unexpected call: "); buf.append(DynamicUtil.methodToString(methodName, args)); buf.append("\n"); buf.append("Expected "); Index: C.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/C.java,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -r1.1.2.6 -r1.1.2.7 --- C.java 17 Apr 2003 11:46:25 -0000 1.1.2.6 +++ C.java 5 May 2003 22:44:33 -0000 1.1.2.7 @@ -19,8 +19,8 @@ public static final Constraint IS_ZERO = eq(new Integer(0)); public static final Constraint IS_NOT_ZERO = not(IS_ZERO); - public static final Constraint[] NO_ARGS = new Constraint[0]; - + public static final ConstraintMatcher NO_ARGS = new FullConstraintMatcher(new Constraint[0]); + public static final ConstraintMatcher ANY_ARGS = new AnyConstraintMatcher(); public static Constraint same( Object o ) { return new IsSame(o); @@ -29,20 +29,13 @@ public static Constraint eq( Object o ) { return new IsEqual(o); } - - public static Constraint[] eq( Object o0, Object o1 ) { - Constraint[] result = new Constraint[2]; - result[0] = eq(o0); - result[1] = eq(o1); - return result; + + public static ConstraintMatcher eq( Object arg0, Object arg1 ) { + return args(eq(arg0), eq(arg1)); } - public static Constraint[] eq( Object o0, Object o1, Object o2 ) { - Constraint[] result = new Constraint[3]; - result[0] = eq(o0); - result[1] = eq(o1); - result[2] = eq(o2); - return result; + public static ConstraintMatcher eq( Object arg0, Object arg1, Object arg2 ) { + return args(eq(arg0), eq(arg1), eq(arg2)); } public static Constraint eq( int n ) { @@ -110,28 +103,28 @@ /* Helper methods for succinctly constructing Constraint arrays */ - public static Constraint[] args() { - return new Constraint[0]; + public static ConstraintMatcher args() { + return NO_ARGS; } - public static Constraint[] args(Constraint p) { - return new Constraint[] {p}; + public static ConstraintMatcher args(Constraint p) { + return new FullConstraintMatcher(new Constraint[]{p}); } - public static Constraint[] args(Constraint p1, Constraint p2) { - return new Constraint[] {p1, p2}; + public static ConstraintMatcher args(Constraint p1, Constraint p2) { + return new FullConstraintMatcher(new Constraint[]{p1, p2}); } - public static Constraint[] args(Constraint p1, Constraint p2, Constraint p3) { - return new Constraint[] {p1, p2, p3}; + public static ConstraintMatcher args(Constraint p1, Constraint p2, Constraint p3) { + return new FullConstraintMatcher(new Constraint[]{p1, p2, p3}); } - public static Constraint[] anyArgs( int argCount) { - Constraint[] result = new Constraint[argCount]; - for (int i = 0; i < result.length; i++) { - result[i] = new IsAnything(); + public static ConstraintMatcher anyArgs( int argCount) { + Constraint[] constraints = new Constraint[argCount]; + for (int i = 0; i < constraints.length; i++) { + constraints[i] = new IsAnything(); } - return result; + return new FullConstraintMatcher(constraints); } } Index: Mock.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Mock.java,v retrieving revision 1.16.2.11 retrieving revision 1.16.2.12 diff -u -r1.16.2.11 -r1.16.2.12 --- Mock.java 29 Apr 2003 15:39:05 -0000 1.16.2.11 +++ Mock.java 5 May 2003 22:44:33 -0000 1.16.2.12 @@ -13,7 +13,6 @@ import com.mockobjects.Verifiable; import com.mockobjects.constraint.Constraint; - /** * @author dev */ @@ -53,6 +52,22 @@ } } + private ConstraintMatcher createConstraintMatcher(Object constraintArg) { + // Can't overload this method as callee had an Object parameter, and java + // doesn't do a secondary dispatch on the true underlying type + + if(constraintArg instanceof Constraint[]) { + // to support possible legacy usage of new Contraint[] {...} + return new FullConstraintMatcher((Constraint[])constraintArg); + } else if(constraintArg instanceof Constraint) { + // to support usage of C.lt(5) type constraints + return C.args((Constraint)constraintArg); + } else { + // normal usage of the overloaded expect/match object parameter + return C.args(C.eq(constraintArg)); + } + } + public String getMockName() { return name; } @@ -102,10 +117,10 @@ } public void expect(String methodName, Object singleEqualArg) { - expect(methodName, C.args(C.eq(singleEqualArg))); + expect(methodName, createConstraintMatcher(singleEqualArg)); } - public void expect(String methodName, Constraint[] args) { + public void expect(String methodName, ConstraintMatcher args) { callSequence.addExpect(callFactory.createExpectedCall(callFactory.createCallMatch(methodName, args, callFactory.createVoidStub()))); } @@ -122,7 +137,7 @@ } public void expectAndReturn(String methodName, Object singleEqualArg, Object result) { - this.expectAndReturn(methodName, C.args(C.eq(singleEqualArg)), result); + this.expectAndReturn(methodName, createConstraintMatcher(singleEqualArg), result); } public void expectAndReturn(String methodName, Object singleEqualArg, boolean result) { @@ -133,15 +148,15 @@ this.expectAndReturn(methodName, singleEqualArg, new Integer(result)); } - public void expectAndReturn(String methodName, Constraint[] args, Object result) { + public void expectAndReturn(String methodName, ConstraintMatcher args, Object result) { callSequence.addExpect(callFactory.createExpectedCall(callFactory.createCallMatch(methodName, args, callFactory.createReturnStub(result)))); } - public void expectAndReturn(String methodName, Constraint[] args, boolean result) { + public void expectAndReturn(String methodName, ConstraintMatcher args, boolean result) { this.expectAndReturn(methodName, args, new Boolean(result)); } - public void expectAndReturn(String methodName, Constraint[] args, int result) { + public void expectAndReturn(String methodName, ConstraintMatcher args, int result) { this.expectAndReturn(methodName, args, new Integer(result)); } @@ -150,10 +165,10 @@ } public void expectAndThrow(String methodName, Object singleEqualArg, Throwable exception) { - this.expectAndThrow(methodName, C.args(C.eq(singleEqualArg)), exception); + this.expectAndThrow(methodName, createConstraintMatcher(singleEqualArg), exception); } - public void expectAndThrow(String methodName, Constraint[] args, Throwable exception) { + public void expectAndThrow(String methodName, ConstraintMatcher args, Throwable exception) { callSequence.addExpect(callFactory.createExpectedCall(callFactory.createCallMatch(methodName, args, callFactory.createThrowStub(exception)))); } @@ -170,7 +185,7 @@ } public void matchAndReturn(String methodName, Object singleEqualArg, Object result) { - this.matchAndReturn(methodName, C.args(C.eq(singleEqualArg)), result); + this.matchAndReturn(methodName, createConstraintMatcher(singleEqualArg), result); } public void matchAndReturn(String methodName, boolean singleEqualArg, Object result) { @@ -189,15 +204,15 @@ this.matchAndReturn(methodName, singleEqualArg, new Integer(result)); } - public void matchAndReturn(String methodName, Constraint[] args, Object result) { + public void matchAndReturn(String methodName, ConstraintMatcher args, Object result) { callSequence.addMatch(callFactory.createCallMatch(methodName, args, callFactory.createReturnStub(result))); } - public void matchAndReturn(String methodName, Constraint[] args, boolean result) { + public void matchAndReturn(String methodName, ConstraintMatcher args, boolean result) { this.matchAndReturn(methodName, args, new Boolean(result)); } - public void matchAndReturn(String methodName, Constraint[] args, int result) { + public void matchAndReturn(String methodName, ConstraintMatcher args, int result) { this.matchAndReturn(methodName, args, new Integer(result)); } @@ -206,7 +221,7 @@ } public void matchAndThrow(String methodName, Object singleEqualArg, Throwable throwable) { - this.matchAndThrow(methodName, C.args(C.eq(singleEqualArg)), throwable); + this.matchAndThrow(methodName, createConstraintMatcher(singleEqualArg), throwable); } public void matchAndThrow(String methodName, boolean singleEqualArg, Throwable throwable) { @@ -217,7 +232,7 @@ this.matchAndThrow(methodName,new Integer(singleEqualArg), throwable); } - public void matchAndThrow(String methodName, Constraint[] args, Throwable throwable) { + public void matchAndThrow(String methodName, ConstraintMatcher args, Throwable throwable) { callSequence.addMatch(callFactory.createCallMatch(methodName, args, callFactory.createThrowStub(throwable))); } @@ -241,7 +256,7 @@ /** @deprecated @see expect */ - public void expectVoid(String methodName, Constraint[] args) { + public void expectVoid(String methodName, ConstraintMatcher args) { this.expect(methodName, args); } Index: CallMatch.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Attic/CallMatch.java,v retrieving revision 1.1.2.5 retrieving revision 1.1.2.6 diff -u -r1.1.2.5 -r1.1.2.6 --- CallMatch.java 16 Apr 2003 22:47:37 -0000 1.1.2.5 +++ CallMatch.java 5 May 2003 22:44:33 -0000 1.1.2.6 @@ -3,58 +3,37 @@ */ package com.mockobjects.dynamic; -import junit.framework.*; - -import com.mockobjects.constraint.*; -import com.mockobjects.util.*; +import junit.framework.Assert; +// TODO rename to CallSignature public class CallMatch extends Assert implements Callable { private String methodName; - private Constraint[] constraints; - private Callable decorated; + private ConstraintMatcher constraints; + private Callable delegate; - public CallMatch( String methodName, Constraint[] constraints, Callable decorated ) { + public CallMatch( String methodName, ConstraintMatcher constraints, Callable delegate ) { this.methodName = methodName; - this.constraints = (Constraint[])constraints.clone(); - this.decorated = decorated; + this.constraints = constraints; + this.delegate = delegate; } public Object call( Mock mock, String methodName, Object[] args ) throws Throwable - { - assertEquals( methodName + " received the wrong number of arguments", - constraints.length, args.length ); - - for( int i = 0; i < args.length; i++ ) { - if( !constraints[i].eval(args[i]) ) { - throw new AssertionFailedError( - AssertMo.expectedErrorMessage( methodName + " received incorrect argument " + i, - DynamicUtil.join(constraints), - DynamicUtil.join(args) ) ); - } - } - - return decorated.call( mock, methodName, args ); + { + return delegate.call( mock, methodName, args ); } public void verify() { - decorated.verify(); + delegate.verify(); } public boolean matches(String methodName, Object[] args) { - if( !this.methodName.equals(methodName) ) return false; - if( args.length != constraints.length ) return false; - - for (int i = 0; i < args.length; i++) { - if( !constraints[i].eval(args[i]) ) return false; - } - - return decorated.matches( methodName, args ); + return this.methodName.equals(methodName) && constraints.matches(args); } public String getDescription() { - return DynamicUtil.methodToString(methodName, constraints); + return DynamicUtil.methodToString(methodName, constraints.getConstraints()); } // Implemented to aid visualisation in an IDE debugger Index: ExpectedCall.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Attic/ExpectedCall.java,v retrieving revision 1.2.2.6 retrieving revision 1.2.2.7 diff -u -r1.2.2.6 -r1.2.2.7 --- ExpectedCall.java 16 Apr 2003 22:17:04 -0000 1.2.2.6 +++ ExpectedCall.java 5 May 2003 22:44:33 -0000 1.2.2.7 @@ -8,6 +8,7 @@ /** * @author dev */ +//TODO rename to CallOnce public class ExpectedCall implements Callable { private Callable delegate; private boolean wasCalled = false; @@ -17,7 +18,7 @@ } public String getDescription() { - return delegate.getDescription() + " [mandatory]"; + return delegate.getDescription() + " [" + (wasCalled ? "" : "not ") + "called]"; } public Object call(Mock mock, String methodName, Object[] args) throws Throwable { @@ -26,7 +27,7 @@ } public boolean matches(String methodName, Object[] args) { - return (! wasCalled) && delegate.matches( methodName, args ); + return (!wasCalled) && delegate.matches( methodName, args ); } public void verify() { Index: DynamicUtil.java =================================================================== RCS file: /cvsroot/mockobjects/mockobjects-java/src/core/com/mockobjects/dynamic/Attic/DynamicUtil.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -r1.1.2.1 -r1.1.2.2 --- DynamicUtil.java 16 Apr 2003 16:31:44 -0000 1.1.2.1 +++ DynamicUtil.java 5 May 2003 22:44:33 -0000 1.1.2.2 @@ -6,9 +6,9 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; - public class DynamicUtil { + //TODO rename to proxyToString public static String getProxyName(Object element) { if(Proxy.isProxyClass(element.getClass())) { try { @@ -20,7 +20,9 @@ } } + //TODO put in primitive array print handling return element.toString(); + } public static String methodToString( String name, Object[] args ) { @@ -39,12 +41,21 @@ for (int i = 0; i < elements.length; i++) { if( i > 0 ) buf.append(", "); - buf.append( "<" ); + Object element = elements[i]; - buf.append(DynamicUtil.getProxyName(element)); - buf.append( ">" ); - } - + //TODO put in primitive array print handling + if(element instanceof Object[]) { + buf.append( "[" ); + buf.append(join((Object[])element)); + buf.append( "]" ); + } else { + buf.append( "<" ); + buf.append(DynamicUtil.getProxyName(element)); + buf.append( ">" ); + } + } return buf.toString(); } + + } |