Skip to content

Commit de6f3a8

Browse files
committed
+ Added specialType for respresent paramneter with range in class CommandLineRange
1 parent 56a702f commit de6f3a8

File tree

4 files changed

+112
-2
lines changed

4 files changed

+112
-2
lines changed

src/FlowCommandLine/FlowCommandLine.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<PackageTags>command,line,commandline,command-line,parse,parser,parsing,shell</PackageTags>
1717
<PackageLicenseFile>LICENSE</PackageLicenseFile>
1818
<PackageReadmeFile>README.md</PackageReadmeFile>
19-
<Version>1.0.6.0</Version>
19+
<Version>1.0.7.0</Version>
2020
<IsTrimmable>true</IsTrimmable>
2121
<PublishTrimmed>true</PublishTrimmed>
2222
<PackageReleaseNotes>

src/FlowCommandLine/FlowPropertyMapper.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Globalization;
1+
using FlowCommandLine.SpecialTypes;
2+
using System.Globalization;
23
using System.Reflection;
34
using System.Text;
45

@@ -143,6 +144,12 @@ public static bool SetPropertyValue<T> ( Type type, Dictionary<string, string> v
143144
isChanged = true;
144145
}
145146
break;
147+
case Type _ when type == typeof ( CommandLineRange<int> ):
148+
if ( values.ContainsKey ( parameterKey ) ) {
149+
property.SetValue ( model, MapRangeIntCollections ( values[parameterKey] ) );
150+
isChanged = true;
151+
}
152+
break;
146153
default:
147154
Console.WriteLine ( $"Property {property.Name} with type {property.PropertyType.FullName} inside class {type.Name} not supported!" );
148155
break;
@@ -281,6 +288,27 @@ private static List<string> MapStringCollections ( string value ) {
281288
}
282289
}
283290

291+
private static CommandLineRange<int> MapRangeIntCollections ( string value ) {
292+
if ( !value.Contains ( '-' ) ) return new CommandLineRange<int> ();
293+
294+
var parts = value
295+
.Split ( '-' )
296+
.Select (
297+
a => {
298+
if ( int.TryParse ( a, out var int32value ) ) return int32value;
299+
300+
return 0;
301+
}
302+
)
303+
.ToList ();
304+
if ( parts.Count () < 2 ) return new CommandLineRange<int> ();
305+
306+
return new CommandLineRange<int> {
307+
Start = parts.First (),
308+
End = parts.ElementAt ( 1 ),
309+
};
310+
}
311+
284312
}
285313

286314
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace FlowCommandLine.SpecialTypes {
2+
3+
/// <summary>
4+
/// Range
5+
/// </summary>
6+
/// <typeparam name="T"></typeparam>
7+
public class CommandLineRange<T> where T: struct {
8+
9+
public T Start { get; set; }
10+
11+
public T End { get; set; }
12+
13+
}
14+
15+
}

src/FlowCommandLineTests/CommandLineUnitTests.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using FakeItEasy;
22
using FlowCommandLine;
3+
using FlowCommandLine.SpecialTypes;
34

45
namespace FlowCommandLineTests {
56

@@ -938,6 +939,72 @@ public void RunOptions_Success_BooleanParameter_AsFalse_NotFilled () {
938939
Assert.Equal ( "Muhaha", result.Parameter3 );
939940
}
940941

942+
public record RunOptions_Success_RangeIntParameter_Completed_Class {
943+
944+
public CommandLineRange<int> Parameter1 { get; set; } = new CommandLineRange<int> ();
945+
946+
}
947+
948+
[Fact]
949+
public void RunOptions_Success_RangeIntParameter_Completed () {
950+
//arrange
951+
var messages = new List<string> ();
952+
var fakeProvider = A.Fake<ICommandLineProvider> ();
953+
A.CallTo ( () => fakeProvider.GetCommandLine () ).Returns ( "--parameter1=1-100" );
954+
A.CallTo ( () => fakeProvider.WriteLine ( A<string>._ ) ).Invokes ( ( string fake ) => { messages.Add ( fake ); } );
955+
var commandLine = new CommandLine ( fakeProvider );
956+
957+
//act
958+
var result = commandLine
959+
.Application ( "TestApplication", "1.0.0" )
960+
.AddOption ( fullName: "Parameter1" )
961+
.RunOptions<RunOptions_Success_RangeIntParameter_Completed_Class> ();
962+
963+
//assert
964+
Assert.NotNull ( result );
965+
Assert.Equal ( 1, result.Parameter1.Start );
966+
Assert.Equal ( 100, result.Parameter1.End );
967+
}
968+
969+
public record RunOptions_Success_RangeIntParameter_NotParsed_Class {
970+
971+
public CommandLineRange<int> Parameter1 { get; set; } = new CommandLineRange<int> ();
972+
973+
public CommandLineRange<int> Parameter2 { get; set; } = new CommandLineRange<int> ();
974+
975+
public CommandLineRange<int> Parameter3 { get; set; } = new CommandLineRange<int> ();
976+
977+
public CommandLineRange<int> Parameter4 { get; set; } = new CommandLineRange<int> ();
978+
979+
}
980+
981+
[Fact]
982+
public void RunOptions_Success_RangeIntParameter_NotParsed () {
983+
//arrange
984+
var messages = new List<string> ();
985+
var fakeProvider = A.Fake<ICommandLineProvider> ();
986+
A.CallTo ( () => fakeProvider.GetCommandLine () ).Returns ( "--parameter1=1 --parameter2=- --parameter3=-100 --parameter4=1-" );
987+
A.CallTo ( () => fakeProvider.WriteLine ( A<string>._ ) ).Invokes ( ( string fake ) => { messages.Add ( fake ); } );
988+
var commandLine = new CommandLine ( fakeProvider );
989+
990+
//act
991+
var result = commandLine
992+
.Application ( "TestApplication", "1.0.0" )
993+
.AddOption ( fullName: "Parameter1" )
994+
.RunOptions<RunOptions_Success_RangeIntParameter_NotParsed_Class> ();
995+
996+
//assert
997+
Assert.NotNull ( result );
998+
Assert.Equal ( 0, result.Parameter1.Start );
999+
Assert.Equal ( 0, result.Parameter1.End );
1000+
Assert.Equal ( 0, result.Parameter2.Start );
1001+
Assert.Equal ( 0, result.Parameter2.End );
1002+
Assert.Equal ( 0, result.Parameter3.Start );
1003+
Assert.Equal ( 0, result.Parameter3.End );
1004+
Assert.Equal ( 0, result.Parameter4.Start );
1005+
Assert.Equal ( 0, result.Parameter4.End );
1006+
}
1007+
9411008
public class DatabaseAdjustments {
9421009

9431010
public IEnumerable<string> Files { get; set; } = Enumerable.Empty<string> ();

0 commit comments

Comments
 (0)