diff options
Diffstat (limited to 'tck/org/atinject/tck/Tck.java')
-rw-r--r-- | tck/org/atinject/tck/Tck.java | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/tck/org/atinject/tck/Tck.java b/tck/org/atinject/tck/Tck.java new file mode 100644 index 0000000..76b5465 --- /dev/null +++ b/tck/org/atinject/tck/Tck.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2009 The JSR-330 Expert Group + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.atinject.tck; + +import org.atinject.tck.auto.Car; +import org.atinject.tck.auto.Convertible; + +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * Manufactures the compatibility test suite. This TCK relies on + * <a href="http://junit.org/">JUnit</a>. To integrate the TCK with your + * injector, create a JUnit test suite class that passes an injected + * {@link Car Car} instance to {@link #testsFor testsFor(Car)}: + * + * <pre> + * import junit.framework.Test; + * import org.atinject.tck.Tck; + * import org.atinject.tck.auto.Car; + * + * public class MyTck { + * public static Test suite() { + * Car car = new MyInjector().getInstance(Car.class); + * return Tck.testsFor(car, + * true /* supportsStatic */, + * true /* supportsPrivate */); + * } + * }</pre> + * + * <p>The static {@code suite} method that returns a {@code Test} is a JUnit + * convention. Feel free to run the returned tests in other ways. + * + * <p>Configure the injector as follows: + * + * <ul> + * <li>{@link org.atinject.tck.auto.Car} is implemented by + * {@link org.atinject.tck.auto.Convertible Convertible}. + * <li>{@link org.atinject.tck.auto.Drivers @Drivers} + * {@link org.atinject.tck.auto.Seat Seat} is + * implemented by {@link org.atinject.tck.auto.DriversSeat DriversSeat}. + * <li>{@link org.atinject.tck.auto.Seat Seat} is + * implemented by {@link org.atinject.tck.auto.Seat Seat} itself, and + * {@link org.atinject.tck.auto.Tire Tire} by + * {@link org.atinject.tck.auto.Tire Tire} itself + * (not subclasses). + * <li>{@link org.atinject.tck.auto.Engine Engine} is implemented by + * {@link org.atinject.tck.auto.V8Engine V8Engine}. + * <li>{@link javax.inject.Named @Named("spare")} + * {@link org.atinject.tck.auto.Tire Tire} is implemented by + * {@link org.atinject.tck.auto.accessories.SpareTire SpareTire}. + * <li>The following classes may also be injected directly: + * {@link org.atinject.tck.auto.accessories.Cupholder Cupholder}, + * {@link org.atinject.tck.auto.accessories.SpareTire SpareTire}, and + * {@link org.atinject.tck.auto.FuelTank FuelTank}. + * </ul> + * + * <p>Static and private member injection support is optional, but if your + * injector supports those features, it must pass the respective tests. If + * static member injection is supported, the static members of the following + * types shall also be injected once: + * {@link org.atinject.tck.auto.Convertible Convertible}, + * {@link org.atinject.tck.auto.Tire Tire}, and + * {@link org.atinject.tck.auto.accessories.SpareTire SpareTire}. + * + * <p>Use your favorite JUnit tool to run the tests. For example, you can use + * your IDE or JUnit's command line runner: + * + * <pre> + * java -cp javax.inject-tck.jar:junit.jar:myinjector.jar \ + * junit.textui.TestRunner MyTck</pre> + */ +public class Tck { + + private Tck() {} + + /** + * Constructs a JUnit test suite for the given {@link Car} instance. + * + * @param car to test + * @param supportsStatic true if the injector supports static member + * injection + * @param supportsPrivate true if the injector supports private member + * injection + * + * @throws NullPointerException if car is null + * @throws ClassCastException if car doesn't extend + * {@link Convertible Convertible} + */ + public static Test testsFor(Car car, boolean supportsStatic, + boolean supportsPrivate) { + if (car == null) { + throw new NullPointerException("car"); + } + + if (!(car instanceof Convertible)) { + throw new ClassCastException("car doesn't implement Convertible"); + } + + Convertible.localConvertible.set((Convertible) car); + try { + TestSuite suite = new TestSuite(Convertible.Tests.class); + if (supportsStatic) { + suite.addTestSuite(Convertible.StaticTests.class); + } + if (supportsPrivate) { + suite.addTestSuite(Convertible.PrivateTests.class); + } + return suite; + } finally { + Convertible.localConvertible.remove(); + } + } +} |