1
+ package kotlinx.benchmark.integration
2
+
3
+ import java.io.*
4
+ import kotlin.test.*
5
+
6
+ class OptionsValidationTest : GradleTest () {
7
+
8
+ @Test
9
+ fun testReportFormatValidation () {
10
+ val runner = project(" kotlin-multiplatform" ) {
11
+ configuration(" invalidReportFormat" ) {
12
+ iterations = 1
13
+ iterationTime = 100
14
+ iterationTimeUnit = " ms"
15
+ reportFormat = " htmll"
16
+ }
17
+ }
18
+
19
+ runner.runAndFail(" invalidReportFormatBenchmark" ) {
20
+ assertOutputContains(" Invalid report format: 'htmll'. Accepted formats: json, csv, scsv, text (e.g., reportFormat = 'json')." )
21
+ }
22
+ }
23
+
24
+ @Test
25
+ fun testIterationsValidation () {
26
+ val runner = project(" kotlin-multiplatform" ) {
27
+ configuration(" zeroIterations" ) {
28
+ iterations = 0
29
+ iterationTime = 100
30
+ iterationTimeUnit = " ms"
31
+ }
32
+ }
33
+
34
+ runner.runAndFail(" zeroIterationsBenchmark" ) {
35
+ assertOutputContains(" Invalid iterations: '0'. Expected a positive integer (e.g., iterations = 5)." )
36
+ }
37
+ }
38
+
39
+ @Test
40
+ fun testWarmupsValidation () {
41
+ val runner = project(" kotlin-multiplatform" ) {
42
+ configuration(" negativeWarmups" ) {
43
+ iterations = 1
44
+ warmups = - 1
45
+ iterationTime = 100
46
+ iterationTimeUnit = " ms"
47
+ }
48
+ }
49
+
50
+ runner.runAndFail(" negativeWarmupsBenchmark" ) {
51
+ assertOutputContains(" Invalid warmups: '-1'. Expected a non-negative integer (e.g., warmups = 3)." )
52
+ }
53
+ }
54
+
55
+ @Test
56
+ fun testIterationTimeValidation () {
57
+ val runner = project(" kotlin-multiplatform" ) {
58
+ configuration(" zeroIterationTime" ) {
59
+ iterations = 1
60
+ iterationTime = 0
61
+ iterationTimeUnit = " ms"
62
+ }
63
+ }
64
+
65
+ runner.runAndFail(" zeroIterationTimeBenchmark" ) {
66
+ assertOutputContains(" Invalid iterationTime: '0'. Expected a positive number (e.g., iterationTime = 300)." )
67
+ }
68
+ }
69
+
70
+ @Test
71
+ fun testIterationTimeUnitValidation () {
72
+ val runner = project(" kotlin-multiplatform" ) {
73
+ configuration(" invalidIterationTimeUnit" ) {
74
+ iterations = 1
75
+ iterationTime = 100
76
+ iterationTimeUnit = " x"
77
+ }
78
+ }
79
+
80
+ runner.runAndFail(" invalidIterationTimeUnitBenchmark" ) {
81
+ assertOutputContains(" Invalid iterationTimeUnit: 'x'. Accepted units: seconds, s, microseconds, us, milliseconds, ms, nanoseconds, ns, minutes, m (e.g., iterationTimeUnit = 'ms')." )
82
+ }
83
+ }
84
+
85
+ @Test
86
+ fun testModeValidation () {
87
+ val runner = project(" kotlin-multiplatform" ) {
88
+ configuration(" invalidMode" ) {
89
+ iterations = 1
90
+ iterationTime = 100
91
+ iterationTimeUnit = " ms"
92
+ mode = " x"
93
+ }
94
+ }
95
+
96
+ runner.runAndFail(" invalidModeBenchmark" ) {
97
+ assertOutputContains(" Invalid benchmark mode: 'x'. Accepted modes: thrpt, avgt (e.g., mode = 'thrpt')." )
98
+ }
99
+ }
100
+
101
+ @Test
102
+ fun testOutputTimeUnitValidation () {
103
+ val runner = project(" kotlin-multiplatform" ) {
104
+ configuration(" invalidOutputTimeUnit" ) {
105
+ iterations = 1
106
+ iterationTime = 100
107
+ iterationTimeUnit = " ms"
108
+ outputTimeUnit = " x"
109
+ }
110
+ }
111
+
112
+ runner.runAndFail(" invalidOutputTimeUnitBenchmark" ) {
113
+ assertOutputContains(" Invalid outputTimeUnit: 'x'. Accepted units: seconds, s, microseconds, us, milliseconds, ms, nanoseconds, ns, minutes, m (e.g., outputTimeUnit = 'ns')." )
114
+ }
115
+ }
116
+
117
+ @Test
118
+ fun testIncludesValidation () {
119
+ val runner = project(" kotlin-multiplatform" ) {
120
+ configuration(" blankIncludePattern" ) {
121
+ iterations = 1
122
+ iterationTime = 100
123
+ iterationTimeUnit = " ms"
124
+ include(" " )
125
+ }
126
+ }
127
+
128
+ runner.runAndFail(" blankIncludePatternBenchmark" ) {
129
+ assertOutputContains(" Invalid include pattern: ' '. Pattern must not be blank." )
130
+ }
131
+ }
132
+
133
+ @Test
134
+ fun testExcludesValidation () {
135
+ val runner = project(" kotlin-multiplatform" ) {
136
+ configuration(" blankExcludePattern" ) {
137
+ iterations = 1
138
+ iterationTime = 100
139
+ iterationTimeUnit = " ms"
140
+ exclude(" " )
141
+ }
142
+ }
143
+
144
+ runner.runAndFail(" blankExcludePatternBenchmark" ) {
145
+ assertOutputContains(" Invalid exclude pattern: ' '. Pattern must not be blank." )
146
+ }
147
+ }
148
+
149
+ @Test
150
+ fun testParamsValidation () {
151
+ val runner = project(" kotlin-multiplatform" ) {
152
+ configuration(" blankParamName" ) {
153
+ iterations = 1
154
+ iterationTime = 100
155
+ iterationTimeUnit = " ms"
156
+ param(" " , 5 )
157
+ }
158
+ }
159
+
160
+ runner.runAndFail(" blankParamNameBenchmark" ) {
161
+ assertOutputContains(" Invalid param name: ' '. It must not be blank." )
162
+ }
163
+ }
164
+
165
+ @Test
166
+ fun testAdvancedValidation () {
167
+ val runner = project(" kotlin-multiplatform" ) {
168
+ configuration(" blankAdvancedConfigName" ) {
169
+ iterations = 1
170
+ iterationTime = 100
171
+ iterationTimeUnit = " ms"
172
+ advanced(" " , " value" )
173
+ }
174
+
175
+ configuration(" invalidNativeFork" ) {
176
+ iterations = 1
177
+ iterationTime = 100
178
+ iterationTimeUnit = " ms"
179
+ advanced(" nativeFork" , " x" )
180
+ }
181
+
182
+ configuration(" invalidNativeGCAfterIteration" ) {
183
+ iterations = 1
184
+ iterationTime = 100
185
+ iterationTimeUnit = " ms"
186
+ advanced(" nativeGCAfterIteration" , " x" )
187
+ }
188
+
189
+ configuration(" invalidJvmForks" ) {
190
+ iterations = 1
191
+ iterationTime = 100
192
+ iterationTimeUnit = " ms"
193
+ advanced(" jvmForks" , " -1" )
194
+ }
195
+
196
+ configuration(" invalidJsUseBridge" ) {
197
+ iterations = 1
198
+ iterationTime = 100
199
+ iterationTimeUnit = " ms"
200
+ advanced(" jsUseBridge" , " x" )
201
+ }
202
+ }
203
+
204
+ runner.runAndFail(" blankAdvancedConfigNameBenchmark" ) {
205
+ assertOutputContains(" Invalid advanced config name: ' '. It must not be blank." )
206
+ }
207
+ runner.runAndFail(" invalidNativeForkBenchmark" ) {
208
+ assertOutputContains(" Invalid value 'x' for 'nativeFork'. Accepted values: 'perBenchmark', 'perIteration' (e.g., nativeFork = 'perBenchmark')." )
209
+ }
210
+ runner.runAndFail(" invalidNativeGCAfterIterationBenchmark" ) {
211
+ assertOutputContains(" Invalid value 'x' for 'nativeGCAfterIteration'. Expected a boolean value (e.g., nativeGCAfterIteration = true)." )
212
+ }
213
+ runner.runAndFail(" invalidJvmForksBenchmark" ) {
214
+ assertOutputContains(" Invalid value '-1' for 'jvmForks'. Expected a non-negative integer or 'definedByJmh' (e.g., jvmForks = 2 or jvmForks = 'definedByJmh')." )
215
+ }
216
+ runner.runAndFail(" invalidJsUseBridgeBenchmark" ) {
217
+ assertOutputContains(" Invalid value 'x' for 'jsUseBridge'. Expected a boolean value (e.g., jsUseBridge = true)." )
218
+ }
219
+ }
220
+ }
0 commit comments