19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.test.suitebuilder;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.InstrumentationTestCase;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.test.suitebuilder.annotation.Smoke;
21fedb4b745693afba9627f8971346d5151101fb88Paul Duffinimport android.test.suitebuilder.annotation.Suppress;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.Predicate;
23fedb4b745693afba9627f8971346d5151101fb88Paul Duffinimport java.lang.annotation.Annotation;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} Not needed for 1.0 SDK.
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class TestPredicates {
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    static final Predicate<TestMethod> REJECT_INSTRUMENTATION =
31fedb4b745693afba9627f8971346d5151101fb88Paul Duffin            not(new AssignableFrom(InstrumentationTestCase.class));
32fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
33fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    static final Predicate<TestMethod> SELECT_SMOKE = hasAnnotation(Smoke.class);
34fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
35fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    static final Predicate<TestMethod> REJECT_SUPPRESSED = not(hasAnnotation(Suppress.class));
36fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
37fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    /**
38fedb4b745693afba9627f8971346d5151101fb88Paul Duffin     * Return a predicate that checks to see if a {@link TestMethod} has an instance of the supplied
39fedb4b745693afba9627f8971346d5151101fb88Paul Duffin     * annotation class, either on the method or on the containing class.
40fedb4b745693afba9627f8971346d5151101fb88Paul Duffin     */
41fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    public static Predicate<TestMethod> hasAnnotation(Class<? extends Annotation> annotationClass) {
42fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        return new HasAnnotation(annotationClass);
43fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    }
44fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
45fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    private static class HasAnnotation implements Predicate<TestMethod> {
46fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
47fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        private final Class<? extends Annotation> annotationClass;
48fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
49fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        private HasAnnotation(Class<? extends Annotation> annotationClass) {
50fedb4b745693afba9627f8971346d5151101fb88Paul Duffin            this.annotationClass = annotationClass;
51fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        }
52fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
53fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        @Override
54fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        public boolean apply(TestMethod testMethod) {
55fedb4b745693afba9627f8971346d5151101fb88Paul Duffin            return testMethod.getAnnotation(annotationClass) != null ||
56fedb4b745693afba9627f8971346d5151101fb88Paul Duffin                    testMethod.getEnclosingClass().getAnnotation(annotationClass) != null;
57fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        }
58fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    }
59fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
60fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    /**
61fedb4b745693afba9627f8971346d5151101fb88Paul Duffin     * Returns a Predicate that evaluates to true iff the given Predicate
62fedb4b745693afba9627f8971346d5151101fb88Paul Duffin     * evaluates to false.
63fedb4b745693afba9627f8971346d5151101fb88Paul Duffin     */
64fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    public static <T> Predicate<T> not(Predicate<? super T> predicate) {
65fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        return new NotPredicate<T>(predicate);
66fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    }
67fedb4b745693afba9627f8971346d5151101fb88Paul Duffin
68fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    private static class NotPredicate<T> implements Predicate<T> {
69fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        private final Predicate<? super T> predicate;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        private NotPredicate(Predicate<? super T> predicate) {
72fedb4b745693afba9627f8971346d5151101fb88Paul Duffin            this.predicate = predicate;
73fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        public boolean apply(T t) {
76fedb4b745693afba9627f8971346d5151101fb88Paul Duffin            return !predicate.apply(t);
77fedb4b745693afba9627f8971346d5151101fb88Paul Duffin        }
78fedb4b745693afba9627f8971346d5151101fb88Paul Duffin    }
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
80