You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

RestrictingVisibilityCP.java 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import org.aspectj.testing.Tester;
  2. /** @testcase PR#536 overriding subclass method may be protected when superclass method has default access */
  3. public class RestrictingVisibilityCP {
  4. public static void main(String[] args) {
  5. Tester.expectEventsInString(Const.EXPECTED);
  6. Parent[] tests = new Parent[]
  7. { new Parent()
  8. , new ValidChild()
  9. , new ValidChild2()
  10. , new ValidChild3()
  11. , new ValidChildTest()
  12. , new ValidChildTest2()
  13. , new ValidChildTest3()
  14. };
  15. Parent child;
  16. for (int i = 0; i< tests.length;i++) {
  17. child = tests[i];
  18. Tester.event(child.getClass().getName());
  19. //System.err.println(", \"" + child.getClass().getName() + "\"");
  20. child.publicAccess();
  21. child.defaultAccess();
  22. child.protectedAccess();
  23. child.drivePrivateAccess();
  24. }
  25. Tester.checkAllEvents();
  26. }
  27. }
  28. /** aspect used to log progess - test case otherwise purejava */
  29. aspect LogAll {
  30. before() : within(Parent+) && execution(* *(..)) {
  31. String name = thisJoinPointStaticPart.toString();
  32. Tester.event(name);
  33. // System.err.println(", \"" + name + "\"");
  34. }
  35. }
  36. class Parent {
  37. public int publicAccess = 1;
  38. protected int protectedAccess = 1;
  39. int defaultAccess = 1;
  40. private int privateAccess = 1;
  41. public void publicAccess() {}
  42. protected void protectedAccess() {}
  43. void defaultAccess() {}
  44. private void privateAccess() {}
  45. void drivePrivateAccess() {
  46. privateAccess();
  47. }
  48. }
  49. class ValidChild extends Parent {
  50. /** @testcase subclass public implementation of public method */
  51. public void publicAccess() { super.publicAccess(); }
  52. /** @testcase subclass protected implementation of protected method */
  53. protected void protectedAccess() { super.protectedAccess(); }
  54. /** @testcase subclass default implementation of default method */
  55. void defaultAccess() { super.defaultAccess(); }
  56. /** @testcase subclass implementation of private method - not overriding */
  57. private void privateAccess() { }
  58. void drivePrivateAccess() {
  59. privateAccess();
  60. super.drivePrivateAccess();
  61. }
  62. int publicAccessSub = publicAccess;
  63. int protectedAccessSub = protectedAccess;
  64. int defaultAccessSub = defaultAccess;
  65. }
  66. class ValidChild2 extends Parent {
  67. /** @testcase subclass public implementation of protected method */
  68. public void protectedAccess() { super.protectedAccess(); }
  69. /** @testcase subclass public implementation of default method */
  70. public void defaultAccess() { super.defaultAccess(); }
  71. }
  72. class ValidChild3 extends Parent {
  73. /** @testcase subclass protected implementation of default method */
  74. // todo: restore to restore ce
  75. protected void defaultAccess() { super.defaultAccess(); }
  76. }
  77. class ValidChildTest extends ValidChild {
  78. /** @testcase subsubclass public implementation of public method */
  79. public void publicAccess() { super.publicAccess(); }
  80. /** @testcase subsubclass protected implementation of protected method */
  81. protected void protectedAccess() { super.protectedAccess(); }
  82. /** @testcase subsubclass default implementation of default method */
  83. void defaultAccess() { super.defaultAccess(); }
  84. /** @testcase subsubclass implementation of private method - not overriding */
  85. private void privateAccess() { }
  86. void drivePrivateAccess() {
  87. privateAccess();
  88. super.drivePrivateAccess();
  89. }
  90. }
  91. class ValidChildTest2 extends ValidChild {
  92. /** @testcase subsubclass public implementation of protected method */
  93. public void protectedAccess() { super.protectedAccess(); }
  94. /** @testcase subsubclass public implementation of default method */
  95. public void defaultAccess() { super.defaultAccess(); }
  96. }
  97. class ValidChildTest3 extends ValidChild {
  98. /** @testcase PR#536 subsubclass protected implementation of default method */
  99. // todo protected void defaultAccess() { super.defaultAccess(); }
  100. }
  101. class ValidChild5 extends Parent {
  102. int one = publicAccess;
  103. int two = protectedAccess;
  104. int three = defaultAccess;
  105. }
  106. class ValidClass {
  107. static int[] ra;
  108. static {
  109. ra = new int[]
  110. { (new Parent()).publicAccess
  111. , (new ValidChild()).publicAccess
  112. , (new ValidChildTest()).publicAccess
  113. , (new Parent()).defaultAccess
  114. , (new ValidChild()).defaultAccess
  115. , (new ValidChildTest()).defaultAccess
  116. , (new Parent()).protectedAccess
  117. , (new ValidChild()).protectedAccess
  118. , (new ValidChildTest()).protectedAccess
  119. };
  120. for (int i = 0; i < ra.length; i++) {
  121. Tester.check(1 == ra[i],
  122. "expected 1 at " + i + " got i" + ra[i]);
  123. }
  124. }
  125. }
  126. class Const {
  127. public static final String[] EXPECTED = new String[]
  128. { "Parent"
  129. , "execution(void Parent.publicAccess())"
  130. , "execution(void Parent.defaultAccess())"
  131. , "execution(void Parent.protectedAccess())"
  132. , "execution(void Parent.drivePrivateAccess())"
  133. , "execution(void Parent.privateAccess())"
  134. , "ValidChild"
  135. , "execution(void ValidChild.publicAccess())"
  136. , "execution(void Parent.publicAccess())"
  137. , "execution(void ValidChild.defaultAccess())"
  138. , "execution(void Parent.defaultAccess())"
  139. , "execution(void ValidChild.protectedAccess())"
  140. , "execution(void Parent.protectedAccess())"
  141. , "execution(void ValidChild.drivePrivateAccess())"
  142. , "execution(void ValidChild.privateAccess())"
  143. , "execution(void Parent.drivePrivateAccess())"
  144. , "execution(void Parent.privateAccess())"
  145. , "ValidChild2"
  146. , "execution(void Parent.publicAccess())"
  147. , "execution(void ValidChild2.defaultAccess())"
  148. , "execution(void Parent.defaultAccess())"
  149. , "execution(void ValidChild2.protectedAccess())"
  150. , "execution(void Parent.protectedAccess())"
  151. , "execution(void Parent.drivePrivateAccess())"
  152. , "execution(void Parent.privateAccess())"
  153. , "ValidChild3"
  154. , "execution(void Parent.publicAccess())"
  155. , "execution(void ValidChild3.defaultAccess())"
  156. , "execution(void Parent.defaultAccess())"
  157. , "execution(void Parent.protectedAccess())"
  158. , "execution(void Parent.drivePrivateAccess())"
  159. , "execution(void Parent.privateAccess())"
  160. , "execution(void ValidChildTest.publicAccess())"
  161. , "execution(void ValidChild.publicAccess())"
  162. , "execution(void Parent.publicAccess())"
  163. , "ValidChildTest"
  164. , "execution(void ValidChildTest.defaultAccess())"
  165. , "execution(void ValidChild.defaultAccess())"
  166. , "execution(void Parent.defaultAccess())"
  167. , "execution(void ValidChildTest.protectedAccess())"
  168. , "execution(void ValidChild.protectedAccess())"
  169. , "execution(void Parent.protectedAccess())"
  170. , "execution(void ValidChildTest.drivePrivateAccess())"
  171. , "execution(void ValidChildTest.privateAccess())"
  172. , "execution(void ValidChild.drivePrivateAccess())"
  173. , "execution(void ValidChild.privateAccess())"
  174. , "execution(void Parent.drivePrivateAccess())"
  175. , "execution(void Parent.privateAccess())"
  176. , "ValidChildTest2"
  177. , "execution(void ValidChild.publicAccess())"
  178. , "execution(void Parent.publicAccess())"
  179. , "execution(void ValidChildTest2.defaultAccess())"
  180. , "execution(void ValidChild.defaultAccess())"
  181. , "execution(void Parent.defaultAccess())"
  182. , "execution(void ValidChildTest2.protectedAccess())"
  183. , "execution(void ValidChild.protectedAccess())"
  184. , "execution(void Parent.protectedAccess())"
  185. , "execution(void ValidChild.drivePrivateAccess())"
  186. , "execution(void ValidChild.privateAccess())"
  187. , "execution(void Parent.drivePrivateAccess())"
  188. , "execution(void Parent.privateAccess())"
  189. , "ValidChildTest3"
  190. , "execution(void ValidChild.publicAccess())"
  191. , "execution(void Parent.publicAccess())"
  192. , "execution(void ValidChild.defaultAccess())"
  193. , "execution(void Parent.defaultAccess())"
  194. , "execution(void ValidChild.protectedAccess())"
  195. , "execution(void Parent.protectedAccess())"
  196. , "execution(void ValidChild.drivePrivateAccess())"
  197. , "execution(void ValidChild.privateAccess())"
  198. , "execution(void Parent.drivePrivateAccess())"
  199. , "execution(void Parent.privateAccess())"
  200. };
  201. }