• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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