Skip to content

Commit 2e491a2

Browse files
fix(ConsoleService): consume enum tokens in sequential command args (#1105)
Enum parameters were parsed from args[0] without removing the token. Sequential commands such as broadcast getdata TX <hash> then fed TX into UInt256.Parse. Co-authored-by: Shargon <shargon@gmail.com>
1 parent af69cb3 commit 2e491a2

2 files changed

Lines changed: 12 additions & 1 deletion

File tree

src/Neo.ConsoleService/ConsoleServiceBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ private bool TryProcessValue(Type parameterType, IList<CommandToken> args, bool
200200

201201
if (parameterType.IsEnum)
202202
{
203-
value = Enum.Parse(parameterType, args[0].Value, true);
203+
value = Enum.Parse(parameterType, consumeAll ? args.ConsumeAll() : args.Consume(), true);
204204
return true;
205205
}
206206
}

tests/Neo.ConsoleService.Tests/UT_CommandServiceBase.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ public void TestMethod(string strParam, uint intParam, bool boolParam, string op
2828
[ConsoleCommand("testenum", Category = "Test Commands")]
2929
public void TestEnumMethod(TestEnum enumParam) { }
3030

31+
[ConsoleCommand("testenumrest", Category = "Test Commands")]
32+
public void TestEnumThenString(TestEnum enumParam, string rest) { }
33+
3134
[ConsoleCommand("testversion", Category = "Test Commands")]
3235
public Version TestMethodVersion() { return new Version("1.0.0"); }
3336

@@ -133,6 +136,14 @@ public void TestParseSequentialArguments()
133136
Assert.HasCount(1, result3);
134137
Assert.AreEqual(TestConsoleService.TestEnum.Value1, result3[0]);
135138

139+
// Sequential enum must consume the token so later args parse.
140+
var enumRestMethod = typeof(TestConsoleService).GetMethod("TestEnumThenString");
141+
var argsEnumRest = "testenumrest Value2 leftover".Tokenize();
142+
var resultEnumRest = service.ParseSequentialArguments(enumRestMethod, argsEnumRest[1..].Trim());
143+
Assert.HasCount(2, resultEnumRest);
144+
Assert.AreEqual(TestConsoleService.TestEnum.Value2, resultEnumRest[0]);
145+
Assert.AreEqual("leftover", resultEnumRest[1]);
146+
136147
// Test case 4: Missing required parameter should throw exception
137148
var args4 = "test hello".Tokenize();
138149
Assert.ThrowsExactly<ArgumentException>(() => service.ParseSequentialArguments(method, args4[1..].Trim()));

0 commit comments

Comments
 (0)