o CommandObjectSettingsSet.cpp:

  Fix a bug where "settings set -r th" wouldn't complete.

o UserSettingsController.cpp:

  Fix a bug where "settings set target.process." wouldn't complete.

o test/functionalities/completion:

  Add various completion test cases related to 'settings set' command.


git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@148596 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/functionalities/completion/TestCompletion.py b/test/functionalities/completion/TestCompletion.py
new file mode 100644
index 0000000..a6d2ce6
--- /dev/null
+++ b/test/functionalities/completion/TestCompletion.py
@@ -0,0 +1,116 @@
+"""
+Test the lldb command line completion mechanism.
+"""
+
+import os
+import unittest2
+import lldb
+import pexpect
+from lldbtest import *
+
+class CommandLineCompletionTestCase(TestBase):
+
+    mydir = os.path.join("functionalities", "completion")
+
+    @classmethod
+    def classCleanup(cls):
+        """Cleanup the test byproducts."""
+        system(["/bin/sh", "-c", "rm -f child_send.txt"])
+        system(["/bin/sh", "-c", "rm -f child_read.txt"])
+
+    def test_settings_s(self):
+        """Test that 'settings s' completes to ['Available completions:', 'set', 'show']."""
+        self.complete_from_to('settings s', ['Available completions:', 'set', 'show'])
+
+    def test_settings_set_th(self):
+        """Test that 'settings set th' completes to 'settings set thread-format'."""
+        self.complete_from_to('settings set th', 'settings set thread-format')
+
+    def test_settings_s_dash(self):
+        """Test that 'settings set -' completes to ['Available completions:', '-n', '-r']."""
+        self.complete_from_to('settings set -', ['Available completions:', '-n', '-r'])
+
+    def test_settings_set_dash_r_th(self):
+        """Test that 'settings set -r th' completes to 'settings set -r thread-format'."""
+        self.complete_from_to('settings set -r th', 'settings set -r thread-format')
+
+    def test_settings_set_ta(self):
+        """Test that 'settings set ta' completes to 'settings set target.'."""
+        self.complete_from_to('settings set ta', 'settings set target.')
+
+    def test_settings_set_target_pr(self):
+        """Test that 'settings set target.pr' completes to ['Available completions:',
+        'target.prefer-dynamic-value', 'target.process.']."""
+        self.complete_from_to('settings set target.pr',
+                              ['Available completions:',
+                               'target.prefer-dynamic-value',
+                               'target.process.'])
+
+    def test_settings_set_target_process(self):
+        """Test that 'settings set target.process' completes to 'settings set target.process.'."""
+        self.complete_from_to('settings set target.process', 'settings set target.process.')
+
+    def test_settings_set_target_process_dot(self):
+        """Test that 'settings set target.process.' completes to 'settings set target.process.thread.'."""
+        self.complete_from_to('settings set target.process.', 'settings set target.process.thread.')
+
+    def test_settings_set_target_process_thread_dot(self):
+        """Test that 'settings set target.process.thread.' completes to ['Available completions:',
+        'target.process.thread.step-avoid-regexp', 'target.process.thread.trace-thread']."""
+        self.complete_from_to('settings set target.process.thread.',
+                              ['Available completions:',
+                               'target.process.thread.step-avoid-regexp',
+                               'target.process.thread.trace-thread'])
+
+    def complete_from_to(self, str_before, patterns):
+        """Test the completion mechanism completes str_before to pattern, where
+        patterns could be a pattern-string or a list of pattern-strings"""
+        prompt = "(lldb) "
+        add_prompt = "Enter your stop hook command(s).  Type 'DONE' to end.\r\n> "
+        add_prompt1 = "\r\n> "
+
+        # So that the child gets torn down after the test.
+        self.child = pexpect.spawn('%s %s' % (self.lldbHere, self.lldbOption))
+        child = self.child
+        # Turn on logging for input/output to/from the child.
+        with open('child_send.txt', 'w') as f_send:
+            with open('child_read.txt', 'w') as f_read:
+                child.logfile_send = f_send
+                child.logfile_read = f_read
+
+                # Test that str_before completes to str_after.
+                child.expect_exact(prompt)
+                child.setecho(True)
+                child.send("%s\t" % str_before)
+                #child.expect_exact("%s\t" % str_after)
+                child.sendline('')
+                child.expect_exact(prompt)
+
+        with open('child_send.txt', 'r') as fs:
+            if self.TraceOn():
+                print "\n\nContents of child_send.txt:"
+                print fs.read()
+        with open('child_read.txt', 'r') as fr:
+            from_child = fr.read()
+            if self.TraceOn():
+                print "\n\nContents of child_read.txt:"
+                print from_child
+
+            self.assertFalse(patterns is None)
+            if type(patterns) is not types.ListType:
+                patterns = [patterns]
+
+            # If each pattern matches from_child, the completion mechanism works!
+            for p in patterns:
+                self.expect(from_child, msg=COMPLETIOND_MSG(str_before, p), exe=False,
+                    patterns = [p])
+
+        child.logfile_send = None
+        child.logfile_read = None
+        
+
+if __name__ == '__main__':
+    import atexit
+    lldb.SBDebugger.Initialize()
+    atexit.register(lambda: lldb.SBDebugger.Terminate())
+    unittest2.main()