147d431f63a66505a645f282416659a9758a91f1cBrett Chabot/*
247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Copyright 2001-2009 OFFIS, Tammo Freese
347d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Licensed under the Apache License, Version 2.0 (the "License");
547d431f63a66505a645f282416659a9758a91f1cBrett Chabot * you may not use this file except in compliance with the License.
647d431f63a66505a645f282416659a9758a91f1cBrett Chabot * You may obtain a copy of the License at
747d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
847d431f63a66505a645f282416659a9758a91f1cBrett Chabot *     http://www.apache.org/licenses/LICENSE-2.0
947d431f63a66505a645f282416659a9758a91f1cBrett Chabot *
1047d431f63a66505a645f282416659a9758a91f1cBrett Chabot * Unless required by applicable law or agreed to in writing, software
1147d431f63a66505a645f282416659a9758a91f1cBrett Chabot * distributed under the License is distributed on an "AS IS" BASIS,
1247d431f63a66505a645f282416659a9758a91f1cBrett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347d431f63a66505a645f282416659a9758a91f1cBrett Chabot * See the License for the specific language governing permissions and
1447d431f63a66505a645f282416659a9758a91f1cBrett Chabot * limitations under the License.
1547d431f63a66505a645f282416659a9758a91f1cBrett Chabot */
1647d431f63a66505a645f282416659a9758a91f1cBrett Chabotpackage org.easymock.internal;
1747d431f63a66505a645f282416659a9758a91f1cBrett Chabot
1847d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.io.Serializable;
1947d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.lang.reflect.InvocationTargetException;
2047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2147d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport org.easymock.IAnswer;
2247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2347d431f63a66505a645f282416659a9758a91f1cBrett Chabotpublic class Result implements IAnswer<Object>, Serializable {
2447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private static final long serialVersionUID = 5476251941213917681L;
2647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2747d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private final IAnswer<?> value;
2847d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2947d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private final boolean shouldFillInStackTrace;
3047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private Result(IAnswer<?> value, boolean shouldFillInStackTrace) {
3247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        this.value = value;
3347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        this.shouldFillInStackTrace = shouldFillInStackTrace;
3447d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
3547d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3647d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public static Result createThrowResult(final Throwable throwable) {
3747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        class ThrowingAnswer implements IAnswer<Object>, Serializable {
3847d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3947d431f63a66505a645f282416659a9758a91f1cBrett Chabot            private static final long serialVersionUID = -332797751209289222L;
4047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
4147d431f63a66505a645f282416659a9758a91f1cBrett Chabot            public Object answer() throws Throwable {
4247d431f63a66505a645f282416659a9758a91f1cBrett Chabot                throw throwable;
4347d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
4447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
4547d431f63a66505a645f282416659a9758a91f1cBrett Chabot            @Override
4647d431f63a66505a645f282416659a9758a91f1cBrett Chabot            public String toString() {
4747d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return "Answer throwing " + throwable;
4847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
4947d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
5047d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return new Result(new ThrowingAnswer(), true);
5147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
5247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
5347d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public static Result createReturnResult(final Object value) {
5447d431f63a66505a645f282416659a9758a91f1cBrett Chabot        class ReturningAnswer implements IAnswer<Object>, Serializable {
5547d431f63a66505a645f282416659a9758a91f1cBrett Chabot
5647d431f63a66505a645f282416659a9758a91f1cBrett Chabot            private static final long serialVersionUID = 6973893913593916866L;
5747d431f63a66505a645f282416659a9758a91f1cBrett Chabot
5847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            public Object answer() throws Throwable {
5947d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return value;
6047d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
6147d431f63a66505a645f282416659a9758a91f1cBrett Chabot
6247d431f63a66505a645f282416659a9758a91f1cBrett Chabot            @Override
6347d431f63a66505a645f282416659a9758a91f1cBrett Chabot            public String toString() {
6447d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return "Answer returning " + value;
6547d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
6647d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
6747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return new Result(new ReturningAnswer(), true);
6847d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
6947d431f63a66505a645f282416659a9758a91f1cBrett Chabot
7047d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public static Result createDelegatingResult(final Object value) {
7147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        class DelegatingAnswer implements IAnswer<Object>, Serializable {
7247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
7347d431f63a66505a645f282416659a9758a91f1cBrett Chabot            private static final long serialVersionUID = -5699326678580460103L;
7447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
7547d431f63a66505a645f282416659a9758a91f1cBrett Chabot            public Object answer() throws Throwable {
7647d431f63a66505a645f282416659a9758a91f1cBrett Chabot                Invocation invocation = LastControl.getCurrentInvocation();
7747d431f63a66505a645f282416659a9758a91f1cBrett Chabot                try {
7847d431f63a66505a645f282416659a9758a91f1cBrett Chabot                    return invocation.getMethod().invoke(value,
7947d431f63a66505a645f282416659a9758a91f1cBrett Chabot                            invocation.getArguments());
8047d431f63a66505a645f282416659a9758a91f1cBrett Chabot                } catch (IllegalArgumentException e) {
8147d431f63a66505a645f282416659a9758a91f1cBrett Chabot                    throw new IllegalArgumentException("Delegation to object ["
8247d431f63a66505a645f282416659a9758a91f1cBrett Chabot                            + String.valueOf(value)
8347d431f63a66505a645f282416659a9758a91f1cBrett Chabot                            + "] is not implementing the mocked method ["
8447d431f63a66505a645f282416659a9758a91f1cBrett Chabot                            + invocation.getMethod() + "]", e);
8547d431f63a66505a645f282416659a9758a91f1cBrett Chabot                } catch (InvocationTargetException e) {
8647d431f63a66505a645f282416659a9758a91f1cBrett Chabot                    throw e.getCause();
8747d431f63a66505a645f282416659a9758a91f1cBrett Chabot                }
8847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
8947d431f63a66505a645f282416659a9758a91f1cBrett Chabot
9047d431f63a66505a645f282416659a9758a91f1cBrett Chabot            @Override
9147d431f63a66505a645f282416659a9758a91f1cBrett Chabot            public String toString() {
9247d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return "Delegated to " + value;
9347d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
9447d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
9547d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return new Result(new DelegatingAnswer(), false);
9647d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
9747d431f63a66505a645f282416659a9758a91f1cBrett Chabot
9847d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public static Result createAnswerResult(IAnswer<?> answer) {
9947d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return new Result(answer, false);
10047d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
10147d431f63a66505a645f282416659a9758a91f1cBrett Chabot
10247d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public Object answer() throws Throwable {
10347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return value.answer();
10447d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
10547d431f63a66505a645f282416659a9758a91f1cBrett Chabot
10647d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public boolean shouldFillInStackTrace() {
10747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return shouldFillInStackTrace;
10847d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
10947d431f63a66505a645f282416659a9758a91f1cBrett Chabot
11047d431f63a66505a645f282416659a9758a91f1cBrett Chabot    @Override
11147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public String toString() {
11247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return value.toString();
11347d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
11447d431f63a66505a645f282416659a9758a91f1cBrett Chabot}
115