GROOVY-8474: 'Unexpected super property set for:' when accessing super class property...
[groovy.git] / src / test / groovy / bugs / Groovy8474Bug.groovy
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one
3  *  or more contributor license agreements.  See the NOTICE file
4  *  distributed with this work for additional information
5  *  regarding copyright ownership.  The ASF licenses this file
6  *  to you under the Apache License, Version 2.0 (the
7  *  "License"); you may not use this file except in compliance
8  *  with the License.  You may obtain a copy of the License at
9  *
10  *    http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing,
13  *  software distributed under the License is distributed on an
14  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  *  KIND, either express or implied.  See the License for the
16  *  specific language governing permissions and limitations
17  *  under the License.
18  */
19 package groovy.bugs
20
21 class Groovy8474Bug extends GroovyTestCase {
22     void testSettingSuperProperty() {
23         assertScript '''
24             class T {
25               String group
26             }
27             
28             class S extends T {
29               S() {
30                 super.group = 'Hello'
31               }
32             }
33             
34             assert 'Hello' == new S().group
35         '''
36     }
37
38     void testSettingSuperProperty2() {
39         assertScript '''
40             class T {
41               String group
42               String group2
43               String group3
44             }
45             
46             class S extends T {
47               S() {
48                 super.group = 'Hello'
49                 super.group2 = 'Hello2'
50                 super.group3 = 'Hello3'
51               }
52             }
53             
54             assert 'Hello' == new S().group
55             assert 'Hello2' == new S().group2
56             assert 'Hello3' == new S().group3
57         '''
58     }
59
60     void testSettingSuperProperty3() {
61         assertScript '''
62             class K {
63                 String group
64             }
65             class T extends K {
66               
67             }
68             class S extends T {
69               S() {
70                 super.group = 'Hello'
71               }
72             }
73             
74             assert 'Hello' == new S().group
75         '''
76     }
77
78     void testSettingSuperProtectedField() {
79         assertScript '''
80             class T {
81               protected String group
82             }
83             
84             class S extends T {
85               S() {
86                 super.group = 'Hello'
87               }
88             }
89             
90             assert 'Hello' == new S().group
91         '''
92     }
93
94     void testSettingSuperProtectedField2() {
95         assertScript '''
96             class T {
97               protected String group
98               protected String group2
99               protected String group3
100             }
101             
102             class S extends T {
103               S() {
104                 super.group = 'Hello'
105                 super.group2 = 'Hello2'
106                 super.group3 = 'Hello3'
107               }
108             }
109             
110             assert 'Hello' == new S().group
111             assert 'Hello2' == new S().group2
112             assert 'Hello3' == new S().group3
113         '''
114     }
115
116     void testSettingSuperProtectedField3() {
117         assertScript '''
118             class K {
119                 protected String group
120             }
121             class T extends K {
122               
123             }
124             
125             class S extends T {
126               S() {
127                 super.group = 'Hello'
128               }
129             }
130             
131             assert 'Hello' == new S().group
132         '''
133     }
134
135     void testSettingSuperPublicField() {
136         assertScript '''
137             class T {
138               public String group
139             }
140             
141             class S extends T {
142               S() {
143                 super.group = 'Hello'
144               }
145             }
146             
147             assert 'Hello' == new S().group
148         '''
149     }
150
151     void testSettingSuperPublicField2() {
152         assertScript '''
153             class T {
154               public String group
155               public String group2
156               public String group3
157             }
158             
159             class S extends T {
160               S() {
161                 super.group = 'Hello'
162                 super.group2 = 'Hello2'
163                 super.group3 = 'Hello3'
164               }
165             }
166             
167             assert 'Hello' == new S().group
168             assert 'Hello2' == new S().group2
169             assert 'Hello3' == new S().group3
170         '''
171     }
172
173     void testSettingSuperPublicField3() {
174         assertScript '''
175             class K {
176                 public String group
177             }
178             class T extends K {
179               
180             }
181             
182             class S extends T {
183               S() {
184                 super.group = 'Hello'
185               }
186             }
187             
188             assert 'Hello' == new S().group
189         '''
190     }
191
192     void testSettingSuperPrivateProperty() {
193         def errMsg = shouldFail '''
194             class T {
195               private String group
196             }
197             
198             class S extends T {
199               S() {
200                 super.group = 'Hello'
201               }
202             }
203         '''
204         assert errMsg.contains('Can not access private field')
205     }
206
207     void testSettingSuperFinalProperty() {
208         shouldFail '''
209             class T {
210               protected final String group = 'Hi'
211             }
212             
213             class S extends T {
214               S() {
215                 super.group = 'Hello'
216               }
217             }
218         '''
219     }
220 }