@@ -19,15 +19,13 @@ package com.facebook.ktfmt.cli
19
19
import com.facebook.ktfmt.format.Formatter
20
20
import com.facebook.ktfmt.format.FormattingOptions
21
21
import com.google.common.truth.Truth.assertThat
22
- import java.io.ByteArrayOutputStream
23
- import java.io.FileNotFoundException
24
- import java.io.PrintStream
25
- import kotlin.io.path.createTempDirectory
26
- import kotlin.test.assertFailsWith
27
22
import org.junit.After
28
23
import org.junit.Test
29
24
import org.junit.runner.RunWith
30
25
import org.junit.runners.JUnit4
26
+ import java.io.FileNotFoundException
27
+ import kotlin.io.path.createTempDirectory
28
+ import kotlin.test.assertFailsWith
31
29
32
30
@Suppress(" FunctionNaming" )
33
31
@RunWith(JUnit4 ::class )
@@ -41,155 +39,115 @@ class ParsedArgsTest {
41
39
}
42
40
43
41
@Test
44
- fun `files to format are returned and unknown flags are reported` () {
45
- val (parsed, out ) = parseTestOptions(" foo.kt" , " --unknown" )
46
-
47
- assertThat(parsed.fileNames).containsExactly(" foo.kt" )
48
- assertThat(out .toString()).isEqualTo(" Unexpected option: --unknown\n " )
42
+ fun `unknown flags return an error` () {
43
+ val result = ParsedArgs .parseOptions(arrayOf(" --unknown" ))
44
+ assertThat(result).isInstanceOf(ParseResult .Error ::class .java)
49
45
}
50
46
51
47
@Test
52
- fun `files to format are returned and flags starting with @ are reported` () {
53
- val (parsed, out ) = parseTestOptions(" foo.kt" , " @unknown" )
54
-
55
- assertThat(parsed.fileNames).containsExactly(" foo.kt" )
56
- assertThat(out .toString()).isEqualTo(" Unexpected option: @unknown\n " )
48
+ fun `unknown flags starting with '@' return an error` () {
49
+ val result = ParsedArgs .parseOptions(arrayOf(" @unknown" ))
50
+ assertThat(result).isInstanceOf(ParseResult .Error ::class .java)
57
51
}
58
52
59
53
@Test
60
54
fun `parseOptions uses default values when args are empty` () {
61
- val ( parsed, _) = parseTestOptions( " foo.kt" )
55
+ val parsed = assertSucceeds( ParsedArgs .parseOptions(arrayOf( " foo.kt" )) )
62
56
63
57
val formattingOptions = parsed.formattingOptions
64
- assertThat(formattingOptions.style).isEqualTo(FormattingOptions .Style .FACEBOOK )
65
- assertThat(formattingOptions.maxWidth).isEqualTo(100 )
66
- assertThat(formattingOptions.blockIndent).isEqualTo(2 )
67
- assertThat(formattingOptions.continuationIndent).isEqualTo(4 )
68
- assertThat(formattingOptions.removeUnusedImports).isTrue()
69
- assertThat(formattingOptions.debuggingPrintOpsAfterFormatting).isFalse()
70
58
71
- assertThat(parsed.dryRun).isFalse()
72
- assertThat(parsed.setExitIfChanged).isFalse()
73
- assertThat(parsed.stdinName).isNull()
59
+ val defaultFormattingOptions = FormattingOptions ()
60
+ assertThat(formattingOptions).isEqualTo(defaultFormattingOptions)
74
61
}
75
62
76
63
@Test
77
- fun `parseOptions recognizes --dropbox-style and rejects unknown flags` () {
78
- val (parsed, out ) = parseTestOptions(" --dropbox-style" , " foo.kt" , " --unknown" )
79
-
80
- assertThat(parsed.fileNames).containsExactly(" foo.kt" )
81
- assertThat(parsed.formattingOptions.blockIndent).isEqualTo(4 )
82
- assertThat(parsed.formattingOptions.continuationIndent).isEqualTo(4 )
83
- assertThat(out .toString()).isEqualTo(" Unexpected option: --unknown\n " )
64
+ fun `parseOptions recognizes --dropbox-style` () {
65
+ val parsed = assertSucceeds(ParsedArgs .parseOptions(arrayOf(" --dropbox-style" , " foo.kt" )))
66
+ assertThat(parsed.formattingOptions).isEqualTo(Formatter .DROPBOX_FORMAT )
84
67
}
85
68
86
69
@Test
87
70
fun `parseOptions recognizes --google-style` () {
88
- val ( parsed, _) = parseTestOptions( " --google-style" , " foo.kt" )
71
+ val parsed = assertSucceeds( ParsedArgs .parseOptions(arrayOf( " --google-style" , " foo.kt" )) )
89
72
assertThat(parsed.formattingOptions).isEqualTo(Formatter .GOOGLE_FORMAT )
90
73
}
91
74
92
75
@Test
93
76
fun `parseOptions recognizes --dry-run` () {
94
- val ( parsed, _) = parseTestOptions( " --dry-run" , " foo.kt" )
77
+ val parsed = assertSucceeds( ParsedArgs .parseOptions(arrayOf( " --dry-run" , " foo.kt" )) )
95
78
assertThat(parsed.dryRun).isTrue()
96
79
}
97
80
98
81
@Test
99
82
fun `parseOptions recognizes -n as --dry-run` () {
100
- val ( parsed, _) = parseTestOptions( " -n" , " foo.kt" )
83
+ val parsed = assertSucceeds( ParsedArgs .parseOptions(arrayOf( " -n" , " foo.kt" )) )
101
84
assertThat(parsed.dryRun).isTrue()
102
85
}
103
86
104
87
@Test
105
88
fun `parseOptions recognizes --set-exit-if-changed` () {
106
- val ( parsed, _) = parseTestOptions( " --set-exit-if-changed" , " foo.kt" )
89
+ val parsed = assertSucceeds( ParsedArgs .parseOptions(arrayOf( " --set-exit-if-changed" , " foo.kt" )) )
107
90
assertThat(parsed.setExitIfChanged).isTrue()
108
91
}
109
92
110
93
@Test
111
94
fun `parseOptions defaults to removing imports` () {
112
- val ( parsed, _) = parseTestOptions( " foo.kt" )
95
+ val parsed = assertSucceeds( ParsedArgs .parseOptions(arrayOf( " foo.kt" )) )
113
96
assertThat(parsed.formattingOptions.removeUnusedImports).isTrue()
114
97
}
115
98
116
99
@Test
117
100
fun `parseOptions recognizes --do-not-remove-unused-imports to removing imports` () {
118
- val (parsed, _) = parseTestOptions(" --do-not-remove-unused-imports" , " foo.kt" )
101
+ val parsed =
102
+ assertSucceeds(ParsedArgs .parseOptions(arrayOf(" --do-not-remove-unused-imports" , " foo.kt" )))
119
103
assertThat(parsed.formattingOptions.removeUnusedImports).isFalse()
120
104
}
121
105
122
106
@Test
123
- fun `parseOptions handles dropbox style and --do-not-remove-unused-imports` () {
124
- val (parsed, _) =
125
- parseTestOptions(" --do-not-remove-unused-imports" , " --dropbox-style" , " foo.kt" )
126
- assertThat(parsed.formattingOptions.removeUnusedImports).isFalse()
127
- assertThat(parsed.formattingOptions.style).isEqualTo(FormattingOptions .Style .DROPBOX )
128
- }
129
-
130
- @Test
131
- fun `parseOptions handles google style and --do-not-remove-unused-imports` () {
132
- val (parsed, _) = parseTestOptions(" --do-not-remove-unused-imports" , " --google-style" , " foo.kt" )
133
- assertThat(parsed.formattingOptions.removeUnusedImports).isFalse()
134
- assertThat(parsed.formattingOptions.style).isEqualTo(FormattingOptions .Style .GOOGLE )
135
- }
136
-
137
- @Test
138
- fun `parseOptions --stdin-name` () {
139
- val (parsed, _) = parseTestOptions(" --stdin-name=my/foo.kt" )
107
+ fun `parseOptions recognizes --stdin-name` () {
108
+ val parsed = assertSucceeds(ParsedArgs .parseOptions(arrayOf(" --stdin-name=my/foo.kt" )))
140
109
assertThat(parsed.stdinName).isEqualTo(" my/foo.kt" )
141
110
}
142
111
143
112
@Test
144
- fun `parseOptions --stdin-name with empty value` () {
145
- val ( parsed, _) = parseTestOptions( " --stdin-name=" )
113
+ fun `parseOptions accepts --stdin-name with empty value` () {
114
+ val parsed = assertSucceeds( ParsedArgs .parseOptions(arrayOf( " --stdin-name=" )) )
146
115
assertThat(parsed.stdinName).isEqualTo(" " )
147
116
}
148
117
149
- @Test
150
- fun `parseOptions --stdin-name without value` () {
151
- val (parsed, out ) = parseTestOptions(" --stdin-name" )
152
- assertThat(out ).isEqualTo(" Found option '--stdin-name', expected '--stdin-name=<value>'\n " )
153
- assertThat(parsed.stdinName).isNull()
154
- }
155
-
156
- @Test
157
- fun `parseOptions --stdin-name prefix` () {
158
- val (parsed, out ) = parseTestOptions(" --stdin-namea" )
159
- assertThat(out ).isEqualTo(" Found option '--stdin-namea', expected '--stdin-name=<value>'\n " )
160
- assertThat(parsed.stdinName).isNull()
161
- }
118
+ @Test
119
+ fun `parseOptions --stdin-name without value` () {
120
+ val parseResult = ParsedArgs .parseOptions(arrayOf(" --stdin-name" ))
121
+ assertThat(parseResult).isInstanceOf(ParseResult .Error ::class .java)
122
+ }
162
123
163
124
@Test
164
125
fun `processArgs use the @file option with non existing file` () {
165
- val out = ByteArrayOutputStream ()
166
-
167
126
val e =
168
127
assertFailsWith<FileNotFoundException > {
169
- ParsedArgs .processArgs(PrintStream ( out ), arrayOf(" @non-existing-file" ))
128
+ ParsedArgs .processArgs(arrayOf(" @non-existing-file" ))
170
129
}
171
130
assertThat(e.message).contains(" non-existing-file (No such file or directory)" )
172
131
}
173
132
174
133
@Test
175
134
fun `processArgs use the @file option with file containing arguments` () {
176
- val out = ByteArrayOutputStream ()
177
135
val file = root.resolve(" existing-file" )
178
136
file.writeText(" --google-style\n --dry-run\n --set-exit-if-changed\n File1.kt\n File2.kt\n " )
179
137
180
- val result = ParsedArgs .processArgs(PrintStream ( out ), arrayOf(" @" + file.absolutePath))
181
- assertThat(result).isInstanceOf(ArgParseResult .Ok ::class .java)
138
+ val result = ParsedArgs .processArgs(arrayOf(" @" + file.absolutePath))
139
+ assertThat(result).isInstanceOf(ParseResult .Ok ::class .java)
182
140
183
- val parsed = (result as ArgParseResult .Ok ).parsedArgs
141
+ val parsed = (result as ParseResult .Ok ).parsedValue
184
142
185
143
assertThat(parsed.formattingOptions).isEqualTo(Formatter .GOOGLE_FORMAT )
186
144
assertThat(parsed.dryRun).isTrue()
187
145
assertThat(parsed.setExitIfChanged).isTrue()
188
146
assertThat(parsed.fileNames).containsExactlyElementsIn(listOf (" File1.kt" , " File2.kt" ))
189
147
}
190
148
191
- private fun parseTestOptions ( vararg args : String ): Pair < ParsedArgs , String > {
192
- val out = ByteArrayOutputStream ( )
193
- return Pair ( ParsedArgs .parseOptions( PrintStream ( out ), arrayOf( * args)), out .toString())
149
+ private fun < V : Any > assertSucceeds ( parseResult : ParseResult < V >): V {
150
+ assertThat(parseResult).isInstanceOf( ParseResult . Ok :: class .java )
151
+ return (parseResult as ParseResult . Ok < V >).parsedValue
194
152
}
195
153
}
0 commit comments