189093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner/* 289093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * Copyright (C) 2015 The Android Open Source Project 389093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * 489093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * Licensed under the Apache License, Version 2.0 (the "License"); 589093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * you may not use this file except in compliance with the License. 689093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * You may obtain a copy of the License at 789093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * 889093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * http://www.apache.org/licenses/LICENSE-2.0 989093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * 1089093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * Unless required by applicable law or agreed to in writing, software 1189093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * distributed under the License is distributed on an "AS IS" BASIS, 1289093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * See the License for the specific language governing permissions and 1489093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * limitations under the License. 1589093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner */ 1689093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linznerpackage android.support.annotation; 1789093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner 1889093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linznerimport java.lang.annotation.Retention; 1989093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner 20adf6e1d804a89030414d1cba0bde0ca8361ec1c6Jeff Davidsonimport static java.lang.annotation.RetentionPolicy.CLASS; 2189093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner 2289093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner/** 2389093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * Denotes that the class, method or field has its visibility relaxed, so that it is more widely 2489093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner * visible than otherwise necessary to make code testable. 256b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * <p> 266b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * You can optionally specify what the visibility <b>should</b> have been if not for 276b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * testing; this allows tools to catch unintended access from within production 286b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * code. 296b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * <p> 306b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * Example: 316b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * <pre><code> 326b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED) 336b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * public String printDiagnostics() { ... } 346b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * </code></pre> 356b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * 366b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * If not specified, the intended visibility is assumed to be private. 3789093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner */ 38adf6e1d804a89030414d1cba0bde0ca8361ec1c6Jeff Davidson@Retention(CLASS) 3989093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linznerpublic @interface VisibleForTesting { 406b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye /** 416b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * The visibility the annotated element would have if it did not need to be made visible for 426b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * testing. 436b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye */ 446b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye @ProductionVisibility 456b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye int otherwise() default PRIVATE; 466b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye 476b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye /** 486b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * The annotated element would have "private" visibility 496b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye */ 506b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye int PRIVATE = 2; // Happens to be the same as Modifier.PRIVATE 516b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye 526b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye /** 536b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * The annotated element would have "package private" visibility 546b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye */ 556b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye int PACKAGE_PRIVATE = 3; 566b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye 576b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye /** 586b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * The annotated element would have "protected" visibility 596b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye */ 606b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye int PROTECTED = 4; // Happens to be the same as Modifier.PROTECTED 616b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye 626b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye /** 636b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * The annotated element should never be called from production code, only from tests. 646b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * <p> 656b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye * This is equivalent to {@code @RestrictTo.Scope.TESTS}. 666b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye */ 676b55d5559e05240c4b8b6693633a40184da1f755Tor Norbye int NONE = 5; 6889093da9c4a383a58c2c2de78a2194ac1c020fe7Stephan Linzner} 69