132c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin/*
232c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * Copyright (C) 2016 The Android Open Source Project
332c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin *
432c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
532c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * you may not use this file except in compliance with the License.
632c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * You may obtain a copy of the License at
732c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin *
832c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin *      http://www.apache.org/licenses/LICENSE-2.0
932c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin *
1032c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * Unless required by applicable law or agreed to in writing, software
1132c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
1232c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1332c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * See the License for the specific language governing permissions and
1432c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * limitations under the License.
1532c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin */
1632c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
1732c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffinpackage vogar.target.junit;
1832c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
19654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffinimport com.google.common.base.Function;
2032c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffinimport java.util.ArrayList;
2132c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffinimport java.util.Collection;
2232c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffinimport org.junit.runner.Runner;
23654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffinimport org.junit.runners.BlockJUnit4ClassRunner;
24654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffinimport org.junit.runners.JUnit4;
2532c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffinimport org.junit.runners.model.RunnerBuilder;
26dfd9233635dd8752272fbeba22ffb88183ce300aPaul Duffinimport vogar.target.junit.junit3.AlternateSuiteMethodBuilder;
2732c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
2832c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin/**
2932c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * A composite {@link RunnerBuilder} that will ask each of its list of {@link RunnerBuilder} to
3032c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin * create a runner, returning the result of the first that does so, or null if none match.
3132c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin */
3232c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffinpublic class VogarRunnerBuilder extends RunnerBuilder {
3332c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
34654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin    private static final ReplaceRunnerFunction MAPPING_FUNCTION = new ReplaceRunnerFunction();
35654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin
36654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin    private final RunnerParams runnerParams;
3732c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin    private final Collection<RunnerBuilder> builders;
3832c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
3932c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin    public VogarRunnerBuilder(RunnerParams runnerParams) {
40654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin        this.runnerParams = runnerParams;
4132c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin        builders = new ArrayList<>();
42654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin        builders.add(new MappingAnnotatedBuilder(this, MAPPING_FUNCTION));
43dfd9233635dd8752272fbeba22ffb88183ce300aPaul Duffin        builders.add(new AlternateSuiteMethodBuilder(runnerParams));
44dfd9233635dd8752272fbeba22ffb88183ce300aPaul Duffin        builders.add(new VogarTestCaseBuilder(runnerParams));
45654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin        builders.add(new VogarJUnit4Builder(this));
46654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin    }
47654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin
48654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin    public RunnerParams getRunnerParams() {
49654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin        return runnerParams;
5032c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin    }
5132c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
5232c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin    @Override
5332c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin    public Runner runnerForClass(Class<?> testClass) throws Throwable {
5432c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin        for (RunnerBuilder builder : builders) {
5532c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin            Runner runner = builder.safeRunnerForClass(testClass);
5632c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin            if (runner != null) {
5732c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin                return runner;
5832c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin            }
5932c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin        }
6032c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
6132c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin        return null;
6232c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin    }
6332c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin
64654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin    private static class ReplaceRunnerFunction
65654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin            implements Function<Class<? extends Runner>, Class<? extends Runner>> {
66654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin        @Override
67654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin        public Class<? extends Runner> apply(Class<? extends Runner> runnerClass) {
68654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin            if (runnerClass == JUnit4.class || runnerClass == BlockJUnit4ClassRunner.class) {
69654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin                return VogarBlockJUnit4ClassRunner.class;
70654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin            } else {
71654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin                return runnerClass;
72654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin            }
73654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin        }
74654f21617c60f23069912900a1e1ef11e9e1c742Paul Duffin    }
7532c7fa74f2fcf54546eb6b1165bda1ae548cad46Paul Duffin}
76