/
ForbiddenPublicDataClassSpec.kt
182 lines (141 loc) · 4.78 KB
/
ForbiddenPublicDataClassSpec.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
package io.gitlab.arturbosch.detekt.libraries
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.test.TestConfig
import io.gitlab.arturbosch.detekt.test.compileAndLint
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
class ForbiddenPublicDataClassSpec {
val subject = ForbiddenPublicDataClass()
@Test
fun `public data class should pass without explicit filters set`() {
val code = """
data class C(val a: String)
""".trimIndent()
assertThat(ForbiddenPublicDataClass(TestConfig(Config.EXCLUDES_KEY to "**")).compileAndLint(code)).isEmpty()
}
@Test
fun `public data class should fail`() {
val code = """
data class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).hasSize(1)
}
@Test
fun `private data class should pass`() {
val code = """
private data class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).isEmpty()
}
@Test
fun `internal data class should pass`() {
val code = """
internal data class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).isEmpty()
}
@Test
fun `public class should pass`() {
val code = """
class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).isEmpty()
}
@Test
fun `private data class inside a public class should pass`() {
val code = """
class C {
private data class D(val a: String)
}
""".trimIndent()
assertThat(subject.compileAndLint(code)).isEmpty()
}
@Test
fun `public data class inside a public class should fail`() {
val code = """
class C {
data class D(val a: String)
}
""".trimIndent()
assertThat(subject.compileAndLint(code)).hasSize(1)
}
@Test
fun `protected data class inside a public class should fail`() {
val code = """
open class C {
protected data class D(val a: String)
}
""".trimIndent()
assertThat(subject.compileAndLint(code)).hasSize(1)
}
@Test
fun `public data class inside an internal class should pass`() {
val code = """
internal class C {
data class D(val a: String)
}
""".trimIndent()
assertThat(subject.compileAndLint(code)).isEmpty()
}
@Test
fun `public data class inside an internal package should pass`() {
val code = """
package com.example.internal
data class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).isEmpty()
}
@Test
fun `public data class inside an internal subpackage should pass`() {
val code = """
package com.example.internal.other
data class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).isEmpty()
}
@Test
fun `public data class inside an internalise package should fail`() {
val code = """
package com.example.internalise
data class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).hasSize(1)
}
@Test
fun `public data class inside a random package should fail`() {
val code = """
package com.random
data class C(val a: String)
""".trimIndent()
assertThat(subject.compileAndLint(code)).hasSize(1)
}
@Test
fun `public data class inside an ignored package should pass`() {
val code = """
package com.example
data class C(val a: String)
""".trimIndent()
val config = TestConfig("ignorePackages" to listOf("*.hello", "com.example"))
assertThat(ForbiddenPublicDataClass(config).compileAndLint(code)).isEmpty()
}
@Test
fun `public data class inside an ignored package should pass config as string`() {
val code = """
package org.example
data class C(val a: String)
""".trimIndent()
val config = TestConfig("ignorePackages" to "*.hello,org.example")
assertThat(ForbiddenPublicDataClass(config).compileAndLint(code)).isEmpty()
}
}
data class Ca(val a: String)
/**
* Set the [iii] parameter
*/
open class C1 {
private val iii = 0
protected data class D(val a: String)
fun printI(i: Int) {
printI(iii + i)
}
}