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