1 /*
2  * Copyright 2022 The Android Open Source Project
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 androidx.constraintlayout.compose.lint
18 
19 import androidx.compose.lint.test.bytecodeStub
20 import com.android.tools.lint.checks.infrastructure.LintDetectorTest
21 import com.android.tools.lint.detector.api.Issue
22 import org.junit.Test
23 import org.junit.runner.RunWith
24 import org.junit.runners.JUnit4
25 
26 private const val COMPOSE_CONSTRAINTLAYOUT_FILE_PATH = "androidx/constraintlayout/compose"
27 
28 @RunWith(JUnit4::class)
29 class ConstraintLayoutDslDetectorTest : LintDetectorTest() {
getDetectornull30     override fun getDetector() = ConstraintLayoutDslDetector()
31 
32     override fun getIssues(): MutableList<Issue> =
33         mutableListOf(ConstraintLayoutDslDetector.IncorrectReferencesDeclarationIssue)
34 
35     private val ConstraintSetScopeStub =
36         bytecodeStub(
37             filename = "ConstraintSetScope.kt",
38             filepath = COMPOSE_CONSTRAINTLAYOUT_FILE_PATH,
39             checksum = 0xb5f243fa,
40             source =
41                 """
42             package androidx.constraintlayout.compose
43 
44             class ConstraintSetScope {
45                 private var generatedCount = 0
46                 private fun nextId() = "androidx.constraintlayout.id" + generatedCount++
47 
48                 fun createRefsFor(vararg ids: Any): ConstrainedLayoutReferences =
49                     ConstrainedLayoutReferences(arrayOf(*ids))
50 
51                 inner class ConstrainedLayoutReferences internal constructor(
52                     private val ids: Array<Any>
53                 ) {
54                     operator fun component1(): ConstrainedLayoutReference =
55                         ConstrainedLayoutReference(ids.getOrElse(0) { nextId() })
56                     operator fun component2(): ConstrainedLayoutReference =
57                         ConstrainedLayoutReference(ids.getOrElse(1) { nextId() })
58                     operator fun component3(): ConstrainedLayoutReference =
59                         ConstrainedLayoutReference(ids.getOrElse(2) { nextId() })
60                     operator fun component4(): ConstrainedLayoutReference =
61                         ConstrainedLayoutReference(ids.getOrElse(3) { nextId() })
62                     operator fun component5(): ConstrainedLayoutReference =
63                         ConstrainedLayoutReference(ids.getOrElse(4) { nextId() })
64                     operator fun component6(): ConstrainedLayoutReference =
65                         ConstrainedLayoutReference(ids.getOrElse(5) { nextId() })
66                     operator fun component7(): ConstrainedLayoutReference =
67                         ConstrainedLayoutReference(ids.getOrElse(6) { nextId() })
68                     operator fun component8(): ConstrainedLayoutReference =
69                         ConstrainedLayoutReference(ids.getOrElse(7) { nextId() })
70                     operator fun component9(): ConstrainedLayoutReference =
71                         ConstrainedLayoutReference(ids.getOrElse(8) { nextId() })
72                     operator fun component10(): ConstrainedLayoutReference =
73                         ConstrainedLayoutReference(ids.getOrElse(9) { nextId() })
74                     operator fun component11(): ConstrainedLayoutReference =
75                         ConstrainedLayoutReference(ids.getOrElse(10) { nextId() })
76                     operator fun component12(): ConstrainedLayoutReference =
77                         ConstrainedLayoutReference(ids.getOrElse(11) { nextId() })
78                     operator fun component13(): ConstrainedLayoutReference =
79                         ConstrainedLayoutReference(ids.getOrElse(12) { nextId() })
80                     operator fun component14(): ConstrainedLayoutReference =
81                         ConstrainedLayoutReference(ids.getOrElse(13) { nextId() })
82                     operator fun component15(): ConstrainedLayoutReference =
83                         ConstrainedLayoutReference(ids.getOrElse(14) { nextId() })
84                     operator fun component16(): ConstrainedLayoutReference =
85                         ConstrainedLayoutReference(ids.getOrElse(15) { nextId() })
86                 }
87             }
88 
89             class ConstrainedLayoutReference(val id: Any)
90         """
91                     .trimIndent(),
92             """
93         META-INF/main.kotlin_module:
94         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgMudSTMxLKcrPTKnQS87PKy4pSszM
95         K8lJrMwvLQEK5BbkF6cKCfnml2Tm5wUnp+alBifnF6R6l3AJcrGnViTmFuSk
96         CrGFpBaXeJcoMWgxAACjh5JrZAAAAA==
97         """,
98             """
99         androidx/constraintlayout/compose/ConstrainedLayoutReference.class:
100         H4sIAAAAAAAA/6VRXU8TURA9d/u1rEW2lUoBxQ9QSlEWiG8giWJMNqloqOGF
101         p9vda7ntdpfs3jb41t/iL9BEo/HBND76o4xzy4oCvvkyZ87cmTNzZ378/PoN
102         wCOsMWzz0I8j6Z84XhQmKuYyVAF/G/UVBXrHUSKc3d8Pwm+MX/bFGxGL0BMF
103         MAa7wwfcCXjYdl62OsJTBWQY8tsylGqHoVJrXEzYWjlgWGxEcdvpCNXS0onD
104         wzBSXElq5uxFaq8fBFsMhvRNmAwL3UgFMnQ6g55DE4o45IHjhiqmUuklBVjU
105         yTsSXjetfcVj3hOUyLD8jwn+ijS1SJtmKqKISQtXcJUhU9M8B9tCFiWG8mWJ
106         Ikxcm4CBaYasOpIJw07jf7ZJ3821hXJ9hunayuWGDKVGuoYXQnGfK6431Btk
107         6JhMmwltwMC6FD+Rmq2T52/QnUfDomVUDcuwR0PLMLPV0XDTWGdPJ8t525gj
108         7/u7vGFn9ktnzLRGw7msmbVzWmOTaeXK2fiqKVTTi47FWlcxzO/3QyV7wg0H
109         MpGtQDz5c05az27kC4apBv16r99rifg1pxy91sjjwQGPpeZpcOmi1tktz4la
110         zagfe+K51DWzac3Bpe7YoBNlx2sp64sRLhPLExYIDcIcMQM1Ys8IDUJ7tTzx
111         BVP1zyjXVz+h8mGcuZLW5bGOOvnXT3MJZ/TeyTvVXyW/wNIGJVQxm8o7+jaE
112         ufpHVN6f00SqWTxNSDXPT/pgbO/jIeFjis5R3vwhMi5uuLjpYgG3yMVtF3dw
113         9xAswSKWDpFPMJPgXgIz0X41wewvvckEVQIEAAA=
114         """,
115             """
116         androidx/constraintlayout/compose/ConstraintSetScope$ConstrainedLayoutReferences.class:
117         H4sIAAAAAAAA/92X3VLbRhTHz8rfwoBwjOM4hjpEIcaYGBvj8BUKIdAYBKE4
118         pUnpl7AVIjAy45UZcsf0Im/QPkB70dt2pplk2pkOw2VfoG+T6ZFRQDJWxnF0
119         1QFrz65W//M7Z4+k1T9v//wbALJQIbAuKqVqRS4dpYoVhapVUVbUsviiUlNx
120         YP+gQqXUwvmJgqQWipUDiT8fkkpCffKG9EyqSkpRoh4gBLhd8VBMlUVlJ/Vo
121         e1cqqh5wEHDPyIqszhIQ4kI7bqe3hEbd6aFNAqG4xYmbQqW6k9qV1G1Nh6ZE
122         Ramooiqjcmqtoq7VyuVpAg65RL3gI9C/V1HLspLaPdxPoVupqojlVF5Rq3it
123         XMTIOgj0Fp9LxT394nWxKu5LOJHA7fhlBMNIQRPZQSg/dEIXC37oxnyoz2XK
124         jxLItZcOP/RAwAcMXMEg4pq2C3pZcEKIwJUmKfGDD8La/GsEnJpvAhtteX7f
125         +mNC2fqViqSoaQJz8aEP8XFJEPWu6+tSrJTLGEd9+earVfEFXcHC+oSAf0dS
126         BZGqeaUkHVnVQ94PN2CAhRjcJJBtJ2wP3CLQKRYxSsor0pGaLxFYbrOWhy5X
127         hx9uQ5yFQRgiMPMxOfPAMFZqk4o8q5ERFpJwh8AKL/MiP4LJe1RdLFNp5MNW
128         mr9YZh4XmuQJMDIuSNhYARkb3WQ0NxfSYzZKj5mlszZKZ83S4zZKj5ulczZK
129         58zSd22UvmuWnrBResIsPWmj9KQm3XFR8vjYFmy7f0YbxNN2iqcbxDN2imca
130         xMfsFB9rEM/aKZ5tEB+3U3y8QTxnp3j93uwR9LfiqqSKJVEV8UXJ7B86cGNH
131         tINPOwA+lvdw/EjWeliyTClNSN/JcYRlwgzLcCfHLP4zXA/LeB1nY95u7+lL
132         Z/jkOMOMkvu93pPjgJ9jIt6AM4ADo47Tn90M51z2ce4IM+p5ePqSQdtrsH0G
133         mzXYHQbbb7A7DXaXwe422JzB7jHYAYN9xWAHDXavwQ69szdCxpienP7gxLic
134         mAmXliS8RTB1sx+9cXnPeuIL+nIB3NlTCSSEZvvQQqVWLUoPpO3azuKRKuGO
135         tKKgC9ehWK5JBP4trM6vs00V2ZW6HJsoxN5ZS+xwLB1rPtvuDSG6ysSeiXt1
136         8WaRLeG5FZVNCGz6ZjqZnZhKo5GZyk6yiUUWk7hRU1R5X8orhzKVt8vS/MUu
137         HvexC5USht8toOu12v62VH0s4hwCAaFSFMubYlXW+vqgryDvKKJaq6LNN+qe
138         7+ZNDjoLqljcWxUPdAl/XlGk6kJZpFRbRPZsXZZk7Vyw2SIRuKZ72rzED2nc
139         jTvx1mQgoG3OsehK2HNj6wXgOG2Dj/0e7Ltw1AES9rZwtnY79yYD7BvgEsOv
140         IJh4DVcTyVcQ+b0u9gyPXTjJDSx0QwcEsd3BsdjZhXAdotrTAS3NAalbmnsG
141         ntev94CMrYecceCkPujHYc37jyjhwTad+AMiguMeNsG16PAb4H8B33A08yt0
142         RXNOR8418gYSMOX+C5JPr7lfQ+o3vMgBu3jkgHkLEQ+MEQ8MLnswARpvCEPU
143         qPswKTFsefzdwt877hjOG8VzLpzhgQxaWuLSeiyGtCFu1gLXaTcup+NyiMsh
144         LmfCHW8RN2eB67IbN6DjBhA3gLgBE+7dFnEnLHDdduMGddwg4gYRN2jCnWwR
145         d8oC12M3bkjHDSFuCHFDJtzpFnFnLHC9duOGddww4oYRN2zCvdci7uw57k86
146         bqaOy7VfDdeb80bQUxq/4SPIGsGv5Mg57w2c92mdt9/Am2nKO2fF2345WPBG
147         dd4o8kaRN2rinW+R974Vb/v1YMHbr/P2I28/8vabeBda5H1gxeuzmzem88aQ
148         N4a8MRPvYou8S1a8rN28AzrvAPIOIO+AifezFnkfWvF22M3L67w88vLIy5t4
149         8y3yLlvx+u3mHdR5B5F3sP5n5F1pkVew4u20mzeu88aRN460cRPvaou8a1a8
150         XXbzJnTeBPImkDdh4n3UIu+6FW+33bxJnTeJvEnkTZp4P2+J1wV7eGSxx6DC
151         d8hfBm2D/D3sY/t//egCBYM7wKA3MAGFLXDk4XEevsjDJnyJJjzJw1P4agsI
152         xY+Rr7fgKoUohW8o+OpHN4UwhT4K31J4QGGJwkMKyxQECmsU1ilkKeQoTFCY
153         ojBDYZbCHMUXnZb4LvQq4m+7rl78D9ISPcyrGgAA
154         """,
155             """
156         androidx/constraintlayout/compose/ConstraintSetScope.class:
157         H4sIAAAAAAAA/7VVXU8bRxQ9s/5kMY5xAuEjTUlME/MR1qE0bQNNC25JljpA
158         7Qo14qXD7sRZWO+inTWCN9T+gv6F/oJWaiFqpAjlsT+q6p21IcFYeUDtg2fu
159         nHvvOXdn5o7//uev1wDmUGOY454d+I69b1i+J8OAO17o8gO/GRLQ2PWlMMpn
160         jpoIa5a/K1JgDLltvscNl3t1Y21rW1hhCjGG5ILjOeEjhlhxYiODBJI64kgx
161         xMMXjmR4ULmM4DwRe2I/NG2Ga8WJylvpWhg4Xp381zuxpabj2iJIoU9HVlVw
162         41R5plN5xrHTyJEG390VHmncK16UuKjaVpjPII+rSuQaQ7YuPBHwUNhlv+mF
163         DMzMYBDXe6BhiGoomu/nGVE8owzp0G85M/gAGQXeZOizAkHUVfFcLvsBQ724
164         Wek8BarzMjs8fgYJuxIFk4oIhGcJSbtbqPhB3dgW4ZYKkQb3PD/koUNJxqof
165         rjZdl6Jiji3TKDDc3PFD1/GM7b2GQSIi8LhrmJ76IOlYMoWPGAasF8LaaSev
166         84A3BAUy3C1e/KYup0GX6y6KOu5ggmH9v/7kFKZOb3gzdFxjMQj4AaH36JJQ
167         7sHac4aJbrtvTnQBMzBQ0jGD+wyV4uU6oNtJRw32sY5pzDFc7RJBV4Zb9Dly
168         /LR7Vi4p36XnMuhVN1PD5wyJ8VZ791faJ/9UhNzmIacStMZejJ4bpoYeNYC6
169         YofwfUetSmTZtDE/nxze0bUhTddyJ4e6llZGWlcmYWrK9bfRLC2HTg5ntRJ7
170         yDJLiTe/JrWctlLIJUaSpWRVK5Evn0uN6PlkmuUpqpS+TWMU1rOSzukjWqn3
171         iVbN5mJkxX9481NW+YhVlTLLVIHV/6OLRt/jpoa4yDezQy9IvOzbguFKhdJW
172         m40tEXzPt1xC8hXf4u4GDxy1boOjVXp2nIYwvT1HOgQtvm1VhvFO71njnQvL
173         mB69YmWXS6kq02t+M7DEsqMEhtsUGxfocZ8uQzw6X029eWTFyab/ABq/pZWh
174         Tp7mxOQx0r+ToaFCYzICY3hKY6YVgB7oNOfVFWsnrxCZRvPYK2SfHeNKvv8I
175         A5N/YHhhcjT+458YHj3CjSN8+FsHb+Id3rE27y9k3SJFxWtShOIdmMqPv8Tk
176         K0w/m5yaev0Ss8f45DxZEumIbLCV0CZTVgEPyL/ajrtN8xr9Uqy1yA3jU3zW
177         ZRMenudnHZswH/HHsE6jTtg0xZrox3dR1gqqNFcJX6DYLzYRM/HIxJcmvsIi
178         mVgyUcbXm2AS32B5E30SusRjiaTEYGSMSTyRKET2LYneyDD/BWglTVUgCAAA
179         """
180         )
181 
182     private val MotionSceneScopeStub =
183         bytecodeStub(
184             filename = "MotionSceneScope.kt",
185             filepath = COMPOSE_CONSTRAINTLAYOUT_FILE_PATH,
186             checksum = 0x499473bb,
187             source =
188                 """
189             package androidx.constraintlayout.compose
190 
191             import androidx.constraintlayout.compose.ConstrainedLayoutReference
192 
193             private const val UNDEFINED_NAME_PREFIX = "androidx.constraintlayout"
194 
195             class MotionSceneScope {
196                 /**
197                  * Count of generated ConstraintSet & Transition names.
198                  */
199                 private var generatedCount = 0
200 
201                 /**
202                  * Count of generated ConstraintLayoutReference IDs.
203                  */
204                 private var generatedIdCount = 0
205 
206                 private fun nextId() = UNDEFINED_NAME_PREFIX + "id" + generatedIdCount++
207 
208                 fun createRefsFor(vararg ids: Any): ConstrainedLayoutReferences =
209                     ConstrainedLayoutReferences(arrayOf(*ids))
210 
211                 inner class ConstrainedLayoutReferences internal constructor(
212                     private val ids: Array<Any>
213                 ) {
214                     operator fun component1(): ConstrainedLayoutReference =
215                         ConstrainedLayoutReference(ids.getOrElse(0) { nextId() })
216                     operator fun component2(): ConstrainedLayoutReference =
217                         ConstrainedLayoutReference(ids.getOrElse(1) { nextId() })
218                     operator fun component3(): ConstrainedLayoutReference =
219                         ConstrainedLayoutReference(ids.getOrElse(2) { nextId() })
220                     operator fun component4(): ConstrainedLayoutReference =
221                         ConstrainedLayoutReference(ids.getOrElse(3) { nextId() })
222                     operator fun component5(): ConstrainedLayoutReference =
223                         ConstrainedLayoutReference(ids.getOrElse(4) { nextId() })
224                     operator fun component6(): ConstrainedLayoutReference =
225                         ConstrainedLayoutReference(ids.getOrElse(5) { nextId() })
226                     operator fun component7(): ConstrainedLayoutReference =
227                         ConstrainedLayoutReference(ids.getOrElse(6) { nextId() })
228                     operator fun component8(): ConstrainedLayoutReference =
229                         ConstrainedLayoutReference(ids.getOrElse(7) { nextId() })
230                     operator fun component9(): ConstrainedLayoutReference =
231                         ConstrainedLayoutReference(ids.getOrElse(8) { nextId() })
232                     operator fun component10(): ConstrainedLayoutReference =
233                         ConstrainedLayoutReference(ids.getOrElse(9) { nextId() })
234                     operator fun component11(): ConstrainedLayoutReference =
235                         ConstrainedLayoutReference(ids.getOrElse(10) { nextId() })
236                     operator fun component12(): ConstrainedLayoutReference =
237                         ConstrainedLayoutReference(ids.getOrElse(11) { nextId() })
238                     operator fun component13(): ConstrainedLayoutReference =
239                         ConstrainedLayoutReference(ids.getOrElse(12) { nextId() })
240                     operator fun component14(): ConstrainedLayoutReference =
241                         ConstrainedLayoutReference(ids.getOrElse(13) { nextId() })
242                     operator fun component15(): ConstrainedLayoutReference =
243                         ConstrainedLayoutReference(ids.getOrElse(14) { nextId() })
244                     operator fun component16(): ConstrainedLayoutReference =
245                         ConstrainedLayoutReference(ids.getOrElse(15) { nextId() })
246                 }
247             }
248         """
249                     .trimIndent(),
250             """
251         META-INF/main.kotlin_module:
252         H4sIAAAAAAAA/2NgYGBmYGBgBGJOBijgMudSTMxLKcrPTKnQS87PKy4pSszM
253         K8lJrMwvLQEK5BbkF6cKCfnml2Tm5wUnp+alBifnF6R6l3AJcrGnViTmFuSk
254         CrGFpBaXeJcoMWgxAACjh5JrZAAAAA==
255         """,
256             """
257         androidx/constraintlayout/compose/MotionSceneScope$ConstrainedLayoutReferences.class:
258         H4sIAAAAAAAA/92XS1PbVhTHz5XfwoBxgBDAAYoJYOMI+QUGkoYQKAZDKE5p
259         UvoStkIERmJ8ZYbsmC7yDdoP0C66bWeaSaad6TAsu+sXyvTIiCA5VkYhWnXA
260         0rlXV//zOw/ZV/+8+fNvAEiDQmBdkMtVRSofcyVFpmpVkGS1IjxXaipOHBwq
261         VOTWFFVS5GJJlMViSTkUowsXK8Vyob50U3wqVkW5JFIfEAKhPeFI4CqCvMs9
262         3NkTS6oPXAS8c5IsqXcJrIwVPtzp7HahUXV2fItA95jFheGCUt3l9kR1R5On
263         nCDLiipoopRbV9T1WqUyS8AllakfAgRu7itqRZK5vaMDDmnEqixUuLysVvFe
264         qYRxtRDoKj0TS/v6zRtCVTgQcSGB0bF3EQwzRU1kF6GC0AptLAShHbOhPpNo
265         dJJA+irJCEIHhAPAwDUMYUxT9kAXC27oJnCtSUKCEIAebf0NAm7NM4GNK/h9
266         X+UxmWz9PlmUVZ7AvbFxGx6sBVGvT69JSalUMIp66earVeE5XcWWGiAQ3BXV
267         gkDVvFwWj616IR+EIfiEhUEYJpD88KB9MEKgVShhjDQqi8dqvkxg+Uo9PP5u
268         VwRhFMZYuAXjBOY+Jl8+iGOHNunE8+5IsDABtwnko1JUiCYwcQ+rixUqJj6k
269         xtHLAkexxCRPgJGwFD3G2icdc5LUnFwKpxwTTpmF044Jp83CGceEM2bhrGPC
270         WbPwlGPCU2bhaceEp83COceEc5pwy2WL45fzikNPy2SDNO+cNN8gnXROOtkg
271         nXJOOtUgnXZOOt0gnXFOOtMgnXVOuv4cdhT0X7w1URXKgirgjyBzcOTCzRrR
272         DgHtAPjFu4/zx5I2wiZlyjwhkdOTXpbpYVgmdHrC4j8T6mAZv+t8zt/uP3vh
273         7jk9STKT5H6X//QkHAwxvf6wO4wTk66zn71MyL0SCHl7mUnf8tkLBm2/wQ4Y
274         bNZgtxjsoMFuNdhtBrvdYIcMdofBDhvsawa702B3GezuC3uz2xjT47Mf3BiX
275         GzPh0ZKEDwam7u5Hb0reU0/cfDWW//a+SiBWaLa7LCq1akl8IO7UdhePVRH3
276         mYqMDjxHQqUmEvi3uDa/wTbRY1frYmysOHhhLbHxQX6w2VpnN3noJjn4VNiv
277         SzeLaQmvrapsrMDyw/xEJjfDo5GcyU6ysUUWk7dZk1XpQMzLRxKVdiri/OWu
278         HHemC0oZA28voOv12sGOWH0k4BoC4YJSEipbQlXSxvpkoCjtyoJaq6IdbdR9
279         uzs3OWgtqkJpf0041CWCeVkWqwsVgVKteOx5RZYk7Vpns/IQuKF72nqHH3jc
280         X7vxkWQgrG23sdnKOPLi2Q8QCmlbdhx34NiDsy4QcbSNq7XHuGsizL6GUCz+
281         Ejpjr+B6bOIl9P5eF3uKxzZc5IXr0I6ynXjexbnB8xuhD/q1bwW0NAekbmnu
282         GXhWv98HEp595JwDF0XgJk5r3n9ECR+e+dgf0Ftw3cFT53p//DVEf4FAvD/5
283         K7T1Z92urCfxGmIw4/0LJp7c8L4C7je8yQV7eAwB8wZ6fZAiPri14sMEaLzd
284         GCIgWQTmkLMPovgZwc8F9yCum8SEeXCFD5JoaYnj9VgMaUPctAWu22nciI4b
285         QdwI4kZMuBmbuFkLXI/TuAM67gDiDiDugAl3yibutAWu12ncIR13CHGHEHfI
286         hJuziTtjgetzGndYxx1G3GHEHTbhztrEnbPA9TuNO6LjjiDuSP3PiHvHJu7d
287         t7g/6bjJOm7o6t3Q15x3FD3NYQ+MIukovv2OvuUdwnWf1nlvGniTTXnvWfFe
288         vR0seMd13nHkHdfe1k288zZ571vxXr0fLHjjOm8ceePIGzfxLtjkfWDFG3Ca
289         N6HzJpA3gbwJE++iTd4lK17WaV5O5+WQl0NezsT7mU3eZSveFqd5eZ2XR14e
290         eXkTb94m74oVb9Bp3pTOm0LeFPKmTLyrNnkLVrytTvNmdN4M8maQN2PiXbPJ
291         u27F2+Y075TOO4W8U8g7ZeJ9aJN3w4q33WnenM6bQ94c8uZMvJ/b4vXAPh5Z
292         HDGo8B3yV0DbIH8PB3j+/71ugYxhHWK4mxh6cRtceXiUhy/ysAVfogmP8/AE
293         vtoGQvE15OttuE6hn8I3FAL1o5dCD4UIhW8pPKCwRGGZwgqFAoV1ChsU0hSy
294         FKYpzFCYo3CXwj2KP3FaytvQq4Cfnbp66T9woDCJcRoAAA==
295         """,
296             """
297         androidx/constraintlayout/compose/MotionSceneScope.class:
298         H4sIAAAAAAAA/61VW08bRxT+Zm1ssxjHOOHqNCWBNuYS1qH0FmhacEtY11wK
299         KWrES4fdCVlY76KdNYI31H/Qp773F7RSC1EjRSiP/VFVz6yXJBgrUqLI0pkz
300         35z5vpkz56z//e+f5wBm8JBhmnt24Dv2oWH5ngwD7nihy4/8RkhAfd+Xwlj2
301         Q8f3NizhiQ3L3xdpMIb8Lj/ghsu9HWN1e1dYYRoJhtSc4znhfYZEaWwziw6k
302         dCSRZkiGTxzJMFN7e7lZovXEYWjaDNdKY7VXwhth4Hg7tN7fii00HNcWQRrd
303         OnJKv3iuO9Wq69gZ5EmC7+8LjyTulC4rXBaNBWazKOCq0rhGKdmhIwc8FLZp
304         V/yGFzIwM4s+9HdCwwDD9ZL5ZqYhxVRkyIR+czGLD5BV4A2GbisQRL4uHstF
305         P2AQpa1a6yPQSd8+waOV80hh16JQ0hCB8CwhKbkjNT/YMXZFuK1CpME9zw+5
306         opDGih+uNFyXohKOLTMYYbix54eu4xm7B3WDtEXgcdcwPXUd6VgyjY8Yeq0n
307         wtqLN6/xgNcFBTLcLl2+UZvXoMq6jZKOjzHGsPJ+L5zGxHlxU224xnwQ8CNC
308         71CJ0N6j1ccMY+0yb461AbMwUNYxhbsM1dK7FH+7N4466xMdk5hhuNomgoqF
309         W3QZOXreOEvvJN6m2bLoUhWp4UuGjtFmV+deFn5c9j21uAiWRchtHnI6kVY/
310         SNBHhynTqQyoPfYIP3TUrEyeTVn67ey4pGsDmq7lz451LaOcTHMkUEH5nhjO
311         0XTg7HhaK7N7rHuh48XvKS2vVUfyqaFUOb2ulWmtkM8M6YVUhhUoqtx5i2wU
312         plcz+a4hrZxd0tZz+QR5yZ9e/JJTa8RKUEcLpI43zdSh195/ixXfsEwv3Mo2
313         tUc5TlZ8WzBcqdGmlUZ9WwQP+bZLSKHmW9zd5IGj5jFYXKeHcerC9A4c6RA0
314         /6qLGUZbV1/25IWwrOnRO1dcLqU6l77hNwJLLDpKYDCm2LxEj7tULUl6Yo1+
315         c+iPvL5oTFI66T+CbI1mhqoIGjvGT5H5MwpbJpuKwDRWyGabAeiETmNB1WK8
316         uUpkGo3Dz5B7dIorhZ4T9I7/hcG58WLy578xWDzB9RN8+EcLb+E13uGY91fy
317         biIR8Zqkpnh7JwqjTzH+DJOPxicmnj/F9Ck+vUiWQm9E1tfcEJMpbwSf0fpq
318         HHeLxjV1Jdac5AfxOb5ok4R7F/lZSxJmI/4EfiCrEzZJsVX0YD3a9T02aPyR
319         8K8o9v4WEia+NvGNiXkskIuKiW/x3RaYxCIebCEnoUssSaQk5iKnT2JYwpQY
320         iaY3Jboip/o/WrVkd0EIAAA=
321         """,
322             """
323         androidx/constraintlayout/compose/MotionSceneScopeKt.class:
324         H4sIAAAAAAAA/2WQz04iQRDGvxoUEVdEFBXc7GG9M2C8eTIrJhNhdiO7xoSD
325         aYYOaRi6zUwP0RvZR9nH2IMhHvehNlYbjQle6s+vv1R91f/+/30EcILPhBOh
326         h4lRw3s/Mjq1iVDaxuLBZJbB9M6k0u8aq4zuRVLLXmTu5KVdAxHKYzETfiz0
327         yP8+GMuIaY5Q/RWety+CsH1+G55127c/rri7IVQ67/KeTZQenRJqb8sby8sL
328         WCMcdUwy8sfSDtxL6gutjRXOTOqHxoZZHPOQ7c7E2FhpvyutGAormHnTWY4v
329         JBfWXQCBJq7w+PFeuarJ1bBF+LKY54uLedErl76Wyot53WvSzdPvn09/8h5z
330         pzomN2Bn+SMaE0vY/OasC22vRZxJwuFVpq2aykDPVKoGsTx7d00o9kyWRPJC
331         xSytvUqvPwjRgoeVF9t1rCLP3YEzjwJqnPPM191VTOovcR+HnFvMi6zf6CMX
332         4FOAzQAlbAUoYztABTt9UIpdVPvwUqym2HsG4yzy1wsCAAA=
333         """
334         )
335 
336     @Test
337     fun createRefsForArgumentTest() {
338         lint()
339             .files(
340                 kotlin(
341                         """
342                     package example
343 
344                     import androidx.constraintlayout.compose.*
345 
346                     fun Test() {
347                         val scopeApplier: ConstraintSetScope.() -> Unit = {
348                             val (box, text) = createRefsFor("box", "text")
349                             val (box1, text1, image1) = createRefsFor("box", "text")
350                             val (box2, text2) = createRefsFor("box", "text", "image")
351 
352                             val ids = arrayOf("box", "text")
353                             val (box3, text3, image3) = createRefsFor(*ids)
354                         }
355                     }
356 
357                     fun Test2() {
358                         val scopeApplier: MotionSceneScope.() -> Unit = {
359                             val (box, text) = createRefsFor("box", "text")
360                             val (box1, text1, image1) = createRefsFor("box", "text")
361                             val (box2, text2) = createRefsFor("box", "text", "image")
362 
363                             val ids = arrayOf("box", "text")
364                             val (box3, text3, image3) = createRefsFor(*ids)
365                         }
366                     }
367                 """
368                     )
369                     .indented(),
370                 ConstraintSetScopeStub,
371                 MotionSceneScopeStub
372             )
373             .run()
374             .expect(
375                 """src/example/test.kt:8: Error: Arguments of createRefsFor (2) do not match assigned variables (3) [IncorrectReferencesDeclaration]
376         val (box1, text1, image1) = createRefsFor("box", "text")
377                                     ~~~~~~~~~~~~~
378 src/example/test.kt:9: Error: Arguments of createRefsFor (3) do not match assigned variables (2) [IncorrectReferencesDeclaration]
379         val (box2, text2) = createRefsFor("box", "text", "image")
380                             ~~~~~~~~~~~~~
381 src/example/test.kt:19: Error: Arguments of createRefsFor (2) do not match assigned variables (3) [IncorrectReferencesDeclaration]
382         val (box1, text1, image1) = createRefsFor("box", "text")
383                                     ~~~~~~~~~~~~~
384 src/example/test.kt:20: Error: Arguments of createRefsFor (3) do not match assigned variables (2) [IncorrectReferencesDeclaration]
385         val (box2, text2) = createRefsFor("box", "text", "image")
386                             ~~~~~~~~~~~~~
387 4 errors, 0 warnings"""
388             )
389     }
390 }
391