1
- // Copyright (c) .NET Foundation and contributors. All rights reserved.
1
+ // Copyright (c) .NET Foundation and contributors. All rights reserved.
2
2
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
3
3
4
+ using System . CommandLine . Parsing ;
4
5
using FluentAssertions ;
5
6
using System . Linq ;
6
7
using System . Threading ;
@@ -75,15 +76,15 @@ public void Option_aliases_are_case_sensitive()
75
76
}
76
77
77
78
[ Fact ]
78
- public void Aliases_accepts_prefixed_short_value ( )
79
+ public void Aliases_contains_prefixed_short_value ( )
79
80
{
80
81
var option = new CliOption < string > ( "--option" , "-o" ) ;
81
82
82
83
option . Aliases . Contains ( "-o" ) . Should ( ) . BeTrue ( ) ;
83
84
}
84
85
85
86
[ Fact ]
86
- public void HasAlias_accepts_prefixed_long_value ( )
87
+ public void Aliases_contains_prefixed_long_value ( )
87
88
{
88
89
var option = new CliOption < string > ( "-o" , "--option" ) ;
89
90
@@ -202,30 +203,6 @@ public void When_options_use_different_prefixes_they_still_work(string prefix)
202
203
result . GetValue ( optionC ) . Should ( ) . Be ( "value-for-c" ) ;
203
204
}
204
205
205
- [ Fact ]
206
- public void When_option_not_explicitly_provides_help_will_use_default_help ( )
207
- {
208
- var option = new CliOption < string > ( "--option" , "-o" )
209
- {
210
- Description = "desc"
211
- } ;
212
-
213
- option . Name . Should ( ) . Be ( "--option" ) ;
214
- option . Description . Should ( ) . Be ( "desc" ) ;
215
- option . Hidden . Should ( ) . BeFalse ( ) ;
216
- }
217
-
218
- [ Fact ]
219
- public void Argument_retains_name_when_it_is_provided ( )
220
- {
221
- var option = new CliOption < string > ( "-alias" )
222
- {
223
- HelpName = "arg"
224
- } ;
225
-
226
- option . HelpName . Should ( ) . Be ( "arg" ) ;
227
- }
228
-
229
206
[ Fact ]
230
207
public void Option_T_default_value_can_be_set_via_the_constructor ( )
231
208
{
@@ -305,19 +282,7 @@ public void Option_of_string_defaults_to_null_when_not_specified()
305
282
. Should ( )
306
283
. BeNull ( ) ;
307
284
}
308
-
309
- [ Theory ]
310
- [ InlineData ( "-option value" ) ]
311
- [ InlineData ( "-option:value" ) ]
312
- public void When_aliases_overlap_the_longer_alias_is_chosen ( string parseInput )
313
- {
314
- var option = new CliOption < string > ( "-o" , "-option" ) ;
315
-
316
- var parseResult = new CliRootCommand { option } . Parse ( parseInput ) ;
317
-
318
- parseResult . GetValue ( option ) . Should ( ) . Be ( "value" ) ;
319
- }
320
-
285
+
321
286
[ Fact ]
322
287
public void Option_of_boolean_defaults_to_false_when_not_specified ( )
323
288
{
@@ -342,77 +307,110 @@ public void Option_of_enum_can_limit_enum_members_as_valid_values()
342
307
var result = new CliRootCommand { option } . Parse ( "--color Fuschia" ) ;
343
308
344
309
result . Errors
345
- . Select ( e => e . Message )
346
- . Should ( )
347
- . BeEquivalentTo ( new [ ] { $ "Argument 'Fuschia' not recognized. Must be one of:\n \t 'Red'\n \t 'Green'" } ) ;
310
+ . Select ( e => e . Message )
311
+ . Should ( )
312
+ . BeEquivalentTo ( new [ ] { $ "Argument 'Fuschia' not recognized. Must be one of:\n \t 'Red'\n \t 'Green'" } ) ;
348
313
}
349
314
350
315
[ Fact ]
351
- public void Every_option_can_provide_a_handler_and_it_takes_precedence_over_command_handler ( )
316
+ public void Option_result_provides_identifier_token_if_name_was_provided ( )
352
317
{
353
- OptionAction optionAction = new ( ) ;
354
- bool commandHandlerWasCalled = false ;
318
+ var option = new CliOption < int > ( "--name" )
319
+ {
320
+ Aliases = { "-n" }
321
+ } ;
322
+
323
+ var result = new CliRootCommand { option } . Parse ( "--name 123" ) ;
355
324
356
- CliOption < bool > option = new ( "--test" )
325
+ result . FindResultFor ( option ) . IdentifierToken . Value . Should ( ) . Be ( "--name" ) ;
326
+ }
327
+
328
+ [ Fact ]
329
+ public void Option_result_provides_identifier_token_if_alias_was_provided ( )
330
+ {
331
+ var option = new CliOption < int > ( "--name" )
357
332
{
358
- Action = optionAction ,
333
+ Aliases = { "-n" }
359
334
} ;
360
- CliCommand command = new CliCommand ( "cmd" )
335
+
336
+ var result = new CliRootCommand { option } . Parse ( "-n 123" ) ;
337
+
338
+ result . FindResultFor ( option ) . IdentifierToken . Value . Should ( ) . Be ( "-n" ) ;
339
+ }
340
+
341
+ [ Theory ]
342
+ [ InlineData ( "--name 123" , 1 ) ]
343
+ [ InlineData ( "--name 123 --name 456" , 2 ) ]
344
+ [ InlineData ( "-n 123 --name 456" , 2 ) ]
345
+ [ InlineData ( "--name 123 -x different-option --name 456" , 2 ) ]
346
+ public void Number_of_occurrences_of_identifier_token_is_exposed_by_option_result ( string commandLine , int expectedCount )
347
+ {
348
+ var option = new CliOption < int > ( "--name" )
361
349
{
362
- option
350
+ Aliases = { "-n" }
363
351
} ;
364
- command . SetAction ( ( _ ) =>
352
+
353
+ var root = new CliRootCommand
365
354
{
366
- commandHandlerWasCalled = true ;
367
- } ) ;
355
+ option ,
356
+ new CliOption < string > ( "-x" )
357
+ } ;
368
358
369
- ParseResult parseResult = command . Parse ( "cmd --test true" ) ;
359
+ var optionResult = root . Parse ( commandLine ) . FindResultFor ( option ) ;
370
360
371
- parseResult . Action . Should ( ) . NotBeNull ( ) ;
372
- optionAction . WasCalled . Should ( ) . BeFalse ( ) ;
373
- commandHandlerWasCalled . Should ( ) . BeFalse ( ) ;
361
+ optionResult . IdentifierTokenCount . Should ( ) . Be ( expectedCount ) ;
362
+ }
374
363
375
- parseResult . Invoke ( ) . Should ( ) . Be ( 0 ) ;
376
- optionAction . WasCalled . Should ( ) . BeTrue ( ) ;
377
- commandHandlerWasCalled . Should ( ) . BeFalse ( ) ;
364
+ [ Fact ]
365
+ public void Multiple_identifier_token_instances_without_argument_tokens_can_be_parsed ( )
366
+ {
367
+ var option = new CliOption < bool > ( "-v" ) ;
368
+
369
+ var root = new CliRootCommand
370
+ {
371
+ option
372
+ } ;
373
+
374
+ var result = root . Parse ( "-v -v -v" ) ;
375
+
376
+ result . GetValue ( option ) . Should ( ) . BeTrue ( ) ;
378
377
}
379
378
380
- internal sealed class OptionAction : CliAction
379
+ [ Fact ]
380
+ public void Multiple_bundled_identifier_token_instances_without_argument_tokens_can_be_parsed ( )
381
381
{
382
- internal bool WasCalled = false ;
382
+ var option = new CliOption < bool > ( "-v" ) ;
383
383
384
- public override int Invoke ( ParseResult context )
384
+ var root = new CliRootCommand
385
385
{
386
- WasCalled = true ;
387
- return 0 ;
388
- }
386
+ option
387
+ } ;
388
+
389
+ var result = root . Parse ( "-vvv" ) ;
389
390
390
- public override Task < int > InvokeAsync ( ParseResult context , CancellationToken cancellationToken = default )
391
- => Task . FromResult ( Invoke ( context ) ) ;
391
+ result . GetValue ( option ) . Should ( ) . BeTrue ( ) ;
392
392
}
393
393
394
- [ Fact ]
395
- public void When_multiple_options_with_handlers_are_parsed_only_the_last_one_is_effective ( )
394
+ [ Theory ] // https://github.com/dotnet/command-line-api/issues/669
395
+ [ InlineData ( "-vvv" ) ]
396
+ [ InlineData ( "-v -v -v" ) ]
397
+ public void Custom_parser_can_be_used_to_implement_int_binding_based_on_token_count ( string commandLine )
396
398
{
397
- OptionAction optionAction1 = new ( ) ;
398
- OptionAction optionAction2 = new ( ) ;
399
- OptionAction optionAction3 = new ( ) ;
400
-
401
- CliCommand command = new CliCommand ( "cmd" )
399
+ var option = new CliOption < int > ( "-v" )
402
400
{
403
- new CliOption < bool > ( "--1" ) { Action = optionAction1 } ,
404
- new CliOption < bool > ( "--2" ) { Action = optionAction2 } ,
405
- new CliOption < bool > ( "--3" ) { Action = optionAction3 }
401
+ Arity = ArgumentArity . Zero ,
402
+ AllowMultipleArgumentsPerToken = true ,
403
+ CustomParser = argumentResult => ( ( OptionResult ) argumentResult . Parent ) . IdentifierTokenCount ,
406
404
} ;
407
405
408
- ParseResult parseResult = command . Parse ( "cmd --1 true --3 false --2 true " ) ;
406
+ var root = new CliRootCommand
407
+ {
408
+ option
409
+ } ;
409
410
410
- parseResult . Action . Should ( ) . Be ( optionAction2 ) ;
411
+ var result = root . Parse ( commandLine ) ;
411
412
412
- parseResult . Invoke ( ) . Should ( ) . Be ( 0 ) ;
413
- optionAction1 . WasCalled . Should ( ) . BeFalse ( ) ;
414
- optionAction2 . WasCalled . Should ( ) . BeTrue ( ) ;
415
- optionAction3 . WasCalled . Should ( ) . BeFalse ( ) ;
413
+ result . GetValue ( option ) . Should ( ) . Be ( 3 ) ;
416
414
}
417
415
}
418
416
}
0 commit comments