xref: /aosp_15_r20/external/dokka/core/src/test/kotlin/model/FunctionTest.kt (revision 1b2d298c530bf0473cc943e8414a5ff577a994bc)

<lambda>null1 package org.jetbrains.dokka.tests
2 
3 import org.jetbrains.dokka.Content
4 import org.jetbrains.dokka.NodeKind
5 import org.junit.Assert.assertEquals
6 import org.junit.Assert.assertTrue
7 import org.junit.Test
8 import kotlin.test.assertNotNull
9 
10 class FunctionTest {
11     @Test fun function() {
12         verifyModel("testdata/functions/function.kt") { model ->
13             with(model.members.single().members.single()) {
14                 assertEquals("fn", name)
15                 assertEquals(NodeKind.Function, kind)
16                 assertEquals("Function fn", content.summary.toTestString())
17                 assertEquals("Unit", detail(NodeKind.Type).name)
18                 assertTrue(members.none())
19                 assertTrue(links.none())
20             }
21         }
22     }
23 
24     @Test fun functionWithReceiver() {
25         verifyModel("testdata/functions/functionWithReceiver.kt") { model ->
26             with(model.members.single().members.single()) {
27                 assertEquals("kotlin.String", name)
28                 assertEquals(NodeKind.ExternalClass, kind)
29                 assertEquals(2, members.count())
30                 with(members[0]) {
31                     assertEquals("fn", name)
32                     assertEquals(NodeKind.Function, kind)
33                     assertEquals("Function with receiver", content.summary.toTestString())
34                     assertEquals("public", details.elementAt(0).name)
35                     assertEquals("final", details.elementAt(1).name)
36                     with(details.elementAt(3)) {
37                         assertEquals("<this>", name)
38                         assertEquals(NodeKind.Receiver, kind)
39                         assertEquals(Content.Empty, content)
40                         assertEquals("String", details.single().name)
41                         assertTrue(members.none())
42                         assertTrue(links.none())
43                     }
44                     assertEquals("Unit", details.elementAt(4).name)
45                     assertTrue(members.none())
46                     assertTrue(links.none())
47                 }
48                 with(members[1]) {
49                     assertEquals("fn", name)
50                     assertEquals(NodeKind.Function, kind)
51                 }
52             }
53         }
54     }
55 
56     @Test fun genericFunction() {
57         verifyModel("testdata/functions/genericFunction.kt") { model ->
58             with(model.members.single().members.single()) {
59                 assertEquals("generic", name)
60                 assertEquals(NodeKind.Function, kind)
61                 assertEquals("generic function", content.summary.toTestString())
62 
63                 assertEquals("private", details.elementAt(0).name)
64                 assertEquals("final", details.elementAt(1).name)
65                 with(details.elementAt(3)) {
66                     assertEquals("T", name)
67                     assertEquals(NodeKind.TypeParameter, kind)
68                     assertEquals(Content.Empty, content)
69                     assertTrue(details.none())
70                     assertTrue(members.none())
71                     assertTrue(links.none())
72                 }
73                 assertEquals("Unit", details.elementAt(4).name)
74 
75                 assertTrue(members.none())
76                 assertTrue(links.none())
77             }
78         }
79     }
80     @Test fun genericFunctionWithConstraints() {
81         verifyModel("testdata/functions/genericFunctionWithConstraints.kt") { model ->
82             with(model.members.single().members.single()) {
83                 assertEquals("generic", name)
84                 assertEquals(NodeKind.Function, kind)
85                 assertEquals("generic function", content.summary.toTestString())
86 
87                 val functionDetails = details
88                 assertEquals("public", functionDetails.elementAt(0).name)
89                 assertEquals("final", functionDetails.elementAt(1).name)
90                 with(functionDetails.elementAt(3)) {
91                     assertEquals("T", name)
92                     assertEquals(NodeKind.TypeParameter, kind)
93                     assertEquals(Content.Empty, content)
94                     with(details.single()) {
95                         assertEquals("R", name)
96                         assertEquals(NodeKind.UpperBound, kind)
97                         assertEquals(Content.Empty, content)
98                         assertTrue(details.none())
99                         assertTrue(members.none())
100                         assertTrue(links.singleOrNull() == functionDetails.elementAt(4))
101                     }
102                     assertTrue(members.none())
103                     assertTrue(links.none())
104                 }
105                 with(functionDetails.elementAt(4)) {
106                     assertEquals("R", name)
107                     assertEquals(NodeKind.TypeParameter, kind)
108                     assertEquals(Content.Empty, content)
109                     assertTrue(members.none())
110                     assertTrue(links.none())
111                 }
112                 assertEquals("Unit", functionDetails.elementAt(5).name)
113 
114                 assertTrue(members.none())
115                 assertTrue(links.none())
116             }
117         }
118     }
119 
120     @Test fun functionWithParams() {
121         verifyModel("testdata/functions/functionWithParams.kt") { model ->
122             with(model.members.single().members.single()) {
123                 assertEquals("function", name)
124                 assertEquals(NodeKind.Function, kind)
125                 assertEquals("Multiline", content.summary.toTestString())
126                 assertEquals("""Function
127 Documentation""", content.description.toTestString())
128 
129                 assertEquals("public", details.elementAt(0).name)
130                 assertEquals("final", details.elementAt(1).name)
131                 with(details.elementAt(3)) {
132                     assertEquals("x", name)
133                     assertEquals(NodeKind.Parameter, kind)
134                     assertEquals("parameter", content.summary.toTestString())
135                     assertEquals("Int", detail(NodeKind.Type).name)
136                     assertTrue(members.none())
137                     assertTrue(links.none())
138                 }
139                 assertEquals("Unit", details.elementAt(4).name)
140                 assertTrue(members.none())
141                 assertTrue(links.none())
142             }
143         }
144     }
145 
146     @Test fun annotatedFunction() {
147         verifyPackageMember("testdata/functions/annotatedFunction.kt", withKotlinRuntime = true) { func ->
148             assertEquals(1, func.annotations.count())
149             with(func.annotations[0]) {
150                 assertEquals("Strictfp", name)
151                 assertEquals(Content.Empty, content)
152                 assertEquals(NodeKind.Annotation, kind)
153             }
154         }
155     }
156 
157     @Test fun functionWithNotDocumentedAnnotation() {
158         verifyPackageMember("testdata/functions/functionWithNotDocumentedAnnotation.kt") { func ->
159             assertEquals(0, func.annotations.count())
160         }
161     }
162 
163     @Test fun inlineFunction() {
164         verifyPackageMember("testdata/functions/inlineFunction.kt") { func ->
165             val modifiers = func.details(NodeKind.Modifier).map { it.name }
166             assertTrue("inline" in modifiers)
167         }
168     }
169 
170     @Test fun functionWithAnnotatedParam() {
171         verifyModel("testdata/functions/functionWithAnnotatedParam.kt") { model ->
172             with(model.members.single().members.single { it.name == "function" }) {
173                 with(details(NodeKind.Parameter).first()) {
174                     assertEquals(1, annotations.count())
175                     with(annotations[0]) {
176                         assertEquals("Fancy", name)
177                         assertEquals(Content.Empty, content)
178                         assertEquals(NodeKind.Annotation, kind)
179                     }
180                 }
181             }
182         }
183     }
184 
185     @Test fun functionWithNoinlineParam() {
186         verifyPackageMember("testdata/functions/functionWithNoinlineParam.kt") { func ->
187             with(func.details(NodeKind.Parameter).first()) {
188                 val modifiers = details(NodeKind.Modifier).map { it.name }
189                 assertTrue("noinline" in modifiers)
190             }
191         }
192     }
193 
194     @Test fun annotatedFunctionWithAnnotationParameters() {
195         verifyModel("testdata/functions/annotatedFunctionWithAnnotationParameters.kt") { model ->
196             with(model.members.single().members.single { it.name == "f" }) {
197                 assertEquals(1, annotations.count())
198                 with(annotations[0]) {
199                     assertEquals("Fancy", name)
200                     assertEquals(Content.Empty, content)
201                     assertEquals(NodeKind.Annotation, kind)
202                     assertEquals(1, details.count())
203                     with(details[0]) {
204                         assertEquals(NodeKind.Parameter, kind)
205                         assertEquals(1, details.count())
206                         with(details[0]) {
207                             assertEquals(NodeKind.Value, kind)
208                             assertEquals("1", name)
209                         }
210                     }
211                 }
212             }
213         }
214     }
215 
216     @Test fun functionWithDefaultParameter() {
217         verifyModel("testdata/functions/functionWithDefaultParameter.kt") { model ->
218             with(model.members.single().members.single()) {
219                 with(details.elementAt(3)) {
220                     val value = details(NodeKind.Value)
221                     assertEquals(1, value.count())
222                     with(value[0]) {
223                         assertEquals("\"\"", name)
224                     }
225                 }
226             }
227         }
228     }
229 
230     @Test fun sinceKotlin() {
231         verifyModel("testdata/functions/sinceKotlin.kt") { model ->
232             with(model.members.single().members.single()) {
233                 assertEquals(listOf("Kotlin 1.1"), platforms)
234             }
235         }
236     }
237 
238     // Test for b/159470920, to ensure that we correctly parse annotated function types without resolving 'ERROR CLASS'
239     // types. Note that the actual annotation is not included in the type information, this is tracked in b/145517104.
240     @Test fun functionWithAnnotatedLambdaParam() {
241         verifyModel("testdata/functions/functionWithAnnotatedLambdaParam.kt") { model ->
242             with(model.members.single().members.single { it.name == "function" }) {
243                 with(details(NodeKind.Parameter).first()) {
244                     with(details(NodeKind.Type).first()) {
245                         assertEquals("Function0", name)
246                     }
247                 }
248             }
249         }
250     }
251 }
252