Skip to content

Commit cb82cdd

Browse files
committed
test: tighten cobra-like output contracts (v2)
1 parent 8f1b0e8 commit cb82cdd

File tree

2 files changed

+40
-20
lines changed

2 files changed

+40
-20
lines changed

CMakeLists.txt

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -151,37 +151,47 @@ Usage: app print \[flags\]\r?
151151
]==])
152152

153153
add_test(NAME basic_no_args_prints_help COMMAND basic_example)
154-
set_tests_properties(basic_no_args_prints_help PROPERTIES PASS_REGULAR_EXPRESSION "Usage: app")
154+
set_tests_properties(basic_no_args_prints_help PROPERTIES PASS_REGULAR_EXPRESSION [==[^Usage: app \[command\] \[flags\]\r?
155+
]==])
155156

156157
add_test(NAME basic_persistent_flag_before_sub COMMAND basic_example --verbose print --message hi)
157-
set_tests_properties(basic_persistent_flag_before_sub PROPERTIES PASS_REGULAR_EXPRESSION "hi")
158+
set_tests_properties(basic_persistent_flag_before_sub PROPERTIES PASS_REGULAR_EXPRESSION [==[^hi\r?
159+
$]==])
158160

159161
add_test(NAME basic_short_group COMMAND basic_example -vq print --message hi)
160-
set_tests_properties(basic_short_group PROPERTIES PASS_REGULAR_EXPRESSION "hi")
162+
set_tests_properties(basic_short_group PROPERTIES PASS_REGULAR_EXPRESSION [==[^hi\r?
163+
$]==])
161164

162165
add_test(NAME basic_bool_negation COMMAND basic_example --no-verbose print --message hi)
163-
set_tests_properties(basic_bool_negation PROPERTIES PASS_REGULAR_EXPRESSION "hi")
166+
set_tests_properties(basic_bool_negation PROPERTIES PASS_REGULAR_EXPRESSION [==[^hi\r?
167+
$]==])
164168

165169
add_test(NAME basic_short_value_inline COMMAND basic_example print -mhi)
166-
set_tests_properties(basic_short_value_inline PROPERTIES PASS_REGULAR_EXPRESSION "hi")
170+
set_tests_properties(basic_short_value_inline PROPERTIES PASS_REGULAR_EXPRESSION [==[^hi\r?
171+
$]==])
167172

168173
add_test(NAME basic_short_value_eq COMMAND basic_example print -m=hi)
169-
set_tests_properties(basic_short_value_eq PROPERTIES PASS_REGULAR_EXPRESSION "hi")
174+
set_tests_properties(basic_short_value_eq PROPERTIES PASS_REGULAR_EXPRESSION [==[^hi\r?
175+
$]==])
170176

171177
add_test(NAME basic_end_of_flags COMMAND basic_example print -- --message hi)
172-
set_tests_properties(basic_end_of_flags PROPERTIES PASS_REGULAR_EXPRESSION "Hello, World!")
178+
set_tests_properties(basic_end_of_flags PROPERTIES PASS_REGULAR_EXPRESSION [==[^Hello, World!\r?
179+
$]==])
173180

174181
add_test(NAME basic_end_of_flags_preserves_before COMMAND basic_example print --message hi -- --message bye)
175-
set_tests_properties(basic_end_of_flags_preserves_before PROPERTIES PASS_REGULAR_EXPRESSION "hi")
182+
set_tests_properties(basic_end_of_flags_preserves_before PROPERTIES PASS_REGULAR_EXPRESSION [==[^hi\r?
183+
$]==])
176184

177185
add_test(NAME basic_alias COMMAND basic_example p --message hi)
178-
set_tests_properties(basic_alias PROPERTIES PASS_REGULAR_EXPRESSION "hi")
186+
set_tests_properties(basic_alias PROPERTIES PASS_REGULAR_EXPRESSION [==[^hi\r?
187+
$]==])
179188

180189
add_executable(args_example examples/args_example.cpp)
181190
target_link_libraries(args_example PRIVATE clasp)
182191

183192
add_test(NAME args_noargs_ok COMMAND args_example noargs)
184-
set_tests_properties(args_noargs_ok PROPERTIES PASS_REGULAR_EXPRESSION "ok")
193+
set_tests_properties(args_noargs_ok PROPERTIES PASS_REGULAR_EXPRESSION [==[^ok\r?
194+
$]==])
185195

186196
add_test(NAME args_noargs_fail_shows_usage COMMAND args_example noargs x)
187197
set_tests_properties(args_noargs_fail_shows_usage PROPERTIES PASS_REGULAR_EXPRESSION [==[^Error: accepts no arguments\r?
@@ -202,10 +212,12 @@ Usage: app range \[flags\]\r?
202212
]==])
203213

204214
add_test(NAME args_silence_usage_hides_usage COMMAND args_example silence_usage)
205-
set_tests_properties(args_silence_usage_hides_usage PROPERTIES PASS_REGULAR_EXPRESSION "Error: accepts 1 arg\\(s\\)" FAIL_REGULAR_EXPRESSION "Usage:")
215+
set_tests_properties(args_silence_usage_hides_usage PROPERTIES PASS_REGULAR_EXPRESSION [==[^Error: accepts 1 arg\(s\)\r?
216+
$]==] FAIL_REGULAR_EXPRESSION "Usage:")
206217

207218
add_test(NAME args_silence_errors_hides_error COMMAND args_example silence_errors)
208-
set_tests_properties(args_silence_errors_hides_error PROPERTIES PASS_REGULAR_EXPRESSION "Usage: app silence_errors" FAIL_REGULAR_EXPRESSION "Error:")
219+
set_tests_properties(args_silence_errors_hides_error PROPERTIES PASS_REGULAR_EXPRESSION [==[^Usage: app silence_errors \[flags\]\r?
220+
$]==] FAIL_REGULAR_EXPRESSION "Error:")
209221

210222
add_test(NAME basic_invalid_bool_eq COMMAND basic_example --verbose=maybe print --message hi)
211223
set_tests_properties(basic_invalid_bool_eq PROPERTIES PASS_REGULAR_EXPRESSION [==[^Error: invalid argument \"maybe\" for \"--verbose\"\r?
@@ -214,13 +226,16 @@ Usage: app print \[flags\]\r?
214226
]==])
215227

216228
add_test(NAME basic_disable_flag_parsing COMMAND basic_example raw --help --x -y)
217-
set_tests_properties(basic_disable_flag_parsing PROPERTIES PASS_REGULAR_EXPRESSION "--help --x -y")
229+
set_tests_properties(basic_disable_flag_parsing PROPERTIES PASS_REGULAR_EXPRESSION [==[^--help --x -y\r?
230+
$]==])
218231

219232
add_test(NAME basic_version_flag COMMAND basic_example --version)
220-
set_tests_properties(basic_version_flag PROPERTIES PASS_REGULAR_EXPRESSION "0.1.0")
233+
set_tests_properties(basic_version_flag PROPERTIES PASS_REGULAR_EXPRESSION [==[^0\.1\.0\r?
234+
$]==])
221235

222236
add_test(NAME basic_version_cmd COMMAND basic_example version)
223-
set_tests_properties(basic_version_cmd PROPERTIES PASS_REGULAR_EXPRESSION "0.1.0")
237+
set_tests_properties(basic_version_cmd PROPERTIES PASS_REGULAR_EXPRESSION [==[^0\.1\.0\r?
238+
$]==])
224239

225240
add_executable(hooks_example examples/hooks_example.cpp)
226241
target_link_libraries(hooks_example PRIVATE clasp)
@@ -232,10 +247,14 @@ add_executable(required_example examples/required_example.cpp)
232247
target_link_libraries(required_example PRIVATE clasp)
233248

234249
add_test(NAME required_missing COMMAND required_example do)
235-
set_tests_properties(required_missing PROPERTIES PASS_REGULAR_EXPRESSION "required flag not set.*Usage: app do")
250+
set_tests_properties(required_missing PROPERTIES PASS_REGULAR_EXPRESSION [==[^Error: required flag not set: --name\r?
251+
\r?
252+
Usage: app do \[flags\]\r?
253+
]==])
236254

237255
add_test(NAME required_ok COMMAND required_example do --name bob)
238-
set_tests_properties(required_ok PROPERTIES PASS_REGULAR_EXPRESSION "bob")
256+
set_tests_properties(required_ok PROPERTIES PASS_REGULAR_EXPRESSION [==[^bob\r?
257+
$]==])
239258

240259
add_test(NAME required_empty_value_ok COMMAND required_example do --name=)
241260

@@ -934,7 +953,7 @@ add_executable(silence_errors_example examples/silence_errors_example.cpp)
934953
target_link_libraries(silence_errors_example PRIVATE clasp)
935954

936955
add_test(NAME silence_errors_unknown_command COMMAND silence_errors_example nope)
937-
set_tests_properties(silence_errors_unknown_command PROPERTIES PASS_REGULAR_EXPRESSION ".*" FAIL_REGULAR_EXPRESSION "Error:|Run 'app")
956+
set_tests_properties(silence_errors_unknown_command PROPERTIES PASS_REGULAR_EXPRESSION ".*" FAIL_REGULAR_EXPRESSION [==[[[:space:]]|[[:graph:]]]==])
938957

939958
add_executable(map_example examples/map_example.cpp)
940959
target_link_libraries(map_example PRIVATE clasp)

include/clasp/command.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1879,12 +1879,13 @@ class Command {
18791879
}
18801880

18811881
int fail(std::string message, bool showUsage) const {
1882-
if (!silenceErrors_ && !message.empty()) {
1882+
const bool printedError = !silenceErrors_ && !message.empty();
1883+
if (printedError) {
18831884
err() << "Error: " << message;
18841885
if (message.back() != '\n') err() << "\n";
18851886
}
18861887
if (showUsage && !silenceUsage_) {
1887-
err() << "\n";
1888+
if (printedError) err() << "\n";
18881889
printUsageTo(err());
18891890
}
18901891
return 1;

0 commit comments

Comments
 (0)