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.util.ArrayList;
2047d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.util.LinkedList;
2147d431f63a66505a645f282416659a9758a91f1cBrett Chabotimport java.util.List;
2247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2347d431f63a66505a645f282416659a9758a91f1cBrett Chabotpublic class Results implements Serializable {
2447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private static final long serialVersionUID = -2722051869610289637L;
2647d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2747d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private int callCount;
2847d431f63a66505a645f282416659a9758a91f1cBrett Chabot
2947d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private final LinkedList<Range> ranges = new LinkedList<Range>();
3047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private final List<Result> results = new ArrayList<Result>();
3247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
3347d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public void add(Result result, Range range) {
3447d431f63a66505a645f282416659a9758a91f1cBrett Chabot        if (!ranges.isEmpty()) {
3547d431f63a66505a645f282416659a9758a91f1cBrett Chabot            Range lastRange = ranges.getLast();
3647d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (!lastRange.hasFixedCount())
3747d431f63a66505a645f282416659a9758a91f1cBrett Chabot                throw new RuntimeExceptionWrapper(
3847d431f63a66505a645f282416659a9758a91f1cBrett Chabot                        new IllegalStateException(
3947d431f63a66505a645f282416659a9758a91f1cBrett Chabot                                "last method called on mock already has a non-fixed count set."));
4047d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
4147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        ranges.add(range);
4247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        results.add(result);
4347d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
4447d431f63a66505a645f282416659a9758a91f1cBrett Chabot
4547d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public Result next() {
4647d431f63a66505a645f282416659a9758a91f1cBrett Chabot        int currentPosition = 0;
4747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        for (int i = 0; i < ranges.size(); i++) {
4847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            Range interval = ranges.get(i);
4947d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (interval.hasOpenCount()) {
5047d431f63a66505a645f282416659a9758a91f1cBrett Chabot                callCount += 1;
5147d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return results.get(i);
5247d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
5347d431f63a66505a645f282416659a9758a91f1cBrett Chabot            currentPosition += interval.getMaximum();
5447d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (currentPosition > callCount) {
5547d431f63a66505a645f282416659a9758a91f1cBrett Chabot                callCount += 1;
5647d431f63a66505a645f282416659a9758a91f1cBrett Chabot                return results.get(i);
5747d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
5847d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
5947d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return null;
6047d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
6147d431f63a66505a645f282416659a9758a91f1cBrett Chabot
6247d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public boolean hasValidCallCount() {
6347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return getMainInterval().contains(getCallCount());
6447d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
6547d431f63a66505a645f282416659a9758a91f1cBrett Chabot
6647d431f63a66505a645f282416659a9758a91f1cBrett Chabot    @Override
6747d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public String toString() {
6847d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return getMainInterval().expectedCount();
6947d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
7047d431f63a66505a645f282416659a9758a91f1cBrett Chabot
7147d431f63a66505a645f282416659a9758a91f1cBrett Chabot    private Range getMainInterval() {
7247d431f63a66505a645f282416659a9758a91f1cBrett Chabot        int min = 0, max = 0;
7347d431f63a66505a645f282416659a9758a91f1cBrett Chabot
7447d431f63a66505a645f282416659a9758a91f1cBrett Chabot        for (Range interval : ranges) {
7547d431f63a66505a645f282416659a9758a91f1cBrett Chabot            min += interval.getMinimum();
7647d431f63a66505a645f282416659a9758a91f1cBrett Chabot            if (interval.hasOpenCount() || max == Integer.MAX_VALUE) {
7747d431f63a66505a645f282416659a9758a91f1cBrett Chabot                max = Integer.MAX_VALUE;
7847d431f63a66505a645f282416659a9758a91f1cBrett Chabot            } else {
7947d431f63a66505a645f282416659a9758a91f1cBrett Chabot                max += interval.getMaximum();
8047d431f63a66505a645f282416659a9758a91f1cBrett Chabot            }
8147d431f63a66505a645f282416659a9758a91f1cBrett Chabot        }
8247d431f63a66505a645f282416659a9758a91f1cBrett Chabot
8347d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return new Range(min, max);
8447d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
8547d431f63a66505a645f282416659a9758a91f1cBrett Chabot
8647d431f63a66505a645f282416659a9758a91f1cBrett Chabot    public int getCallCount() {
8747d431f63a66505a645f282416659a9758a91f1cBrett Chabot        return callCount;
8847d431f63a66505a645f282416659a9758a91f1cBrett Chabot    }
8947d431f63a66505a645f282416659a9758a91f1cBrett Chabot}
90