001    package groovy.mock;
002    
003    import groovy.lang.GroovyObject;
004    import groovy.lang.Closure;
005    import groovy.lang.GroovyObjectSupport;
006    
007    import com.mockobjects.Verifiable;
008    import com.mockobjects.dynamic.*;
009    
010    /**
011     * 
012     * @author Joe Walnes
013     * @author Chris Stevenson
014     * @version $Revision: 1.4 $
015     */
016    public class GroovyMock extends GroovyObjectSupport implements Verifiable {
017    
018        private CallBag calls = new CallBag();
019        private CallFactory callFactory = new DefaultCallFactory();
020        private Mock mock = new Mock(I.class);
021    
022        interface I {
023        }
024    
025        private GroovyObject instance = new GroovyObjectSupport() {
026            public Object invokeMethod(String name, Object args) {
027                return callMethod(name, args);
028            }
029        };
030    
031        public Object invokeMethod(String name, Object args) {
032            if (name.equals("verify")) {
033                verify();
034            }
035            else {
036                expectMethod(name, args);
037            }
038            return null;
039        }
040    
041        public GroovyObject getInstance() {
042            return instance;
043        }
044    
045        public static GroovyMock newInstance() {
046            return new GroovyMock();
047        }
048    
049        private void expectMethod(String name, Object args) {
050            ConstraintMatcher constraintMatcher = createMatcher(args);
051            calls.addExpect(
052                callFactory.createCallExpectation(
053                    callFactory.createCallSignature(name, constraintMatcher, callFactory.createVoidStub())));
054        }
055    
056        private ConstraintMatcher createMatcher(Object args) {
057            if(args.getClass().isArray()) {
058                Object argArray[] = (Object[]) args;
059                if (argArray[0] instanceof Closure) {
060                    Closure closure = (Closure) argArray[0];
061                    return C.args(new ClosureConstraintMatcher(closure));
062                }
063            }
064            return C.args(C.eq(args));
065        }
066    
067        private Object callMethod(String name, Object args) {
068            try {
069                return calls.call(mock, name, new Object[] { args });
070            }
071            catch (Throwable throwable) {
072                throw new RuntimeException(throwable);
073            }
074        }
075    
076        public void verify() {
077            calls.verify();
078        }
079    
080    }