用Java编写参数系统

时间:2014-08-28 15:11:45

标签: java

我目前正在编写(或编写过)一个解析命令用法字符串并包含标志的系统,构建一个ParamsBase对象(ParamsBase类:http://pastebin.com/5eHTijDw)。

我对ParamsBase的创建没有任何问题 - 我已经对它进行了测试并且有效。下一步是我遇到问题。

我们假设我们将字符串/command subcommand <-f flag> <option1> [optional]解析为ParamsBase个对象。如果您阅读了代码,您就会知道这会生成具有以下属性的ParamsBase

长度:4(标志计为2,非参数参数不被考虑) 参数之前的参数:1(第一个参数之前有一个参数) 必需参数:3(&lt;&gt;表示必需,标志计为2) 可选参数:1([]表示可选)

我现在想将其解析为Params对象(来源:http://pastebin.com/jsXmqU1Z)。我们假设用户输入以下字符串作为命令:/command subcommand -f value off on

现在将调用createParams中的方法ParamsBase。你不必担心Arguments类的内容 - 为了我们的目的,它只是String[]的包装器 - getArgument(int,boolean)只返回元素[ String[]的int]。有效且invalidate等也无关紧要。

但我的createParams方法不起作用。根据给出的示例,我希望Params.get("option1")返回off,但它会返回on。在createParams方法中一定是个错误,这对某些人来说是显而易见的,但我有些困惑......

createParams

public Params createParams(Arguments args) {
    Map<String, Parameter> map= new HashMap<>();
    int curArgument = argsBeforeParams;
    int curParam = 0;
    while (true) {
        if (curArgument >= args.length() || curParam >= params.size()) {
            break;
        }

        map.put(info.getName(), new Parameter(args.getArgument(curArgument, true).get(), params.get(curParam)));
        curArgument++;
        curParam++;
    }

    return new Params(this, paramsMap);
}

我的测试代码:

final Arguments args = new Arguments(
        "subcommand", "-f", "value", "off", "on");
final ParamsBase paramsBase = ParamsBase.fromUsageString(
        "/command subcommand <-f flag> <option1> [optional]");
// Each flag counts as two arguments, hence 4 not 3
Assert.assertEquals("PB: Length", paramsBase.length(), 4);
// Each required flag counts as two required, hence 3 not 2
Assert.assertEquals("PB: Req", paramsBase.getAmountRequired(), 3);
Assert.assertEquals("PB: Opt", paramsBase.getAmountOptional(), 1);
Assert.assertEquals("PB: B4", 1, paramsBase.getArgsBeforeParams());
final Params params = args.withParams(
    paramsBase.createParams(args)).getParams();
// Fails - on instead of off is given
Assert.assertEquals("PAR: LKUP", params.get("option1").get(), "off");

0 个答案:

没有答案