Skip to content

Commit 4d00c9e

Browse files
committed
Merge branch 'shaosss-FlagsEnumSupport' by @shaosss into develop
2 parents 6caf728 + f35a8a6 commit 4d00c9e

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/CommandLine/Core/TypeConverter.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,20 @@ private static object ToEnum(this string value, Type conversionType, bool ignore
129129
{
130130
throw new FormatException();
131131
}
132-
if (Enum.IsDefined(conversionType, parsedValue))
132+
if (IsDefinedEx(parsedValue))
133133
{
134134
return parsedValue;
135135
}
136136
throw new FormatException();
137137
}
138+
139+
private static bool IsDefinedEx(object enumValue)
140+
{
141+
char firstChar = enumValue.ToString()[0];
142+
if (Char.IsDigit(firstChar) || firstChar == '-')
143+
return false;
144+
145+
return true;
146+
}
138147
}
139148
}

tests/CommandLine.Tests/Unit/Core/TypeConverterTests.cs

+20
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ enum TestEnum
1616
ValueB = 2
1717
}
1818

19+
[Flags]
20+
enum TestFlagEnum
21+
{
22+
ValueA = 0x1,
23+
ValueB = 0x2
24+
}
25+
1926
[Theory]
2027
[MemberData(nameof(ChangeType_scalars_source))]
2128
public void ChangeType_scalars(string testValue, Type destinationType, bool expectFail, object expectedResult)
@@ -104,6 +111,19 @@ public static IEnumerable<object[]> ChangeType_scalars_source
104111
new object[] {((int) TestEnum.ValueB + 1).ToString(), typeof (TestEnum), true, null},
105112
new object[] {((int) TestEnum.ValueA - 1).ToString(), typeof (TestEnum), true, null},
106113

114+
new object[] {"ValueA", typeof (TestFlagEnum), false, TestFlagEnum.ValueA},
115+
new object[] {"VALUEA", typeof (TestFlagEnum), false, TestFlagEnum.ValueA},
116+
new object[] {"ValueB", typeof(TestFlagEnum), false, TestFlagEnum.ValueB},
117+
new object[] {"ValueA,ValueB", typeof (TestFlagEnum), false, TestFlagEnum.ValueA | TestFlagEnum.ValueB},
118+
new object[] {"ValueA, ValueB", typeof (TestFlagEnum), false, TestFlagEnum.ValueA | TestFlagEnum.ValueB},
119+
new object[] {"VALUEA,ValueB", typeof (TestFlagEnum), false, TestFlagEnum.ValueA | TestFlagEnum.ValueB},
120+
new object[] {((int) TestFlagEnum.ValueA).ToString(), typeof (TestFlagEnum), false, TestFlagEnum.ValueA},
121+
new object[] {((int) TestFlagEnum.ValueB).ToString(), typeof (TestFlagEnum), false, TestFlagEnum.ValueB},
122+
new object[] {((int) (TestFlagEnum.ValueA | TestFlagEnum.ValueB)).ToString(), typeof (TestFlagEnum), false, TestFlagEnum.ValueA | TestFlagEnum.ValueB},
123+
new object[] {((int) TestFlagEnum.ValueB + 2).ToString(), typeof (TestFlagEnum), true, null},
124+
new object[] {((int) TestFlagEnum.ValueA - 1).ToString(), typeof (TestFlagEnum), true, null},
125+
126+
107127
// Failed before #339
108128
new object[] {"false", typeof (int), true, 0},
109129
new object[] {"true", typeof (int), true, 0}

0 commit comments

Comments
 (0)