<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