changeset 1818:912b35b5bedd

Add alphabetical sorting to TreeCompleter Reviewed-by: jkang Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2015-June/014197.html PR2646
author Lukasz Dracz <ldracz@redhat.com>
date Wed, 24 Jun 2015 10:51:15 -0400
parents 1695efcce99d
children 2b7c06300955
files launcher/src/main/java/com/redhat/thermostat/launcher/internal/TabCompletion.java launcher/src/main/java/com/redhat/thermostat/launcher/internal/TreeCompleter.java launcher/src/test/java/com/redhat/thermostat/launcher/internal/TreeCompleterTest.java
diffstat 3 files changed, 137 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/launcher/src/main/java/com/redhat/thermostat/launcher/internal/TabCompletion.java	Tue Jun 23 10:46:29 2015 -0400
+++ b/launcher/src/main/java/com/redhat/thermostat/launcher/internal/TabCompletion.java	Wed Jun 24 10:51:15 2015 -0400
@@ -60,6 +60,8 @@
         }
 
         TreeCompleter treeCompleter = new TreeCompleter();
+        treeCompleter.setAlphabeticalCompletions(true);
+
         for (CommandInfo info : commandInfoSource.getCommandInfos()) {
 
             if (info.getEnvironments().contains(Environment.SHELL)) {
--- a/launcher/src/main/java/com/redhat/thermostat/launcher/internal/TreeCompleter.java	Tue Jun 23 10:46:29 2015 -0400
+++ b/launcher/src/main/java/com/redhat/thermostat/launcher/internal/TreeCompleter.java	Wed Jun 24 10:51:15 2015 -0400
@@ -43,6 +43,8 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
@@ -58,6 +60,7 @@
 
     private Node currentNode;
     private ArgumentList list;
+    private boolean alphabeticalSortingEnabled = false;
 
     public static final int NOT_FOUND = -1;
     private static final String EMPTY_SPACE = " ";
@@ -94,6 +97,21 @@
     }
 
     /**
+     * Sets whether the completions returned by the completer will be alphabetical
+     * @param completeAlphabetically true will result in alphabetically sorted completions
+     */
+    public void setAlphabeticalCompletions(boolean completeAlphabetically) {
+        alphabeticalSortingEnabled = completeAlphabetically;
+    }
+
+    /**
+     * @return whether the completer will be alphabetically sorted
+     */
+    public boolean isAlphabeticalSortingEnabled() {
+        return alphabeticalSortingEnabled;
+    }
+
+    /**
      * This method is called when attempting to tab complete
      * @param buffer the input that will be tab completed
      * @param cursorPosition the position of the cursorPosition within the buffer
@@ -133,9 +151,22 @@
             }
         }
 
+        if (alphabeticalSortingEnabled) {
+            inplaceSortAlphabetically(candidates);
+        }
+
         return position;
     }
 
+    private void inplaceSortAlphabetically(List<CharSequence> candidates) {
+        Collections.sort(candidates, new Comparator<CharSequence>() {
+            @Override
+            public int compare(final CharSequence t0, final CharSequence t1) {
+                return t0.toString().compareTo(t1.toString());
+            }
+        });
+    }
+
     private int getInlinedCursorPosition(final Completer completer, final List<CharSequence> candidates) {
         int cursor = completer.complete(list.getCursorArgument(), list.getArgumentPosition(), candidates);
         return cursor + list.getBufferPosition() - list.getArgumentPosition();
--- a/launcher/src/test/java/com/redhat/thermostat/launcher/internal/TreeCompleterTest.java	Tue Jun 23 10:46:29 2015 -0400
+++ b/launcher/src/test/java/com/redhat/thermostat/launcher/internal/TreeCompleterTest.java	Wed Jun 24 10:51:15 2015 -0400
@@ -333,6 +333,81 @@
         assertTrue(convertedCandidates.isEmpty());
     }
 
+    @Test
+    public void testAlphabeticalOrder() {
+        tree.setAlphabeticalCompletions(true);
+
+        List<String> output = completeBuffer("");
+
+        assertEquals(4, output.size());
+        assertTrue(output.get(0).equals("anotherCommand"));
+        assertTrue(output.get(1).equals("command1"));
+        assertTrue(output.get(2).equals("command2"));
+        assertTrue(output.get(3).equals("otherCommand"));
+    }
+
+    @Test
+    public void testAlphabeticalOrderForOptions() {
+        tree.setAlphabeticalCompletions(true);
+
+        List<String> output = completeBuffer("otherCommand list ");
+
+        assertEquals(5 ,output.size());
+        assertTrue(output.get(0).equals("assemblies"));
+        assertTrue(output.get(1).equals("bolts"));
+        assertTrue(output.get(2).equals("degreesOfFreedom"));
+        assertTrue(output.get(3).equals("parts"));
+        assertTrue(output.get(4).equals("tools"));
+    }
+
+    @Test
+    public void testAlphabeticalOrderNotSetToTrue() {
+        tree.setAlphabeticalCompletions(false);
+
+        List<String> output = completeBuffer("");
+
+        assertEquals(4 ,output.size());
+        assertFalse(output.get(0).equals("anotherCommand"));
+        assertFalse(output.get(1).equals("command1"));
+        assertFalse(output.get(2).equals("command2"));
+        assertFalse(output.get(3).equals("otherCommand"));
+    }
+
+    @Test
+    public void testAlphabeticalOrderForInlineOptions() {
+        tree.setAlphabeticalCompletions(true);
+
+        List<String> output = completeBuffer("anotherCommand grab dri");
+
+        assertEquals(12 ,output.size());
+        assertTrue(output.get(0).equals("drink-apple-juice"));
+        assertTrue(output.get(1).equals("drink-apple-soda"));
+        assertTrue(output.get(2).equals("drink-banana-juice"));
+        assertTrue(output.get(3).equals("drink-coke"));
+        assertTrue(output.get(4).equals("drink-fanta"));
+        assertTrue(output.get(5).equals("drink-grape-soda"));
+        assertTrue(output.get(6).equals("drink-orange-juice"));
+        assertTrue(output.get(7).equals("drink-pepsi"));
+        assertTrue(output.get(8).equals("drink-pepsi-diet"));
+        assertTrue(output.get(9).equals("drink-pepsi-lime"));
+        assertTrue(output.get(10).equals("drink-pepsi-vanilla"));
+        assertTrue(output.get(11).equals("drink-pepsi-zero"));
+    }
+
+    @Test
+    public void testAlphabeticalOrderForFurtherInlinedOptions() {
+        tree.setAlphabeticalCompletions(true);
+
+        List<String> output = completeBuffer("anotherCommand grab drink-pep");
+
+        assertEquals(5 ,output.size());
+        assertTrue(output.get(0).equals("drink-pepsi"));
+        assertTrue(output.get(1).equals("drink-pepsi-diet"));
+        assertTrue(output.get(2).equals("drink-pepsi-lime"));
+        assertTrue(output.get(3).equals("drink-pepsi-vanilla"));
+        assertTrue(output.get(4).equals("drink-pepsi-zero"));
+    }
+
     private List<String> completeBuffer(String buffer) {
         return completeBuffer(buffer, buffer.length());
     }
@@ -469,6 +544,35 @@
                 list.addBranch(twentyFifthToSeventyFifthPart);
             }
             anotherCommand.addBranch(list);
+
+            TreeCompleter.Node grab = createStringNode("grab");
+            {
+                TreeCompleter.Node pepsi = createStringNode("drink-pepsi");
+                TreeCompleter.Node coke = createStringNode("drink-coke");
+                TreeCompleter.Node fanta = createStringNode("drink-fanta");
+                TreeCompleter.Node apple = createStringNode("drink-apple-juice");
+                TreeCompleter.Node banana = createStringNode("drink-banana-juice");
+                TreeCompleter.Node orange = createStringNode("drink-orange-juice");
+                TreeCompleter.Node appleSoda = createStringNode("drink-apple-soda");
+                TreeCompleter.Node grapeSoda = createStringNode("drink-grape-soda");
+                TreeCompleter.Node pepsiZero = createStringNode("drink-pepsi-zero");
+                TreeCompleter.Node pepsiDiet = createStringNode("drink-pepsi-diet");
+                TreeCompleter.Node pepsiVanilla = createStringNode("drink-pepsi-vanilla");
+                TreeCompleter.Node pepsiLime = createStringNode("drink-pepsi-lime");
+                grab.addBranch(pepsi);
+                grab.addBranch(coke);
+                grab.addBranch(fanta);
+                grab.addBranch(apple);
+                grab.addBranch(banana);
+                grab.addBranch(orange);
+                grab.addBranch(appleSoda);
+                grab.addBranch(grapeSoda);
+                grab.addBranch(pepsiZero);
+                grab.addBranch(pepsiDiet);
+                grab.addBranch(pepsiVanilla);
+                grab.addBranch(pepsiLime);
+            }
+            anotherCommand.addBranch(grab);
         }
 
         commands.add(command1);