Skip to content

How to test parseArgument #2262

Open
Open
@SimonCropp

Description

@SimonCropp

So given

var myOptions = new Option<string[]>(
    name: "--my",
    description: "items",
    parseArgument: ParseMyItems);

and

internal static string[] ParseMyItems(ArgumentResult result)
{
    //manipulate/validate/parse items
    return result.Values();
}

I want to test ParseMyItems. so i need to be able to create an instance of ArgumentResult. but the constructor is internal

internal ArgumentResult(
    Argument argument,
    SymbolResult? parent) : base(argument, parent)
{
    Argument = argument;
}

So how do i get an instance of ArgumentResult.

Currently i have this hack:

public static class ArgumentBuilder
{
    static Func<string[], ArgumentResult> construct;

    static ArgumentBuilder()
    {
        var tokensField = typeof(ArgumentResult).GetField("_tokens", BindingFlags.NonPublic | BindingFlags.Instance)!;
        var constructor = typeof(ArgumentResult).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)
            .Single();
        construct = inputs =>
        {
            var invoke = constructor.Invoke(
                new object?[]
                {
                    new Argument<string[]>(_ => inputs),
                    null
                })!;
            var result = (ArgumentResult) invoke;
            var tokens = (List<Token>) tokensField.GetValue(result)!;
            tokens.AddRange(inputs.Select(_ => new Token(_, TokenType.Argument, null!)));
            return result;
        };
    }

    public static ArgumentResult Build(params string[] values) =>
        construct(values);
}

then i can do

var argument = ArgumentBuilder.Build("value1", "value2");
ParseMyItems(argument)

but there must be a better way

Metadata

Metadata

Assignees

No one assigned

    Labels

    Area-APIquestionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions