1 /* 2 * Copyright (C) 2015 The Dagger Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package dagger.internal.codegen.langmodel; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static dagger.internal.codegen.langmodel.Accessibility.isElementAccessibleFrom; 21 22 import com.google.testing.compile.CompilationRule; 23 import javax.lang.model.element.Element; 24 import javax.lang.model.element.TypeElement; 25 import javax.lang.model.util.Elements; 26 import org.junit.Before; 27 import org.junit.Rule; 28 import org.junit.Test; 29 import org.junit.runner.RunWith; 30 import org.junit.runners.JUnit4; 31 32 @RunWith(JUnit4.class) 33 @SuppressWarnings("unused") // contains a variety things used by the compilation rule for testing 34 public class AccessibilityTest { 35 /* test data */ AccessibilityTest()36 public AccessibilityTest() {} AccessibilityTest(Object o)37 protected AccessibilityTest(Object o) {} AccessibilityTest(Object o1, Object o2)38 AccessibilityTest(Object o1, Object o2) {} AccessibilityTest(Object o1, Object o2, Object o3)39 private AccessibilityTest(Object o1, Object o2, Object o3) {} 40 41 public String publicField; 42 protected String protectedField; 43 String packagePrivateField; 44 private String privateField; 45 publicMethod()46 public void publicMethod() {} protectedMethod()47 protected void protectedMethod() {} packagePrivateMethod()48 void packagePrivateMethod() {} privateMethod()49 private void privateMethod() {} 50 51 public static final class PublicNestedClass {} 52 protected static final class ProtectedNestedClass {} 53 static final class PackagePrivateNestedClass {} 54 private static final class PrivateNestedClass {} 55 56 @Rule 57 public final CompilationRule compilationRule = new CompilationRule(); 58 59 private TypeElement testElement; 60 61 @Before setUp()62 public void setUp() { 63 Elements elements = compilationRule.getElements(); 64 testElement = elements.getTypeElement(AccessibilityTest.class.getCanonicalName()); 65 } 66 67 @Test isElementAccessibleFrom_publicType()68 public void isElementAccessibleFrom_publicType() { 69 assertThat(isElementAccessibleFrom(testElement, "literally.anything")).isTrue(); 70 } 71 72 @Test isElementAccessibleFrom_publicMethod()73 public void isElementAccessibleFrom_publicMethod() { 74 Element member = getMemberNamed("publicMethod"); 75 assertThat(isElementAccessibleFrom(member, "literally.anything")).isTrue(); 76 } 77 78 @Test isElementAccessibleFrom_protectedMethod()79 public void isElementAccessibleFrom_protectedMethod() { 80 Element member = getMemberNamed("protectedMethod"); 81 assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue(); 82 assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse(); 83 } 84 85 @Test isElementAccessibleFrom_packagePrivateMethod()86 public void isElementAccessibleFrom_packagePrivateMethod() { 87 Element member = getMemberNamed("packagePrivateMethod"); 88 assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue(); 89 assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse(); 90 } 91 92 @Test isElementAccessibleFrom_privateMethod()93 public void isElementAccessibleFrom_privateMethod() { 94 Element member = getMemberNamed( "privateMethod"); 95 assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isFalse(); 96 assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse(); 97 } 98 99 @Test isElementAccessibleFrom_publicField()100 public void isElementAccessibleFrom_publicField() { 101 Element member = getMemberNamed("publicField"); 102 assertThat(isElementAccessibleFrom(member, "literally.anything")).isTrue(); 103 } 104 105 @Test isElementAccessibleFrom_protectedField()106 public void isElementAccessibleFrom_protectedField() { 107 Element member = getMemberNamed("protectedField"); 108 assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue(); 109 assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse(); 110 } 111 112 @Test isElementAccessibleFrom_packagePrivateField()113 public void isElementAccessibleFrom_packagePrivateField() { 114 Element member = getMemberNamed("packagePrivateField"); 115 assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isTrue(); 116 assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse(); 117 } 118 119 @Test isElementAccessibleFrom_privateField()120 public void isElementAccessibleFrom_privateField() { 121 Element member = getMemberNamed("privateField"); 122 assertThat(isElementAccessibleFrom(member, "dagger.internal.codegen")).isFalse(); 123 assertThat(isElementAccessibleFrom(member, "not.dagger.internal.codegen")).isFalse(); 124 } 125 getMemberNamed(String memberName)126 private Element getMemberNamed(String memberName) { 127 for (Element enclosedElement : testElement.getEnclosedElements()) { 128 if (enclosedElement.getSimpleName().contentEquals(memberName)) { 129 return enclosedElement; 130 } 131 } 132 throw new IllegalArgumentException(); 133 } 134 } 135 136