aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/org/zwobble/mammoth/tests/Arguments.java
blob: afb20bbab8c7ede4eb11a0b1f80fc0b62ef128fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package org.zwobble.mammoth.tests;

import org.zwobble.mammoth.internal.util.Iterables;

import java.util.Iterator;

import static java.util.Arrays.asList;

public class Arguments {
    private final Object[] arguments;

    public Arguments(Object[] arguments) {
        this.arguments = arguments;
    }

    public <T> T get(Class<T> clazz) {
        return only(getAll(clazz));
    }

    public <T> T get(Class<T> clazz, T defaultValue) {
        Iterator<T> arguments = getAll(clazz).iterator();
        if (!arguments.hasNext()) {
            return defaultValue;
        } else {
            return only(arguments);
        }
    }

    private <T> Iterable<T> getAll(Class<T> clazz) {
        return Iterables.lazyFilter(asList(arguments), clazz);
    }


    private <T> T only(Iterable<T> iterable) {
        return only(iterable.iterator());
    }

    private <T> T only(Iterator<T> iterator) {
        T value = iterator.next();
        if (iterator.hasNext()) {
            throw new RuntimeException("Expected exactly one element, but had multiple elements");
        } else {
            return value;
        }
    }
}