From 50dd54ceb7ffa1791368beb7bdea4ac1386c24d0 Mon Sep 17 00:00:00 2001 From: Philip Crotwell Date: Thu, 30 May 2024 16:27:42 -0400 Subject: [PATCH 1/5] add test for sorting synopsis within ArgGroup --- src/test/java/picocli/HelpTest.java | 95 +++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/src/test/java/picocli/HelpTest.java b/src/test/java/picocli/HelpTest.java index 9f3686868..cab69e262 100644 --- a/src/test/java/picocli/HelpTest.java +++ b/src/test/java/picocli/HelpTest.java @@ -1339,6 +1339,101 @@ class App { assertEquals(expectedUsage, new CommandLine(new App()).getUsageMessage()); } + + @Test + public void testSortWithOptionsAsSetters() throws Exception { + @Command(name = "OS") + class App { + @Option(names = {"--ob"}) boolean c; + @Option(names = {"--ow"}) public void setW(boolean b){}; + @Option(names = {"--ox"}) public void setX(boolean b){}; + @Option(names = {"--oy"}) public void setY(boolean b){}; + @Option(names = {"--oz"}) public void setZ(boolean b){}; + @Option(names = {"--oa"}) boolean a; + @Option(names = {"--oc"}) boolean b; + } + + String expectedSynopsis = "OS [--oa] [--ob] [--oc] [--ow] [--ox] [--oy] [--oz]"; + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + } + + @Test + public void testSortWithArgGroupAsSetters() throws Exception { + + class MySetterArgGroup { + @Option(names = {"-w"}, order = 5) public void setW(boolean b){}; + @Option(names = {"-x"}, order = 6) public void setX(boolean b){}; + @Option(names = {"-y"}, order = 7) public void setY(boolean b){}; + @Option(names = {"-z"}, order = 8) public void setZ(boolean b){}; + @Option(names = {"-s"}, order = 1) public void setS(boolean b){}; + @Option(names = {"-t"}, order = 2) public void setT(boolean b){}; + @Option(names = {"-u"}, order = 3) public void setU(boolean b){}; + @Option(names = {"-v"}, order = 4) public void setV(boolean b){}; + } + @Command(name = "SS") + class App { + @Option(names = {"-b"}) boolean c; + @Option(names = {"-a"}) boolean a; + @Option(names = {"-c"}) boolean b; + @ArgGroup(exclusive=false, multiplicity = "1", heading = "setter arg%n") + MySetterArgGroup mySAG = new MySetterArgGroup(); + } + + String expectedSynopsis = "SS [-abc] ([-s] [-t] [-u] [-v] [-w] [-x] [-y] [-z])"; + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + + } + + @Test + public void testSortWithArgGroupAsSettersWithOrder() throws Exception { + + class MySetterArgGroup { + @Option(names = {"-w"}, order = 5) public void setW(boolean b){}; + @Option(names = {"-x"}, order = 6) public void setX(boolean b){}; + @Option(names = {"-y"}, order = 7) public void setY(boolean b){}; + @Option(names = {"-z"}, order = 8) public void setZ(boolean b){}; + @Option(names = {"-s"}, order = 1) public void setS(boolean b){}; + @Option(names = {"-t"}, order = 2) public void setT(boolean b){}; + @Option(names = {"-u"}, order = 3) public void setU(boolean b){}; + @Option(names = {"-v"}, order = 4) public void setV(boolean b){}; + } + @Command(name = "AGO") + class App { + @Option(names = {"-b"}) boolean c; + @Option(names = {"-a"}) boolean a; + @Option(names = {"-c"}) boolean b; + @ArgGroup(exclusive=false, multiplicity = "1", heading = "setter arg%n") + MySetterArgGroup mySAG = new MySetterArgGroup(); + } + + String expectedSynopsis = "AGO [-abc] ([-s] [-t] [-u] [-v] [-w] [-x] [-y] [-z])"; + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + } + + @Test + public void testSortWithArgGroupAsFields() throws Exception { + + class MyValueArgGroup { + @Option(names = {"-p"}) boolean p; + @Option(names = {"-m"}) boolean m; + @Option(names = {"-o"}) boolean o; + @Option(names = {"-n"}) boolean n; + } + @Command(name = "FF") + class App { + + @Option(names = {"--ab"}) boolean c; + @Option(names = {"--aa"}) boolean a; + @Option(names = {"--ac"}) boolean b; + @ArgGroup(exclusive=false, multiplicity = "1", heading = "value arg%n") + MyValueArgGroup myAG = new MyValueArgGroup(); + } + + String expectedSynopsis = "FF [-abc] ([-m] [-n] [-o] [-p])"; + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + + } + @Test public void testSortSynopsisByOptionOrderAllowsGaps() throws Exception { @Command(sortOptions = false, sortSynopsis = false) From 60aeb6398396ab3750018cfd808bfb5dbaf21b91 Mon Sep 17 00:00:00 2001 From: Philip Crotwell Date: Thu, 30 May 2024 16:39:34 -0400 Subject: [PATCH 2/5] fix test case, newlines at end of string and double-dash options --- src/test/java/picocli/HelpTest.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/java/picocli/HelpTest.java b/src/test/java/picocli/HelpTest.java index cab69e262..f8f9357ab 100644 --- a/src/test/java/picocli/HelpTest.java +++ b/src/test/java/picocli/HelpTest.java @@ -1354,7 +1354,7 @@ class App { } String expectedSynopsis = "OS [--oa] [--ob] [--oc] [--ow] [--ox] [--oy] [--oz]"; - assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0).trim()); } @Test @@ -1380,7 +1380,7 @@ class App { } String expectedSynopsis = "SS [-abc] ([-s] [-t] [-u] [-v] [-w] [-x] [-y] [-z])"; - assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0).trim()); } @@ -1407,7 +1407,7 @@ class App { } String expectedSynopsis = "AGO [-abc] ([-s] [-t] [-u] [-v] [-w] [-x] [-y] [-z])"; - assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0).trim()); } @Test @@ -1422,15 +1422,15 @@ class MyValueArgGroup { @Command(name = "FF") class App { - @Option(names = {"--ab"}) boolean c; - @Option(names = {"--aa"}) boolean a; - @Option(names = {"--ac"}) boolean b; + @Option(names = {"-b"}) boolean c; + @Option(names = {"-a"}) boolean a; + @Option(names = {"-c"}) boolean b; @ArgGroup(exclusive=false, multiplicity = "1", heading = "value arg%n") MyValueArgGroup myAG = new MyValueArgGroup(); } String expectedSynopsis = "FF [-abc] ([-m] [-n] [-o] [-p])"; - assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0)); + assertEquals(expectedSynopsis, new CommandLine(new App()).getHelp().synopsis(0).trim()); } From d66036f60de14a4ee9a7376fc6ecfa5bbb001103 Mon Sep 17 00:00:00 2001 From: Philip Crotwell Date: Thu, 30 May 2024 16:43:44 -0400 Subject: [PATCH 3/5] sort options inside ArgGroup alphabetical in synopsis --- src/main/java/picocli/CommandLine.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/picocli/CommandLine.java b/src/main/java/picocli/CommandLine.java index 87de0855b..1c0986503 100644 --- a/src/main/java/picocli/CommandLine.java +++ b/src/main/java/picocli/CommandLine.java @@ -10669,7 +10669,19 @@ private Text rawSynopsisUnitText(Help.ColorScheme colorScheme, Set outp outparam_groupArgs.add(positional); } } else { + + List sortableComponents = new ArrayList<>(); + List remainder = new ArrayList(); for (ArgSpec arg : args()) { + if (arg instanceof OptionSpec) { + sortableComponents.add((OptionSpec) arg); + } else { + remainder.add((PositionalParamSpec) arg); + } + } + Collections.sort(sortableComponents, new Help.SortByOptionArityAndNameAlphabetically()); + + for (ArgSpec arg : sortableComponents) { String prefix = synopsis.length > 0 ? infix : ""; if (arg instanceof OptionSpec) { synopsis = concatOptionText(prefix, synopsis, colorScheme, (OptionSpec) arg); @@ -10678,6 +10690,10 @@ private Text rawSynopsisUnitText(Help.ColorScheme colorScheme, Set outp } outparam_groupArgs.add(arg); } + for (PositionalParamSpec pps : remainder) { + String prefix = synopsis.length > 0 ? infix : ""; + synopsis = concatPositionalText(prefix, synopsis, colorScheme, pps); + } for (ArgGroupSpec subgroup : subgroups()) { if (synopsis.length > 0) { synopsis = synopsis.concat(infix); } synopsis = synopsis.concat(subgroup.synopsisText(colorScheme, outparam_groupArgs)); From a6673e340c227708f70f1d4dbcb1ce0c17dd2fa4 Mon Sep 17 00:00:00 2001 From: Philip Crotwell Date: Thu, 30 May 2024 16:56:22 -0400 Subject: [PATCH 4/5] fix ArrayList for old java --- src/main/java/picocli/CommandLine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/picocli/CommandLine.java b/src/main/java/picocli/CommandLine.java index 1c0986503..73d7da501 100644 --- a/src/main/java/picocli/CommandLine.java +++ b/src/main/java/picocli/CommandLine.java @@ -10670,7 +10670,7 @@ private Text rawSynopsisUnitText(Help.ColorScheme colorScheme, Set outp } } else { - List sortableComponents = new ArrayList<>(); + List sortableComponents = new ArrayList(); List remainder = new ArrayList(); for (ArgSpec arg : args()) { if (arg instanceof OptionSpec) { From ee6dbb4db0a29b47794bc9a839b11785b8605a51 Mon Sep 17 00:00:00 2001 From: Philip Crotwell Date: Thu, 30 May 2024 17:03:54 -0400 Subject: [PATCH 5/5] missed pos param in outparam --- src/main/java/picocli/CommandLine.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/picocli/CommandLine.java b/src/main/java/picocli/CommandLine.java index 73d7da501..a2355bed8 100644 --- a/src/main/java/picocli/CommandLine.java +++ b/src/main/java/picocli/CommandLine.java @@ -10683,16 +10683,13 @@ private Text rawSynopsisUnitText(Help.ColorScheme colorScheme, Set outp for (ArgSpec arg : sortableComponents) { String prefix = synopsis.length > 0 ? infix : ""; - if (arg instanceof OptionSpec) { - synopsis = concatOptionText(prefix, synopsis, colorScheme, (OptionSpec) arg); - } else { - synopsis = concatPositionalText(prefix, synopsis, colorScheme, (PositionalParamSpec) arg); - } + synopsis = concatOptionText(prefix, synopsis, colorScheme, (OptionSpec) arg); outparam_groupArgs.add(arg); } - for (PositionalParamSpec pps : remainder) { + for (PositionalParamSpec positional : remainder) { String prefix = synopsis.length > 0 ? infix : ""; - synopsis = concatPositionalText(prefix, synopsis, colorScheme, pps); + synopsis = concatPositionalText(prefix, synopsis, colorScheme, positional); outparam_groupArgs.add(positional); + outparam_groupArgs.add(positional); } for (ArgGroupSpec subgroup : subgroups()) { if (synopsis.length > 0) { synopsis = synopsis.concat(infix); }