41199283e649b4eb4117859451220e46e294e2cc
[idea/community.git] / plugins / groovy / test / org / jetbrains / plugins / groovy / lang / resolve / TupleConstructorTest.groovy
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package org.jetbrains.plugins.groovy.lang.resolve
3
4
5 import groovy.transform.CompileStatic
6 import org.jetbrains.plugins.groovy.util.GroovyLatestTest
7 import org.jetbrains.plugins.groovy.util.HighlightingTest
8 import org.junit.Test
9
10 @CompileStatic
11 class TupleConstructorTest extends GroovyLatestTest implements HighlightingTest {
12
13   @Test
14   void 'many constructors'() {
15     highlightingTest """
16 @groovy.transform.TupleConstructor
17 class Rr {
18     String actionType = ""
19     long referrerCode;
20     String referrerUrl;
21 }
22
23 @groovy.transform.CompileStatic
24 static void main(String[] args) {
25     new Rr("")
26     new Rr("", 1)
27     new Rr("", 1, "groovy")
28 }
29 """
30   }
31
32   @Test
33   void 'many constructors with excludes'() {
34     highlightingTest """
35 @groovy.transform.TupleConstructor(excludes = ['actionType'])
36 class Rr {
37     String actionType = ""
38     long referrerCode;
39     String referrerUrl;
40 }
41
42 @groovy.transform.CompileStatic
43 static void main(String[] args) {
44     new Rr()
45     new Rr(1)
46     new Rr(1, "groovy")
47 }
48 """
49   }
50
51   @Test
52   void 'many constructors with includes'() {
53     highlightingTest """
54 @groovy.transform.TupleConstructor(includes = ['actionType', 'referrerUrl'])
55 class Rr {
56     String actionType = ""
57     long referrerCode;
58     String referrerUrl;
59 }
60
61 @groovy.transform.CompileStatic
62 static void main(String[] args) {
63     new Rr()
64     new Rr("")
65     new Rr("a", "groovy")
66 }
67 """
68   }
69
70
71   @Test
72   void 'many constructors with raw includes'() {
73     highlightingTest """
74 @groovy.transform.TupleConstructor(includes = 'actionType,  referrerUrl ')
75 class Rr {
76     String actionType = ""
77     long referrerCode;
78     String referrerUrl;
79 }
80
81 @groovy.transform.CompileStatic
82 static void main(String[] args) {
83     new Rr()
84     new Rr("")
85     new Rr("a", "groovy")
86 }
87 """
88   }
89
90   @Test
91   void 'includes induces order of parameters'() {
92     highlightingTest """
93 @groovy.transform.TupleConstructor(includes = 'referrerUrl, actionType ')
94 class Rr {
95     String actionType = ""
96     long referrerCode;
97     boolean referrerUrl;
98 }
99
100 @groovy.transform.CompileStatic
101 static void main(String[] args) {
102     new Rr(true, "groovy")
103 }
104 """
105   }
106
107   @Test
108   void 'internal names are not among parameters'() {
109     highlightingTest """
110 @groovy.transform.TupleConstructor()
111 class Rr {
112     String \$actionType = ""
113 }
114
115 @groovy.transform.CompileStatic
116 static void main(String[] args) {
117     new Rr<error>("")</error>
118 }
119 """
120   }
121
122   @Test
123   void 'include internal names'() {
124     highlightingTest """
125 @groovy.transform.TupleConstructor(allNames = true)
126 class Rr {
127     String \$actionType = ""
128 }
129
130 @groovy.transform.CompileStatic
131 static void main(String[] args) {
132     new Rr("")
133 }
134 """
135   }
136
137   @Test
138   void 'includes does not affect internal name'() {
139     highlightingTest """
140 @groovy.transform.TupleConstructor(includes = "\$actionType")
141 class Rr {
142     String \$actionType = ""
143 }
144
145 @groovy.transform.CompileStatic
146 static void main(String[] args) {
147     new Rr<error>("")</error>
148 }
149 """
150   }
151
152   @Test
153   void 'defaults removes additional constructors'() {
154     highlightingTest """
155 @groovy.transform.TupleConstructor(defaults = false)
156 class Rr {
157     String actionType
158     long referrerCode;
159     boolean referrerUrl;
160 }
161
162 @groovy.transform.CompileStatic
163 static void main(String[] args) {
164     new Rr<error>("")</error>
165     new Rr<error>("", 1)</error>
166     new Rr("", 1, true)
167     new Rr<error>(actionType: "a", referrerUrl: true, referrerCode: 1)</error>
168 }
169 """
170   }
171
172   @Test
173   void 'defaults with superclass'() {
174     highlightingTest """
175 class NN {
176     String top
177 }
178
179 @groovy.transform.TupleConstructor(defaults = false, includeSuperProperties = true)
180 class Rr extends NN {
181     String actionType = ""
182     long referrerCode;
183     boolean referrerUrl;
184 }
185
186 @groovy.transform.CompileStatic
187 static void main(String[] args) {
188     new Rr<error>("")</error>
189     new Rr<error>("", 1)</error>
190     new Rr<error>("", 1, true)</error>
191     new Rr("", "", 1, true)
192     new Rr<error>(actionType: "a", referrerUrl: true, referrerCode: 1)</error>
193 }"""
194   }
195
196   @Test
197   void 'allProperties enable JavaBean support'() {
198     highlightingTest """
199 @groovy.transform.TupleConstructor(allProperties = true)
200 class Rr {
201     Closure actionType
202     long referrerCode;
203
204     void setProp(String s) {
205
206     }
207     
208     private int referrerId;
209
210     boolean referrerUrl;
211 }
212
213 @groovy.transform.CompileStatic
214 static void main(String[] args) {
215     new Rr({})
216     new Rr({}, 1)
217     new Rr({}, 1, true)
218     new Rr({}, 1, true, "")
219     new Rr(actionType: {}, referrerUrl: true, referrerCode: 1)
220 }"""
221   }
222
223   @Test
224   void 'allProperties do not affect superclasses'() {
225     highlightingTest """
226 @groovy.transform.TupleConstructor(allProperties = true, includeFields = true)
227 class NN {
228     public int r
229     String s
230     void setMp(boolean t) {
231
232     }
233 }
234
235 @groovy.transform.TupleConstructor(allProperties = true, includeSuperFields = true, includeSuperProperties = true)
236 class Rr extends NN {
237     Closure actionType
238 }
239
240 @groovy.transform.CompileStatic
241 static void main(String[] args) {
242     new Rr("", 1, {})
243     new Rr<error>(1, true, "", {})</error>
244 }"""
245   }
246
247   @Test
248   void 'closures in annotation have access to class members'() {
249     highlightingTest """
250 @groovy.transform.CompileStatic
251 @groovy.transform.TupleConstructor(pre = { foo() }, post = { q == 1 })
252 class Rr {
253     int q
254     
255     def foo() {}
256 }"""
257   }
258
259   @Test
260   void 'simultaneous includes and excludes'() {
261     highlightingTest """
262 @groovy.transform.TupleConstructor(<error>includes = "a"</error>, <error>excludes = ['b']</error>)
263 class Rr {}
264 """
265   }
266
267   @Test
268   void 'empty excludes'() {
269     highlightingTest """
270 @groovy.transform.TupleConstructor(includes = "a", excludes = [])
271 class Rr {}
272 """
273   }
274
275   @Test
276   void 'wrong expressions at pre and post'() {
277     highlightingTest """
278 @groovy.transform.TupleConstructor(pre = <error>Integer</error>, post = <error>String</error>)
279 class Rr {}
280 """
281   }
282
283   @Test
284   void 'forbidden initializer'() {
285     highlightingTest """
286 @groovy.transform.TupleConstructor(defaults = false, includes = ['a', 'b'])
287 class Rr {
288   String a = <error>""</error>
289   int b = <error>1000</error>
290   boolean c = true
291 }
292 """
293   }
294
295   @Test
296   void 'test visibility options'() {
297     fixture.addFileToProject 'other.groovy', """
298 @groovy.transform.CompileStatic
299 @groovy.transform.TupleConstructor(defaults = false)
300 @groovy.transform.VisibilityOptions(constructor = Visibility.PRIVATE)
301 class Cde {
302     String actionType
303     long referrerCode
304     boolean referrerUrl
305 }"""
306     highlightingTest """
307 class X {
308
309     @groovy.transform.CompileStatic
310     static void main(String[] args) {
311         def x = new <error>Cde</error>("mem", 1, true)
312     }
313
314 }"""
315   }
316
317   @Test
318   void 'test visibility options with value'() {
319     fixture.addFileToProject 'other.groovy', """
320 @groovy.transform.CompileStatic
321 @groovy.transform.TupleConstructor(defaults = false)
322 @groovy.transform.VisibilityOptions(Visibility.PRIVATE)
323 class Cde {
324     String actionType
325     long referrerCode
326     boolean referrerUrl
327 }"""
328     highlightingTest """
329 class X {
330
331     @groovy.transform.CompileStatic
332     static void main(String[] args) {
333         def x = new <error>Cde</error>("mem", 1, true)
334     }
335
336 }"""
337   }
338 }